これだから答えは実行するコマンドの環境に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".