터미널 세션을 typescript로 기록하는 "script" 명령이 이미 실행 중인지 어떻게 알 수 있나요?

터미널 세션을 typescript로 기록하는 "script" 명령이 이미 실행 중인지 어떻게 알 수 있나요?

이것그래서 대답은실행하는 명령의 환경에 script변수가 추가되었음을 나타냅니다 . SCRIPT시도해 보았지만 지금은 작동하지 않는 것 같습니다.

내가 시도한 것은 다음과 같습니다.

ma08@IWeighHar:~/pro$ script foo.log
Script started, output log file is 'foo.log'.
ma08@IWeighHar:~/pro$ echo $SCRIPT

ma08@IWeighHar:~/pro$ exit
exit
Script done.
ma08@IWeighHar:~/pro$ echo $SCRIPT

ma07@IWeighHar:~/pro$ 

script현재 터미널 세션에서 명령이 실행되었는지 감지하는 방법은 무엇입니까 ?

이 명령의 이름 때문에 인터넷 검색은 악몽입니다.

답변1

script경험적으로 터미널 장치에 해당 이름을 가진 열린 프로세스가 있는지 확인할 수 있습니다 .

if lsof -watc script "$(tty)" > /dev/null 2>&1; then
  echo I may very well be within a script session
fi

tty표준 입력에서 열린 터미널의 경로를 반환합니다. 일부 쉘은 $TTY제어 터미널의 경로에 변수를 설정합니다. $(ps -o tty= -p "$$")접두어가 없는 제어 터미널 얻기 도 참조하십시오 /dev/.

답변2

사용 중인 유틸리티의 변형 또는 버전은 실행되는 셸에서 환경 변수를 설정 script하지 않으므로 직접 설정할 수 있습니다. SCRIPT이 변수를 설정하는 유틸리티 변형에서는 출력 파일의 이름으로 설정됩니다. 다음은 bash이 동작을 모방하는 짧은 쉘 함수입니다.

script () {
    local outfile="${1:-typescript}"
    SCRIPT=$outfile command script "$outfile"
}

이 함수는 출력 TypeScript 파일의 경로 이름인 선택적 단일 인수를 사용합니다. 인수가 제공되지 않거나 비어 있으면 이 이름이 typescript출력 파일로 사용됩니다. 출력 파일의 이름은 "$SCRIPT"유틸리티가 시작한 셸에서도 사용할 수 있습니다.

이 기능을 다음과 같이 사용합니다

script myfile

또는

script

또는 명령줄 끝에 임의의 명령을 허용합니다(첫 번째 인수가 TypeScript 출력 파일이어야 하며 위 변형과 마찬가지로 실제 명령에 대한 옵션 제공을 허용하지 않습니다 script).

script () {
    local outfile="${1:-typescript}"
    shift
    SCRIPT=$outfile command script "$outfile" "$@"
}

위와 같이 사용할 수 있지만 실행할 명령을 추가할 수도 있습니다.

script outfile mail -s testmail [email protected]

답변3

이렇게 하면 필요한 것이 제공됩니다.

#!/bin/sh

# placing into Creative Commons - may not be claimed for copyright by any other individual or corporation.
# free to use and replicate

BASE=`basename "${0}" ".sh" `
TMP="/tmp/tmp.$$.${BASE}"

if [ $# -ne 1 ] ; then  echo "\n Must provide current shell PID by referencing it with $$ on the command line.\n" ; exit 1 ; fi

MySHELL=$1

ps -ef >${TMP}.ps
### FORMAT
#username   37539    4819  0 15:47 pts/3    00:00:00 bash
#username   37572   37539  0 15:49 pts/3    00:00:00 script scriptLog.txt
#username   37573   37572  0 15:49 pts/4    00:00:00 bash -i

awk -v sPID="${MySHELL}" '{
    if( $2 == sPID ){
        print $3 ;
    } ;
}' <${TMP}.ps |
{   read sPPID
    awk -v sPPID="${sPPID}" '{
        if( $2 == sPPID ){
            n=index( $0, "script " ) ;
            if( n == 0 ){
                print "\t safe to use \"script\"." ; exit 0 ;
            }else{
                COMMAND=substr( $0, n ) ;
                printf("BUSY [%s]:  %s\n", sPPID, COMMAND ) ; exit 1 ;
            } ; 
        } ;
    }' <${TMP}.ps
}

exit 0
exit 0
exit 0

스크립트가 이미 현재 셸을 기록하고 있는 경우 RC=1을 반환하고 다음을 보고합니다.

BUSY [37572]:  script scriptLog.txt

그렇지 않으면 RC=0이며 다음과 같이 보고됩니다.

        safe to use "script".

관련 정보