这所以答案表示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
返回在标准输入上打开的终端的路径。某些 shell 将$TTY
变量设置为其控制终端的路径。另请参阅$(ps -o tty= -p "$$")
获取不带前缀的控制终端/dev/
。
答案2
由于您使用的实用程序的变体或版本script
不会SCRIPT
在其启动的 shell 中设置环境变量,因此您可以自行设置。在设置此变量的实用程序的变体中,它被设置为输出文件的名称。以下是一个bash
模仿该行为的简短 shell 函数:
script () {
local outfile="${1:-typescript}"
SCRIPT=$outfile command script "$outfile"
}
该函数采用一个可选的单个参数,它是输出打字稿文件的路径名。如果未提供参数(或者为空),则该名称typescript
将用作输出文件。输出文件的名称也可以"$SCRIPT"
在实用程序启动的 shell 中使用。
你会像这样使用这个函数
script myfile
或作为
script
或者,允许在命令行末尾使用任意命令(要求第一个参数是打字稿输出文件,并且与上述变体一样,不允许为实际命令提供选项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
如果脚本已经记录当前 shell,它将返回 RC=1 并报告如下:
BUSY [37572]: script scriptLog.txt
否则,RC=0 并且将报告如下:
safe to use "script".