타이프 스크립트인지 어떻게 알 수 있습니까?


11

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

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

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

답변:


7

아마도 :

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


1
@teikakazura, 휴리스틱 부분은 세션 리더의 부모 프로세스가 보장되지 않기 때문입니다. 세션 리더와 부모가 일반적으로 해당 명령을 실행할 때 pid 재사용과는 아무런 관련이 없습니다. 첫 번째 프로세스 는 휴리스틱 이며 프로세스 이름 만 확인 한다고 말할 수 있습니다. 이름도 script있고 tty가 열려 있는 모든 명령 은 오탐 (false positive)을 유발합니다.
Stéphane Chazelas

1
@teikakazura About (2), 그것은 현재 쉘의 ppid를 확인합니다. 여기서는 세션 리더의 ppid (일반적으로 script시작된 셸 ) 를 확인하려고합니다 .
Stéphane Chazelas

내가 ( ") (2"무엇 아마 삭제 된 코멘트)을 @StephaneChazelas 여기에 언급 이해할 수 있지만,뿐만 아니라 감지 할 수있는 대답의 두 번째 부분은 매우 흥미 script뿐만 아니라 다른 상황을, 같은 su -l, ssh리눅스 콘솔과 아마도 다른 사람 일 수도 있고 (다른 주장을 통해 ps) 훨씬 더 많은 정보 를 제공 할 수도 있습니다 .
Stéphane Gourichon

5

재미있는 문제. 작은 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가 제안한 것과 약간 다릅니다.


4
재미있는 접근법. 그러나 예를 들어 xterm스크립트 세션에서 시작하는 경우 해당 스크립트는 해당 xterm의 셸이 스크립트에서 실행됩니다. 글쎄요,하지만 출력은 타자기에 들어 가지 않습니다. 내 접근 방식은 현재 세션과 관련된 터미널을 확인하므로 문제가 없습니다.
Stéphane Chazelas

0

경로에 개인 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이 있어야 표준 경로보다 앞에 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.