이것그래서 대답은실행하는 명령의 환경에 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".