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)는 다음과 같습니다. 2
stderr을 합니다.
다음과 같은 이점이 있습니다.
>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>&1
stderr
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 구문의 일부를 이해하려고 노력하고 있습니다. 따라서 함께 더 잘 이해하기 위해 문제의 문장과 몇 가지 예를 살펴보도록 하겠습니다.
빠른 요약
- 문제의 홀수/오류 구문의 전체 의미를 이해하려는 경우:
git status 2&>1 > /dev/null
아래 섹션 1로 바로 이동합니다. - 질문 자체의 제목을 기준으로 "Bash에서 &>가 수행하는 작업"을 선택한 경우 아래 섹션 2로 바로 이동합니다.
- bash에서 stderr을 stdout으로 리디렉션하는 등 적절한 리디렉션 사용에 대한 빠른 참조 요약을 원하는 경우
2>&1
"stdout"을 통해 .>file
또는1>file
stderr을 통해2>file
또는 다음을 통해 stdout 및 stderr을 모두 파일로 리디렉션합니다.&>file
또는>file 2>&1
아래 섹션 3을 보세요: "3.bash"의 올바른 리디렉션 요약입니다. - 리디렉션의 이상한 사용, 중복 사용, 재정의 또는 비표준 사용에 대한 bash 지식을 테스트하려면 아래 섹션 4를 참조하십시오.
git status 2&>1 > /dev/null
성명서에서
git status 2&>1 > /dev/null
이렇게 발생하는 3개의 분리된 부분이 있습니다(특히, 이것은 직관적이지도 않고 명백하지도 않지만, 특히 그것 사이에 공간이 없다는 것을 고려할 때).2
그리고.&>1
2&>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(
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(
&>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).0
=stdin
1
=stdout
2
=stderr
진술서 3 (
> /dev/null
여기서부터 까다로워지기 시작합니다.이것은 또한 공간 없이 쓰여질 수 있습니다.>/dev/null
설명자 stdout(stdout))을 .1
로 이동 »/dev/null
Linux 유사 파일 - 작성된 출력을 삭제합니다. 기>/dev/null
일히니다치합확▁다▁to와 정확히 일치합니다.1>/dev/null
파일 설명자(stdout)는 bash 매뉴얼에 명시된 대로 지정되지 않은 경우 기본 옵션으로 암시됩니다.자세한 내용은 여기에서 bash 매뉴얼의 "출력 리디렉션" 섹션을 참조하십시오.여기서는 두 가지 이유로 까다로워지기 시작합니다.
- 첫번째로,
1
는 두 것을 합니다: 두가지다 의미다니합을것른▁in다▁means▁two니.&>1
하나는 "1"이라는 이름의 파일입니다.이것은 사용자 측의 실수일 가능성이 높지만, 그것이 바로 그것입니다.인>/dev/null
다음과 같이 암시된 1이 있습니다.1>/dev/null
그리고 그것은 파일 설명자 1을 가리키는데, 그것은.stdout
. - 둘째, 리디렉션 오버라이드가 진행되고 마지막 하나가 고착되기 때문에 까다롭습니다.
&>1
stdout 및 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
그리고. stderr
file
."
설명서의 문구는 다음과 같습니다.
3.6.4 표준 출력 및 표준 오류 리디렉션
이 구성을 사용하면 표준 출력(파일 설명자 1)과 표준 오류 출력(파일 설명자 2)을 모두 이름이 단어 확장인 파일로 리디렉션할 수 있습니다.
표준 출력과 표준 오류를 리디렉션하는 두 가지 형식이 있습니다.
&>word
그리고.
>&word
두 가지 형태 중 첫 번째 형태가 선호됩니다.이는 의미론적으로 다음과 같습니다.
>word 2>&1
두 번째 양식을 사용할 때는 숫자나 '-'로 단어를 확장할 수 없습니다.이 경우 다른 리디렉션 연산자가 호환성을 위해 적용됩니다(아래 파일 설명자 복제 참조).
bash의 올바른 리디렉션 요약
파일 설명자 알림:
0
=stdin
1
=stdout
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
'programing' 카테고리의 다른 글
WPF 텍스트 상자의 다중 회선 (0) | 2023.05.07 |
---|---|
pip을 사용하여 Windows에 PyQt4를 설치하는 방법은 무엇입니까? (0) | 2023.05.02 |
보다 더 좋은 것.NET 리플렉터? (0) | 2023.05.02 |
git 디렉토리의 모든 확장자 파일 무시 (0) | 2023.05.02 |
Postgres에서 키워드와 유사한 열 이름 이스케이프 (0) | 2023.05.02 |