programing

bash에서 &>는 무엇을 합니까?

skycolor 2023. 5. 2. 22:32
반응형

bash에서 &>는 무엇을 합니까?

왜 했습니다.1내 디렉토리에서 커밋을 수행한 후.

git status 2&>1 > /dev/null

저는 그 의도가 다음과 같은 것을 작성하기 위한 것이라고 생각하고 수정했습니다.

git status 2>&1 > /dev/null

하지만 아래 구문이 정확히 무엇을 하는지 궁금해서 man 페이지를 찾아보았습니다.

git status 2&>1

여기 man 페이지가 있습니다.

  Redirecting Standard Output and Standard Error
      This  construct allows both the standard output (file descriptor 1) and
      the standard error output (file descriptor 2) to be redirected  to  the
      file whose name is the expansion of word.

      There  are  two  formats  for  redirecting standard output and standard
      error:

             &>word
      and
             >&word

      Of the two forms, the first is preferred.  This is semantically equiva‐
      lent to

             >word 2>&1

그러나 이 man 페이지는 둘이 동등하다는 것을 암시하고 있어 그렇지 않은 것 같습니다.

누가 man 페이지를 명확하게 하고 이 구문에서 정확히 무슨 일이 일어나고 있는지 설명할 수 있습니까?

여기서 사용하는 연산자는 다음과 같습니다.

  • >구문: file_descriptoropt > file_name
  • >&구문: file_descriptoropt >&
  • &> 구문:&> file_name

은 " " " 입니다.0의 경우 (stdin) 입력의 경우1 outputstdout)는 다음과 같습니다. 2stderr을 합니다.

다음과 같은 이점이 있습니다.

  • >name은 단입니다.1>name을 stdout .name
  • &>name는 것과 같은1>name 2>name 및 을 stdout 로 .name (계속해서)name한 만 열 수 있습니다. 한번 열다니립만다를 말입니다. 실제로 작성한 경우1>name 2>name열려고 할 것입니다.name두 번(아마도 오작동)

그래서 당신이 글을 쓸 때git status 2&>1그러므로 그것은 입니다.git status 2 1>1 2>1를 들어, 예를 들어, 예를 들어,

  • 번째 1파운드2는 에대 주실받집니다여아들제로로에 됩니다.git status.
  • 은 stdout이라는 이름의 .1 1이 (파일 설명자 1이 아님)
  • 은 stderr이라는 이름의 로 리디렉션됩니다.1

이 이명은실다같파생합니라는 합니다.1은 의결로의 로서.git status 2 즉, 호된파라는 2는 아마도 커밋할 를 정리했습니다라고 하는 할 때입니다.라고 하는 파일을 실제로 추적하지 않는다고 가정할 때2.

&>word)>&word둘 다 .stdout그리고.stderr 경우는 파일입니다.1.

2>&1stderr 2으로 (의 2) 재 현 값 로 으stdout(fd 1). (재연결하기 전에 이 작업을 수행합니다.stdout줄의 뒷부분에서 출력을 결합하는 대신 출력을 분할하며 이는 매우 일반적인 셸 스크립팅 오류입니다.을 이 비 교 값 과와 대조해 .>word 2>&1두 개의 fd를 하나의 동일한 위치로 전송하는 것으로 결합합니다.)

$ { echo stdout; echo stderr >&2; }
stdout
stderr
$ { echo stdout; echo stderr >&2; } >/dev/null
stderr
$ { echo stdout; echo stderr >&2; } >/dev/null 2>&1
$ 
{ echo stdout; echo stderr >&2; } 2>&1 >/dev/null
stderr

비슷한 모양이지만 같은 것은 아닙니다.

