Stderr 리디렉션은 또한 일부 BASH 내장 명령을 실수로 리디렉션합니다.

Stderr 리디렉션은 또한 일부 BASH 내장 명령을 실수로 리디렉션합니다.

대화형 BASH 스크립트를 실행하는 사용자로부터 모든 stderr을 숨기려고 하지만 로그 파일에 오류를 남겨 둡니다. 그러나 간단한 stderr 리디렉션은 예기치 않게 다음으로 이동해야 하는 BASH 출력 중 일부를 숨깁니다.표준 출력대신에. 두 시스템에서 이것을 시도했지만 동일한 결과를 얻었습니다.GNU bash, 버전 4.1.2(1)-릴리스(x86_64-redhat-linux-gnu)다른 하나는 MacOS X에 있습니다).

나는 이것이 exec쉘 변경으로 인해 발생할 수 있다고 항상 의심했지만... 다른 내장( times)은 예상대로 작동하고 다음과 같이 출력합니다.표준 출력!

한 가지 예:

#!/bin/bash

exec 2>>file_log

echo This will be printed to stdout, as expected

ls ThereIsNoSuchFileOnEarth # this will go to “file_log”, as expected

read –p 'User would never see this prompt and it would go to file_log. Totally unexpected.' –r -e test

species=”Daleks Raxacoricofallapatorians Judoon”

select enemy in $species;
do
     # …code omitted as the user would never see the list. It would go into file_log again!
done

답변1

read및 님 의 팁select 해야한다실제 프롬프트가 아닌 사용자 상호 작용에 대한 프롬프트일 수 있으므로 표준 오류로 이동하세요.산출. 이를 통해 실제 출력을 "오염"시키지 않고 사용자 로부터 정보를 실행 tool.sh > tool.out하고 계속 사용 하고 수집 할 수 있습니다 .readselect

표준 출력은 한 프로그램의 일반적인 출력이며 이상적으로는 번거로움이나 복잡함 없이 다른 프로그램의 표준 입력으로 파이프될 수 있습니다.

curl예를 들어, 다운로드 진행 상황이 stdout이 아닌 stderr에 표시되는 이유이기도 합니다 curl http://www.example.com/path/to/file > file. 콘텐츠를 표시할 수만 있고 따라서 리디렉션은 stderr를 사용하여 표시됩니다.filefile

답변2

전체 셸을 리디렉션하는 stderr을 사용하면 exec전체 셸에 영향을 미칩니다.

exec리디렉션을 사용하여 전체 stderr을 리디렉션 할 수 없거나 다음과 같이 호출해야 합니다.

read .... 2> /dev/tty

관련 내장 함수가 stderr에 대해 읽을 수 있는 출력을 생성하도록 합니다.

관련 정보