zsh
쉘의 CLI에서 직접 호출되는지 여부에 따라 동작이 달라지는 스크립트를 구현하고 싶습니다 .
처음에는 스크립트가 i
값을 검색하여 이 작업을 수행 할 수 있다고 생각했지만 $-
내 생각은 틀렸습니다.
실제로 명령줄에서 아래 스크립트를 실행하면
#!/bin/zsh
printf -- '%s\n' "$-"
...내가 얻은 출력에는 i
1 이 포함되지 않습니다 .
내 쉘 스크립트에서 이 정보를 찾을 수 있는 다른 방법이 있습니까?
알아채다:zsh
bash
현재 대본을 쓰고 있지만 대본에 대한 답이 무엇인지도 알고 싶습니다 . 대답이 다르다면 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 ]
-t
var=-t; [ "$var" ]