타이프 스크립트인지 어떻게 알 수 있습니까? 명령을 입력한다고 말하고 타이프

script터미널의 모든 출력을이라는 파일에 저장 하는 명령을 사용하고 typescript있습니다. 또는 script foo파일에 저장합니다 foo.

이제 명령 다음에 명령을 입력한다고 말하고 타이프 스크립트에 있는지 여부를 잊어 버립니다.

내가 타이프 스크립트 내에 있는지 어떻게 알 수 있습니까?



답변

아마도 :

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…).


답변

재미있는 문제. 작은 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"

필자는 스크립트가 PID 1을 찾거나 프로세스로 “스크립트”를 찾을 때까지 Linux / Unix 프로세스가 갖는 부모 : 자식 관계를 처리한다는 점에서 Stephane Chazelas가 제안한 것과 약간 다릅니다.


답변

경로에 개인 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라면 hash -r‘script’를 명령으로 입력 할 때 ~ / bin / script가 실행되도록 이러한 파일을 만든 후에 실행하는 것을 잊지 마십시오 (로 확인하십시오 which script).

이전과 마찬가지로 PATH에 ~ / bin이 있어야 표준 경로보다 앞에 있어야합니다.