POSIX 쉘 스크립트가 대화형으로 실행되고 있는지 확인하고 싶지만 어떤 이유로 다음 기능이 수행되는지 확인하고 싶습니다.
running_interactively()
{
printf '%s' ${-} | grep -F i > /dev/null 2>&1
}
터미널에서 스크립트를 실행해도 false가 반환됩니다. 내가 뭔가 잘못하고 있는 걸까요, 아니면 터미널에서 사용자가 스크립트를 실행한다는 단순한 생각과 대화형 스크립팅의 정의가 다른 걸까요?
코드 세그먼트:
#!/bin/sh
set -u
running_interactively()
{
# echo $- returns only u
printf '%s' ${-} | grep i > /dev/null 2>&1
}
print_error_and_exit()
{
# redirect all output from this function to standard error stream
if running_interactively
then
exec >&2
else
echo wrong again, smart ass
fi
...
}
print_error_and_exit someArgs
답변1
쉘 스크립트는 대화형 쉘에서 시작되지 않는 한 대화형 쉘 환경에서 거의 실행되지 않습니다. 이는 $-
포함되지 않음을 의미합니다 i
.
너 뭐야할 수 있다점검의 목적은 표준 입력이 터미널에 연결되어 있는지 확인하는 것입니다. 이는 -t
인수(표준 입력 스트림의 파일 설명자)가 있는 0
테스트를 사용하여 수행됩니다 .
running_interactively () { [ -t 0 ]; }
이는 "대화형으로 실행"이 "터미널에서 직접 입력을 읽을 수 있음"을 의미한다고 가정합니다.
스크립트 내의 전체 사용자 상호 작용 테스트로 파일 설명자 2(표준 오류)에 대해 추가 테스트를 수행할 수 있습니다. 사용자 상호 작용은 주로 표준 입력(사용자 입력) 및 표준 오류(프롬프트, 진단 메시지 등)에서 발생합니다.
running_interactively () { [ -t 0 ] && [ -t 2 ]; }
그러나 스크립트의 출력이 리디렉션되거나 파이프되는 경우 파일 설명자 1(표준 출력)에 대한 테스트는 실패합니다.