ターミナルセッションを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".

関連情報