git status 2&>1 > /dev/null실로실중다니입행제를 운영하고 있습니다.git status 2의방을바어꾸의 &>1(stdout그리고.stderr를 제출하다1 거의 확실히 의도된 것이 아닙니다.당신의 수정은 거의 확실히 의도된 것입니다.

$ git init repro
Initialized empty Git repository in /tmp/repro/.git/
$ cd repro/
$ git status
# On branch master
#
# Initial commit
#
nothing to commit
$ ls
$ git status 2>&1
# On branch master
#
# Initial commit
#
nothing to commit
$ ls
$ git status 2&>1
$ ls
1
$ cat 1
# On branch master
#
# Initial commit
#
nothing to commit

bash의 리디렉션에 대한 모든 정보

가 입니까?&>? 로십하까니?

잘못부대서는해에 git status 2&>1 > /dev/null...

누가 man 페이지를 명확하게 하고 이 구문에서 정확히 무슨 일이 일어나고 있는지 설명할 수 있습니까?

그래, 할 수 있어.저는 또한 다양한 행동과 bash 구문의 일부를 이해하려고 노력하고 있습니다. 따라서 함께 더 잘 이해하기 위해 문제의 문장과 몇 가지 예를 살펴보도록 하겠습니다.

빠른 요약

  1. 문제의 홀수/오류 구문의 전체 의미를 이해하려는 경우: git status 2&>1 > /dev/null아래 섹션 1로 바로 이동합니다.
  2. 질문 자체의 제목을 기준으로 "Bash에서 &>가 수행하는 작업"을 선택한 경우 아래 섹션 2로 바로 이동합니다.
  3. bash에서 stderr을 stdout으로 리디렉션하는 등 적절한 리디렉션 사용에 대한 빠른 참조 요약을 원하는 경우2>&1 "stdout"을 통해 .>file또는1>file stderr을 통해 2>file또는 다음을 통해 stdout 및 stderr을 모두 파일로 리디렉션합니다.&>file또는>file 2>&1아래 섹션 3을 보세요: "3.bash"의 올바른 리디렉션 요약입니다.
  4. 리디렉션의 이상한 사용, 중복 사용, 재정의 또는 비표준 사용에 대한 bash 지식을 테스트하려면 아래 섹션 4를 참조하십시오.

git status 2&>1 > /dev/null

성명서에서

git status 2&>1 > /dev/null

이렇게 발생하는 3개의 분리된 부분이 있습니다(특히, 이것은 직관적이지도 않고 명백하지도 않지만, 특히 그것 사이에 공간이 없다는 것을 고려할 때).2그리고.&>12&>1):

git status 2    # statement 1
&>1             # statement 2
> /dev/null     # statement 3

그러나 다음과 같은 내용이 있으면 위의 내용과 매우 다릅니다.이에 대한 자세한 내용은 다음 답변을 참조하십시오.

# separates into **two separate statements**: `2` and `&>1`
2&>1  # `2` is NOT part of `&>1`

# these are all **single statements**, but mean very different things (more on
# these below)
2>&1
2>1
  1. 진술서 1(git status 2 ) 행실git status 2.여기서,2는 에전된 변니입다수매로 변수입니다.git status옵션이 에, 유한옵아때문에기니이,git status는 경로로 가정하며, 경로는 파일 또는 디렉토리일 수 있습니다.는 git라는 이름의 합니다.2 또이름지디정내파모라는 이름의 내의 2.~하듯이man git status나와 . 경로를 더입니다. 경로를 지정하는 더 나은 방법은 경로에서 옵션을 분리하는 것입니다.--다음과 같이:

    git status -- 2  # 2 is a file or folder here
    

    분명히, 그것은 당신이 하려는 것이 아닙니다.:)

  2. 2(&>1 및 을 ( ) stdout .1 :) 은것또한분하려것는아이닙다니그당신이이명히▁:)▁this그. :)&>file은 모든 및 을 "stdout " stderr"로 리디렉션합니다.file에 대한 자세한 내용은 여기에서 온라인으로 bash 매뉴얼을 참조하거나 다음을 실행하여 확인할 수 있습니다.man bash및 "표준 출력 리디렉션 및 표준 오류" 섹션을 검색합니다.매뉴얼의 이 섹션은 나중에 자세히 살펴보겠습니다.

    :&>1((으)로 2&>1문: --두개 별의개진술의진::2그리고.&>1질문에서)와 동일한 구문 또는 개념이 아닙니다.2>&1.후자,2>&1.2 descriptor (stderr) 파일 이름1는 다음과 같습니다stdout).

    1. 0=stdin
    2. 1=stdout
    3. 2=stderr
  3. 진술서 3 (> /dev/null여기서부터 까다로워지기 시작합니다.이것은 또한 공간 없이 쓰여질 수 있습니다.>/dev/null 설명자 stdout(stdout))을 .1로 이동 »/dev/nullLinux 유사 파일 - 작성된 출력을 삭제합니다.>/dev/null 일히니다치합확▁다▁to와 정확히 일치합니다.1>/dev/null파일 설명자(stdout)는 bash 매뉴얼에 명시된 대로 지정되지 않은 경우 기본 옵션으로 암시됩니다.자세한 내용은 여기에서 bash 매뉴얼의 "출력 리디렉션" 섹션을 참조하십시오.

    여기서는 두 가지 이유로 까다로워지기 시작합니다.

    1. 첫번째로,1는 두 것을 합니다: 두가지다 의미다니합을것른▁in다▁means▁two니.&>1하나는 "1"이라는 이름의 파일입니다.이것은 사용자 측의 실수일 가능성이 높지만, 그것이 바로 그것입니다.>/dev/null다음과 같이 암시된 1이 있습니다.1>/dev/null그리고 그것은 파일 설명자 1을 가리키는데, 그것은.stdout.
    2. 둘째, 리디렉션 오버라이드가 진행되고 마지막 하나가 고착되기 때문에 까다롭습니다. &>1stdout 및 stderr을 모두 "1"이라는 이름의 파일로 리디렉션하지만1>/dev/null그런 다음 stdout을 "/dev/dll" 파일로 리디렉션합니다.는 stdout 후자리디전자재최로종결므과하는정의를은션의입니다.stderr이고 "1"인 .stdout. "/dev/dev" 파일입니다.과 같이 수도 : 이는다음수있습도니다될록기이같과다▁this니있:습▁have수▁also.
      # redirect stderr to a file named "1", and redirect stdout to the file
      # named "/dev/null" to discard it.
      2>1 1>/dev/null
      
      # same thing
      &>1 > /dev/null
      

