如何知道“script”命令(将终端会话记录为打字稿)是否已经在运行?

如何知道“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返回在标准输入上打开的终端的路径。某些 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".

相关内容