쉘 스크립트가 대화식으로 실행되고 있는지 확인하는 데 혼란이 있습니다.

쉘 스크립트가 대화식으로 실행되고 있는지 확인하는 데 혼란이 있습니다.

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(표준 출력)에 대한 테스트는 실패합니다.

관련 정보