이 명령 을 사용하여 script
터미널의 모든 출력 을 typescript
.script foo
foo
이제 명령을 차례로 입력하고 있는데 TypeScript를 사용하고 있는지 잊어버렸다고 가정해 보겠습니다.
TypeScript에 있는지 어떻게 알 수 있나요?
답변1
어쩌면 다음과 같이 할 수도 있습니다:
if lsof -tac script "$(tty)" > /dev/null; then
echo "I'm running under script"
else
echo "I'm not"
fi
다음과 같은 것을 추가할 수 있습니다:
lsof -tac script "$(tty)" > /dev/null && PS1="[script] $PS1"
~/.zshrc
또는 에 ~/.bashrc
추가하면 귀하인지 아닌지에 대한 정보 script
가 쉘 프롬프트에 표시됩니다.
또는 설치를 보장할 수 없는 경우 lsof
다음을 수행할 수 있습니다(수정되지 않은 IFS 가정).
terminal=$(ps -o comm= -p $(ps -o ppid= -p $(ps -o sid= -p "$$")))
[ "$terminal" = script ] && PS1="[script] $PS1"
경험적 방법은 세션 리더의 상위 명령 이름, 일반적으로 터미널 에뮬레이터( xterm
, script
, screen
...)를 가져오는 것입니다.
답변2
흥미로운 질문입니다. 작업을 매우 안정적으로 수행하는 작은 bash 스크립트를 찾았습니다.
#!/bin/bash
PP=$(ps -o ppid= $$)
while [[ $PP != 1 ]]
do
LINE=$(ps -o ppid= -o comm= $PP | sed 's/^ *//')
COMM=${LINE#* }
PP=${LINE%% *}
if [[ $COMM == script ]] # Might need a different comparison
then
echo "In script"
exit 0
fi
done
echo "Not in script"
나는 이것이 Stephane Chazelas가 제안한 것과 약간 다르다고 생각합니다. 왜냐하면 내 스크립트는 PID 1을 찾거나 프로세스로 "스크립트"를 찾을 때까지 Linux/Unix 프로세스의 부모:자식 관계에 따라 위쪽으로 작동하기 때문입니다.
답변3
경로에 개인 bin/ 디렉토리가 있는 경우(예: /home/user/bin) 여기에 다음 내용이 포함된 "script"(바이너리와 동일한 이름)라는 쉘 스크립트를 배치합니다.
#!/bin/bash
export SCRIPT_RUNNING=1
exec /usr/bin/script # full path to your script(1) binary
이제 스크립트가 실행되는 동안 환경 변수 SCRIPT_RUNNING을 테스트하고 이를 기반으로 원하는 작업을 수행할 수 있습니다.
편집하다:
사실 더 쉬운 방법이 있습니다. 다음은 ~/bin/script, ~/bin/script-shell 및 ~/.scriptrc라는 세 개의 파일을 생성하여 모든 것을 설명합니다.
~ > ls ~/bin/script ~/bin/script-shell ~/.scriptrc
-rw-r--r-- 1 roadowl users 23 Oct 18 16:52 /home/roadowl/.scriptrc
-rwx------ 1 roadowl users 49 Oct 18 16:53 /home/roadowl/bin/script
-rwx------ 1 roadowl users 56 Oct 18 16:55 /home/roadowl/bin/script-shell
~/bin > cat script
#!/bin/bash
exec /usr/bin/script -c script-shell
~/bin > cat script-shell
#!/bin/bash
exec /bin/bash --rcfile /home/bjd/.scriptrc
~/bin > cat ~/.scriptrc
export PS1="[script] "
현재 쉘이 bash인 경우, 명령으로 "script"를 입력할 때 ~/bin/script가 실행되는지 확인하기 위해 이러한 파일을 생성한 후 실행하는 것을 잊지 마십시오 hash -r
( 확인 which script
).
이전과 마찬가지로 이 작업을 수행하려면 표준 경로 앞에 ~/bin이 PATH에 있어야 합니다.
답변4
긴 이야기 짧게
localhost에 대한 대부분의 사용 사례는 다음을 확인하세요.스크립트일반적으로 환경 변수나 예상 출력 파일이 있는 것이 가장 좋습니다. 그러나 변수나 세마포어(로컬 또는 원격), 태그 창(예: GNU 화면 또는 tmux) 또는 터미널 탭을 명시적으로 설정해야 하거나 특정 상황에 대한 암시적 또는 기본 동작에 대한 기타 솔루션입니다.
확인 방법을 보여주기 위해 아래에 몇 가지 예를 제공했습니다.스크립트BSD 및 Linux의 변수. 또한 SSH를 통해 원격 호스트에 연결할 때 이 접근 방식의 제한 사항을 포함하여 몇 가지 주의 사항을 제공했습니다.
BSD: 확인스크립트환경 변수
BSD 버전을 사용하는 시스템에서는 script
다음 사항을 확인할 수 있습니다.스크립트환경 변수. BSD 스크립트(1)은 다음과 같이 말합니다:
SCRIPT 환경 변수가 서브쉘에 추가되었습니다. SCRIPT가 사용자 환경에 이미 존재하는 경우 해당 값
예를 들어, 다음과 같습니다.
SHELL=/bin/sh script logfile.log
# script exports SCRIPT to sub-shells, so you can test if
# it's non-empty
[ -n "$SCRIPT" ] && echo "in typescript"
# SCRIPT holds the name of the typescript file you specified,
# or "typescript" by default; his enables you to check if
# you're in a *specific* typescript
[ "$SCRIPT" = "logfile.log" ] || [ "$SCRIPT" = "typescript" ]
# returns name of typescript file or an error message
echo "${SCRIPT?not in typescript}"
# exit status 0 in typescript; show error message and return
# exit status 1 outside the typescript
: "${SCRIPT?not in typescript}"
# this is less reliable, but can be useful in some cases;
# true if in a sub-shell, although there are no guarantees
# the sub-shell was spawned by script
[ "$SHLVL" -gt "1" ]
Linux: 자체 SCRIPT 변수 내보내기
util-linux 2.23.2와 함께 제공되는 버전(저에게 편리한 버전)은 기본적으로 SCRIPT 변수를 내보내지 않습니다. 셸 사용 방법에 관계없이 자신의 파일을 간단히 내보낼 수 있습니다. Bash와 같은 셸에서:
SCRIPT='typescript' script
그런 다음 위와 동일한 테스트를 수행할 수 있습니다.
지침
이 script
명령을 사용하면 단지 쉘을 시작하는 대신 실행할 명령을 지정할 수 있습니다. 따라서 명령이 환경을 정리하거나(예: env -i printenv
), SCRIPT 변수를 설정 해제하거나, 원격 시스템에 있는 경우(예: SSH를 통해 로그인한 경우)스크립트퍼지지 않습니다.
SSH를 사용하는 경우 다음 명령을 사용하여 전파하는 것을 고려할 수 있습니다.환경 보내기또는환경 설정클라이언트 측에서환경을 받아들이세요서버 측에서는 이것이 대부분의 시스템에서 일반적인 기본값이 아니기 때문에 의존하지 않을 것입니다. 설정할 수도 있습니다.로컬 명령 허용서버에서 로컬 환경에 액세스~C그리고 !echo $SCRIPT
, 하지만 다시 말씀드리지만, 귀하가 서버를 제어하지 않는 한 나는 그것에 의존하지 않을 것입니다.