このコマンドを使用してscript
端末のすべての出力をtypescript
。script foo
foo
それでは、コマンドを順番に入力していますが、TypeScriptを使用していることを忘れてしまったとしましょう。
TypeScriptにいるかどうかはどうすればわかりますか?
答え1
たぶん、次のようにすることができます:
if lsof -tac script "$(tty)" > /dev/null; then
echo "I'm running under script"
else
echo "I'm not"
fi
次のものを追加できます。
lsof -tac script "$(tty)" > /dev/null && PS1="[script] $PS1"
~/.zshrc
またはに~/.bashrc
追加すると、あなたかどうかに関する情報script
がシェルプロンプトに表示されます。
または、インストールを保証できない場合は、lsof
次のことを行うことができます(未修正IFS仮定)。
terminal=$(ps -o comm= -p $(ps -o ppid= -p $(ps -o sid= -p "$$")))
[ "$terminal" = script ] && PS1="[script] $PS1"
経験的な方法は、セッションリーダーの親コマンド名、通常はターミナルエミュレータ(、、、xterm
... )を取得することです。script
screen
答え2
興味深い質問です。非常に安定したタスクを実行する小さなbashスクリプトを見つけました。
#!/bin/bash
PP=$(ps -o ppid= $$)
while [[ $PP != 1 ]]
do
LINE=$(ps -o ppid= -o comm= $PP | sed 's/^ *//')
COMM=${LINE#* }
PP=${LINE%% *}
if [[ $COMM == script ]] # Might need a different comparison
then
echo "In script"
exit 0
fi
done
echo "Not in script"
私はこれがStephane Chazelasが提案したものとは少し異なると思います。なぜなら、私のスクリプトは、PID 1を見つけるか、プロセスとして「スクリプト」を見つけるまで、Linux / Unixプロセスの親:子関係に応じて上向きに動作するからです。
答え3
パスにプライベートbin /ディレクトリがある場合(たとえば、/home/user/bin)、次の内容を含む「script」(バイナリと同じ名前)というシェルスクリプトを配置します。
#!/bin/bash
export SCRIPT_RUNNING=1
exec /usr/bin/script # full path to your script(1) binary
これで、スクリプトの実行中に環境変数SCRIPT_RUNNINGをテストし、それに基づいて目的のタスクを実行できるようになりました。
編集する:
実際、より簡単な方法があります。以下は、~/bin/script、~/bin/script-shell、~/.scriptrc という 3 つのファイルを生成し、すべてを説明します。
~ > ls ~/bin/script ~/bin/script-shell ~/.scriptrc
-rw-r--r-- 1 roadowl users 23 Oct 18 16:52 /home/roadowl/.scriptrc
-rwx------ 1 roadowl users 49 Oct 18 16:53 /home/roadowl/bin/script
-rwx------ 1 roadowl users 56 Oct 18 16:55 /home/roadowl/bin/script-shell
~/bin > cat script
#!/bin/bash
exec /usr/bin/script -c script-shell
~/bin > cat script-shell
#!/bin/bash
exec /bin/bash --rcfile /home/bjd/.scriptrc
~/bin > cat ~/.scriptrc
export PS1="[script] "
現在のシェルがbashの場合は、コマンドで "script"を入力したときに〜/ bin / scriptが実行されていることを確認するためにこれらのファイルを作成して実行することを忘れないでくださいhash -r
(確認which script
)。
以前と同様に、これを実行するには、標準パスの前に PATH に ~/bin が必要です。
答え4
長い話を短く
localhostのほとんどのユースケースについては、以下を確認してください。スクリプト通常、環境変数または予想される出力ファイルがあるのが最善です。ただし、変数やセマフォ(ローカルまたはリモート)、タグウィンドウ(GNU画面やtmuxなど)、またはターミナルタブを明示的に設定する必要があります。
確認方法を示すために、以下にいくつかの例を提供した。スクリプトBSDとLinuxの変数。また、SSHを介してリモートホストに接続するときに、このアプローチの制限を含むいくつかの注意事項を提供しました。
BSD:確認スクリプト環境変数
BSDバージョンを使用するシステムでは、script
次のことを確認できます。スクリプト環境変数BSDスクリプト(1)は次のように言います:
SCRIPT環境変数がサブシェルに追加されました。 SCRIPT がユーザー環境にすでに存在する場合、その値
たとえば、次のようになります。
SHELL=/bin/sh script logfile.log
# script exports SCRIPT to sub-shells, so you can test if
# it's non-empty
[ -n "$SCRIPT" ] && echo "in typescript"
# SCRIPT holds the name of the typescript file you specified,
# or "typescript" by default; his enables you to check if
# you're in a *specific* typescript
[ "$SCRIPT" = "logfile.log" ] || [ "$SCRIPT" = "typescript" ]
# returns name of typescript file or an error message
echo "${SCRIPT?not in typescript}"
# exit status 0 in typescript; show error message and return
# exit status 1 outside the typescript
: "${SCRIPT?not in typescript}"
# this is less reliable, but can be useful in some cases;
# true if in a sub-shell, although there are no guarantees
# the sub-shell was spawned by script
[ "$SHLVL" -gt "1" ]
Linux:独自のSCRIPT変数をエクスポートする
util-linux 2.23.2に付属のバージョン(私にとって便利なバージョン)は、デフォルトではSCRIPT変数をエクスポートしません。シェルの使い方に関係なく、自分のファイルを簡単にエクスポートできます。 Bashのようなシェルから:
SCRIPT='typescript' script
その後、上記と同じテストを実行できます。
ガイドライン
このscript
コマンドを使用すると、シェルを起動する代わりに実行するコマンドを指定できます。したがって、コマンドが環境をクリーンアップしたり(例env -i printenv
:)、SCRIPT変数を設定解除したり、リモートシステム上にある場合(例:SSHを介してログインした場合)スクリプト広がりません。
SSHを使用している場合は、次のコマンドを使用して伝播することを検討できます。環境を送るまたは環境設定クライアント側から環境を受け入れるサーバー側では、これはほとんどのシステムで一般的なデフォルトではないため、依存しません。設定することもできます。ローカルコマンドを許可サーバーからローカル環境にアクセスする~Cそして!echo $SCRIPT
、しかし、もう一度申し上げますが、あなたがサーバーを制御しない限り、私はそれに依存しません。