대화형 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
하고 계속 사용 하고 수집 할 수 있습니다 .read
select
표준 출력은 한 프로그램의 일반적인 출력이며 이상적으로는 번거로움이나 복잡함 없이 다른 프로그램의 표준 입력으로 파이프될 수 있습니다.
curl
예를 들어, 다운로드 진행 상황이 stdout이 아닌 stderr에 표시되는 이유이기도 합니다 curl http://www.example.com/path/to/file > file
. 콘텐츠를 표시할 수만 있고 따라서 리디렉션은 stderr를 사용하여 표시됩니다.file
file
답변2
전체 셸을 리디렉션하는 stderr을 사용하면 exec
전체 셸에 영향을 미칩니다.
exec
리디렉션을 사용하여 전체 stderr을 리디렉션 할 수 없거나 다음과 같이 호출해야 합니다.
read .... 2> /dev/tty
관련 내장 함수가 stderr에 대해 읽을 수 있는 출력을 생성하도록 합니다.