Bash 쉘에서 스트림 리디렉션 - 나머지 쉘 명령줄에서 무조건 설정하는 방법

Bash 쉘에서 스트림 리디렉션 - 나머지 쉘 명령줄에서 무조건 설정하는 방법

aptBash 셸에서 단독으로 실행될 때와 출력이 파일로 리디렉션될 때 출력이 다르다는 것을 확인했습니다 .

예를 들어:

$ apt install ./*.deb --simulate 1>111.txt 2>222.txt

스트림 2의 파일에 리디렉션 결과 텍스트를 추가하고 WARNING: apt does not have a stable CLI interface. Use with caution in scripts.리디렉션 없이 apt를 실행하면 이 텍스트가 셸 창에 표시되지 않습니다.

출력이 리디렉션에 의존하는 이유는 무엇입니까? apt매개변수로 리디렉션을 고려해 보세요 . 쉘 명령줄의 다른 부분이 눈에 띄지 않도록 리디렉션을 어떻게 작성합니까?

PS 우분투 18에서 봤는데 특정 애플리케이션에 관한 문제였지만 문제는 Unix에 일반적일 수도 있으므로 그냥 태그에 apt넣었습니다 .shell

답변1

apt역사적으로 대화형 명령줄 사용을 염두에 두고 설계된 인코딩 경고는 셸 apt이 아닌 셸 내에서 의도적으로 수행됩니다.

그러나 apt명령줄을 구문 분석할 필요는 없습니다. 셸이 호출될 때 이미 이 작업을 수행합니다 apt. 수행 되는 작업은 스트림이 변경/리디렉션되었는지 apt감지하는 것입니다 .stdout

스크립트에서 사용 하는 경우 거의 동일한 작업을 수행하고 리디렉션에 대해 경고하지 않는 apt유사한 이전 명령이 있습니다 .apt-getstdout

TLDR 오류 메시지를 작성하는 것은 쉘이 아니라 명령 stderr입니다 .apt

셸에서 출력을 캡처 할 수 있다는 사실은 apt stderr멀티태스킹 운영 체제인 Unix의 산물이며 해당 출력을 생성하는 것이 셸이라는 의미는 아닙니다.

추신. 명령에 대해 strace를 실행하면 apt메시지가 기록되는 것을 볼 수 있습니다.

strace apt get install bash > a
....
write(2, "\n", 1
)                       = 1
write(2, "WARNING: ", 9WARNING: )                = 9
write(2, "apt", 3apt)                      = 3
write(2, " ", 1 )                        = 1
write(2, "does not have a stable CLI inter"..., 38does not have a stable CLI interface. ) = 38
write(2, "Use with caution in scripts.", 28Use with caution in scripts.) = 28
write(2, "\n", 1
)                       = 1
write(2, "\n", 1
)                       = 1

답변2

"쉘 명령줄의 다른 부분이 눈에 띄지 않도록 리디렉션을 어떻게 작성합니까?"

아무것도 할 필요가 없습니다. 경고는 stdErr에 있습니다. 이 시도:

apt list adghdgd | grep .
2>/dev/null apt list adghdgd | grep .

배포판이 기본적으로 grep 색상 지정으로 설정된 경우 실제로 grep에 들어가는 부분에 색상이 지정되어 있음을 알 수 있습니다. 두 번째 형식에서는 stdErr이 완전히 억제됩니다.

Grep도 다르게 동작합니다. 비교해 보세요.

echo hello | grep .
echo hello | grep . | cat

두 번째 양식은 grep이 stdOut이 터미널이 아니라 파이프임을 확인하기 때문에 색상이 지정되지 않았습니다. 그/그녀는 어떻게 알 수 있나요? ? ? ?

비교하다

ls -l /proc/self/fd/1
( ls -l /proc/self/fd/1 ) | cat

첫 번째 형식에서 stdOut은 tty/pts입니다. 두 번째는 파이프라인이다.

관련 정보