더 위의내더하용은많것설요명습겠니다로이므는구하명을설은▁the다니습설겠명하▁soation's▁is▁explain것▁inform▁for▁aboveation▁let.&>bash에서 수행하는

의 제목을 " does 이질제 언목중무는급이하엇: "을의문이"&>"바쉬로?"

@Casey Jones가 여기서 (바로) 삭제된 답변에서 암시했듯이, bash 매뉴얼이 가장 잘 설명한다고 생각합니다. https://www.gnu.org/software/bash/manual/bash.html#Redirecting-Standard-Output-and-Standard-Error

이를 통해 다음 4가지 구문이 모두 거의 동일하다는 것을 알게 되었습니다. 첫 번째 구문은 두 번째 구문에 권장되며 세 번째 구문은 bash 외부에서 이를 수행하는 보다 보편적인 방법입니다.

# 4 ways in bash to redirect both stdout and stderr to `file`

# 1. recommended in bash
# Think of the `&` symbol here as meaning "1 AND 2", since it redirects
# both stdout (file descriptor 1) AND stderr (file descriptor 2) to `file`
&>file
# 2. works, but `file` may NOT expand to a number or to `-`. 
>&file

# 3. the universal way to do it in or outside of bash: first redirect stdout to
# file, and then redirect stderr to stdout
>file 2>&1
# 4. exact same as 3 above
1>file 2>&1

그렇게,&>file의미는 "두 가지 모두를 포함합니다. stdout 그리고. stderrfile."

설명서의 문구는 다음과 같습니다.

3.6.4 표준 출력 및 표준 오류 리디렉션

이 구성을 사용하면 표준 출력(파일 설명자 1)과 표준 오류 출력(파일 설명자 2)을 모두 이름이 단어 확장인 파일로 리디렉션할 수 있습니다.

표준 출력과 표준 오류를 리디렉션하는 두 가지 형식이 있습니다.

&>word

그리고.

>&word

두 가지 형태 중 첫 번째 형태가 선호됩니다.이는 의미론적으로 다음과 같습니다.

>word 2>&1

두 번째 양식을 사용할 는 숫자나 '-'로 단어를 확장할 수 없습니다.이 경우 다른 리디렉션 연산자가 호환성을 위해 적용됩니다(아래 파일 설명자 복제 참조).

bash의 올바른 리디렉션 요약

파일 설명자 알림:

  1. 0=stdin
  2. 1=stdout
  3. 2=stderr

적절한 사용 구문을 사용해야 합니다.

# 1. file descriptor redirection

# redirect stderr to stdout
2>&1
# redirect stdout to stderr
1>&2


# 2. redirection to a file

# 2.A. redirect stdout to `file`
>file
1>file  # (same thing; the 1 is implied above)

# 2.B. redirect stderr to `file`
2>file

# 2.C. redirect BOTH stdout and stderr to `file` (4 ways)
# Think of the `&` symbol in this 1st example as meaning "1 AND 2", since it 
# redirects both stdout (file descriptor 1) AND stderr (file descriptor 2)
# to `file`
&>file       # recommended in bash      <===
>&file       # not recommended
>file 2>&1   # universal and fine       <===
1>file 2>&1  # exact same as just above <===

예:

# print "hey 2 " to stdout.
# - Note: the `"%s "` format specifier gets applied to each input argument
#   thereafter. So, calling `printf "%s " "hello" "world"` is as though you had
#   called `printf "%s %s " "hello" "world"`.
printf "%s " "hey" 2

