쉘 스크립트는 자신이 쉘의 CLI에서 호출되고 있다는 것을 어떻게 알 수 있습니까?

쉘 스크립트는 자신이 쉘의 CLI에서 호출되고 있다는 것을 어떻게 알 수 있습니까?

zsh쉘의 CLI에서 직접 호출되는지 여부에 따라 동작이 달라지는 스크립트를 구현하고 싶습니다 .

처음에는 스크립트가 i값을 검색하여 이 작업을 수행 할 수 있다고 생각했지만 $-내 생각은 틀렸습니다.

실제로 명령줄에서 아래 스크립트를 실행하면

#!/bin/zsh
printf -- '%s\n' "$-"

...내가 얻은 출력에는 i1 이 포함되지 않습니다 .

내 쉘 스크립트에서 이 정보를 찾을 수 있는 다른 방법이 있습니까?

알아채다:zshbash현재 대본을 쓰고 있지만 대본에 대한 답이 무엇인지도 알고 싶습니다 . 대답이 다르다면 OS저는 주로 Linux와 Darwin에 관심이 있습니다.


1569X 혹시 궁금한 분이 계시다면 스크립트의 출력은 다음과 같습니다.

답변1

$-i쉘 자체가 대화형 쉘인 경우, 프롬프트를 발행하는 경우, 터미널에서 명령줄 입력 및 편집을 허용하는 경우, 작업 제어 등을 수행하는 경우가 포함됩니다 .

스크립트는 일반적으로 비대화형 쉘에 의해 해석됩니다. 스크립트를 ./the-script또는 으로 호출하면 zsh ./the-script인스턴스 zsh가 대화형이 아닙니다. 대화형 셸이 스크립트를 해석하는 유일한 경우는 source ./the-script또는 와 같은 코드를 사용하여 내부 코드를 해석하도록 대화형 셸에 지시할 때입니다 eval "$(<the-script)".

여기서는 사용자가 터미널을 통해 상호 작용할 수 있는지 알고 싶은 것처럼 터미널 내에서 스크립트가 호출되는지 더 알고 싶은 것 같습니다.

[/ 명령 test(zsh 및 bash 및 대부분의 다른 Bourne 유사 쉘에 내장되어 있지만 POSIX 시스템에서는 독립 실행형 명령으로도 존재해야 함)은 -t운영자를 통해 알려줄 수 있습니다. 이 -t연산자는 파일 설명자인 숫자 인수를 사용합니다.

[ -t 0 ]또는 test -t 0파일 설명자 0이 터미널 장치에 열려 있으면 true를 반환합니다. 파일 설명자 0은표준 입력, 1은표준 출력, 2 예표준 에러, 다른 모든 fd에는 예약된 특별한 의미가 없습니다.

따라서 스크립트에서 다음을 수행할 수 있습니다.

if [ -t 0 ]; then
  echo "I (this script) am taking input from a terminal, so likely from a user"
fi

if [ -t 1 ]; then
  echo "My output goes to a terminal device, so will likely be seen by a user"
  [ -t 2 ] && echo errors also go there.
fi

입력 및/또는 출력이 터미널 장치 외부의 다른 파일로 리디렉션될 수 있더라도 스크립트가 터미널 세션에서 실행되고 있는지 확인하려면 스크립트 세션에 연결된 터미널이 있는지 확인할 수 있습니다. 예:

if { true <> /dev/tty; } 2> /dev/null; then
  echo "there's a terminal device attached to my session"
fi

어떤 터미널 장치인지 알고 싶다면 다음을 수행하세요.

tty_on_stdin=$(tty)
tty_on_stderr=$(tty <&2)
{ tty_on_stdout=$(tty <&3); } 3>&1

(바라보다이 후속 Q&Afd와 함께 춤을 추는 이유 3).

controlling_tty=$(LC_ALL=C ps -o tty= -p "$$")
[ "$controlling_tty" = '?' ] || controlling_tty=/dev/$controlling_tty

¹ 이전 test/ [구현에서 이 매개변수는 선택사항이었으며 [ -t ]의 약어였습니다 [ -t 1 ]. POSIX [ "$var" ]는 와 동일하기 때문에 더 이상 이를 허용하지 않습니다. 그럼에도 불구하고 stdout이 터미널에 없더라도 리터럴 인 경우에만 stdout이 tty로 가는지 확인하는 [ -n "$var" ]것을 볼 수 있습니다 . .ksh93[ -t ]-tvar=-t; [ "$var" ]

관련 정보