|& 파이프 이해

|& 파이프 이해

배쉬 매뉴얼에서https://www.gnu.org/software/bash/manual/html_node/Pipelines.html 그것은 다음과 같이 말합니다:

|&' '를 사용 하면 의 표준 오류가 command1표준 출력 외에 command2표준 입력으로 파이프 됩니다 2>&1 |.

커뮤니티에 대한 나의 질문은 그것이 실제로 무엇을 의미하는지입니다. 왜 아무것도 하지 않는다고 생각하는지 보여주기 위해 테스트를 했습니다.

여기서는 작동하는 루프를 만들었고 마지막 줄에 오류가 발생했습니다.

items="frog cat"
for item in $items
do 
echo $item
done

for item i will make error this line

따라서 매뉴얼에서 암시하는 바는 |&를 사용하지 않는 한 stderr은 다음 명령으로 파이프되기 때문에 stdout으로 출력되지 않는다는 것입니다. 그래서 테스트해봤습니다:

## this shows a regular pipe without &.  As you can see stderr gets written anyway
$ ./testing.sh  | grep error
./testing.sh: line 7: syntax error near unexpected token `i'
./testing.sh: line 7: `for item i will make error this line'

## this shows a pipe with |& in it.  
$ ./testing.sh  |& grep error
./testing.sh: line 7: syntax error near unexpected token `i'
./testing.sh: line 7: `for item i will make error this line'

예, stderror는 어쨌든 다음 파이프 명령에 기록됩니다 &|. 그렇다면 그 요점은 무엇입니까 |&?

답변1

stderr은 "어쨌든 다음 파이프 명령에 쓰기"가 아니며 기본적으로 터미널에 들어가는 stderr에 기록됩니다.

Bash 참조 매뉴얼은 다음과 같이 말합니다:

의 약자입니다 2>&1 |. 표준 오류를 표준 출력으로 암시적으로 리디렉션하는 것은 command1에 의해 지정된 리디렉션 후에 수행됩니다.

이는 stderr이 파이프를 통해 전송되기 전에 stdout으로 리디렉션된다는 의미입니다.

$ cat stderr.sh
#!/usr/bin/env bash


echo 'This is an error' >&2
echo 'This is not'

이를 실행하면 stdout 및 stderr에 출력이 표시됩니다.

$ ./stderr.sh
This is an error # This is displayed on stderr
This is not # this is displayed on stdout

stdout을 리디렉션하면 /dev/nullstderr만 표시됩니다.

$ ./stderr.sh >/dev/null
This is an error

마찬가지로 stderr를 stdout으로 리디렉션하면 /dev/null다음만 표시됩니다.

$ ./stderr.sh 2>/dev/null
This is not

여기서는 이 sed 명령을 사용하여 파이프를 통과하는 방법을 더 자세히 설명할 수 있습니다.

$ ./stderr.sh | sed 's/^/Via the pipe: /'
This is an error
Via the pipe: This is not

$ ./stderr.sh |& sed 's/^/Via the pipe: /'
Via the pipe: This is an error
Via the pipe: This is not

첫 번째 예에서는 오류가 Via the pipe:파이프를 통해 이동하지 않기 때문에 오류 앞에 붙지 않습니다. 이는 두 번째 예에서도 마찬가지입니다.

관련 정보