# redirect stdout to `file`; "file" now contains "hey 2 "
printf "%s " "hey" 2 >file
printf "%s " "hey" 2 1>file  # (same thing)

# redirect stderr to `file`; "file" remains empty since no stderr was printed
printf "%s " "hey" 2 2>file

# redirect BOTH stdout and stderr to `file`
printf "%s " "hey" 2 &>file
printf "%s " "hey" 2&>file        # don't do this! (same thing in this case, 
                                  # but looks awkward without the space before 
                                  # the `&`)
printf "%s " "hey" 2 >file 2>&1   # (same thing)
printf "%s " "hey" 2 1>file 2>&1  # (same thing)

"퍼즐"로 제시하고 이해도를 가르치고 테스트하는 "이상한" 예

# print "hey 2 " to stdout, redirecting stdout to a file named "1", then to "2",
# then to "3", then to "4", then to "5". Ultimately, `>5` overrides all
# previous stdout redirections, resulting in 5 files being created
# (named "1", "2", "3", "4", and "5"), with **only file "5"** containing
# the "hey 2 " text, and all other files being empty. Read the contents of all 
# files all at once with `grep '' *`.
printf "%s " "hey" 2 >1 >2 >3 >4 >5
# OR, exact same thing:
printf "%s " "hey" 2 1>1 1>2 1>3 1>4 1>5

# read the contents of all files so you can see that only file "5" above has
# "hey 2 " in it
grep '' *

# print "hey " to a file named "5", while also creating empty files
# named "1", "2", "3", and "4". Note: `21>1` is a bit nonsensical in this case.
# It redirects file descriptor 21 to a file named "1". That doesn't really do
# anything. All the redirections thereafter redirect file descriptor 1 (stdout)
# to a file with a number for a name, as specified. 
printf "%s " "hey" 21>1 1>2 1>3 1>4 1>5

# print "hey " to a file named "5", while creating empty files
# named "1", "2", "3", and "4". stderr gets redirected to the file named "1",
# but it also ends up empty since no stderr output was produced by this command.
printf "%s " "hey" 2>1 1>2 1>3 1>4 1>5

# Print some error output to a file named "1", since stderr gets redirected to
# it. Stdout gets ultimately redirected to a file named "5", but no stdout
# output is printed since `--invalid_arg` is not a valid argument. The stderr
# error message printed to the file named "1" is:
#       bash: printf: --: invalid option
#       printf: usage: printf [-v var] format [arguments]
printf --invalid_arg "%s " "hey" 2>1 1>2 1>3 1>4 1>5

# print "hey 2 " to a file named "5", while also creating empty files
# named "1", "2", "3", and "4". Initially, both stdout and stderr get
# redirected to the file named "1", via `&>1`, but then the stdout redirection
# gets overridden repeatedly until the last one that "sticks" is the stdout
# redirection to the file named "5" via `1>5`.
printf "%s " "hey" 2 &>1 1>2 1>3 1>4 1>5
printf "%s " "hey" 2&>1 1>2 1>3 1>4 1>5     # (same as above, but even more
                                            # awkward-looking)
printf "%s " "hey" 2&>1 >2 >3 >4 >5         # (same as above)
printf "%s " "hey" 2 &>1 >2 >3 >4 >5        # (same as above)
printf "%s " "hey" 2 >1 2>&1 >2 >3 >4 >5    # (same as above)
printf "%s " "hey" 2 1>1 2>&1 >2 >3 >4 >5   # (same as above; reminder: `1>1` 
        # redirects stdout (file descriptor 1) to a file named "1", whereas
        # `2>&1` redirects stderr (file descriptor 2) to stdout 
        # (file descriptor 1); make sure you understand that by now)

# (NOT the same as above! See this example & description previously a few
# examples up)
printf "%s " "hey" 2>1 1>2 1>3 1>4 1>5

답변에서 2in 2>&1에서 git status에 대한 입력으로 2를 리디렉션하는 부분이 잘못되었다고 생각합니다.

보고서에서 "git status"를 입력하면 "git status 2"와 다른 응답이 나타납니다.전자는 추적되지 않은 파일을 나열할 것입니다.

"git status 2&>1"은 stdo에 대한 "git status" 출력을 생성하고 빈 파일 1을 생성합니다. 여기서 1&2는 오류가 발생할 경우 리디렉션됩니다.nongit repo로 발행 시 확인됨, 2건의 오류가 기록됨.

언급URL : https://stackoverflow.com/questions/24793069/what-does-do-in-bash

반응형