あなたがtypescriptにいるかどうかを知る方法は?


11

scriptコマンドを使用して、ターミナルからのすべての出力をというファイルに保存していますtypescript。またはscript foo、ファイルに保存しますfoo

さて、コマンドごとにコマンドを入力していて、typescriptかどうかを忘れてしまったとしましょう。

typescript内にいるかどうかを確認するにはどうすればよいですか?

回答:


7

多分:

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"

ヒューリスティックは、一般的に端末エミュレータになりますセッションリーダーの親のコマンド名を取得することです(xtermscriptscreen...)。


1
@teikakazura、ヒューリスティックな部分は、セッションリーダーの親プロセスになることが保証されていないためです。このコマンドを実行するとき、通常、セッションリーダーとその親はpidの再利用とは関係ありません。最初のプロセスはヒューリスティックであり、プロセス名をチェックしているだけだと言えます。名前がscriptttyであり、ttyが開いているコマンドも、誤検知を引き起こします。
ステファンChazelas

1
@teikakazura(2)については、現在のシェルのppidを確認します。ここでは、セッションリーダーのppidを確認する必要があります(通常、それはscript開始されたシェルです)。
ステファンChazelas

私は(「)(2」何であるか、おそらく削除されたコメントを)@StephaneChazelasが、ここでコメントし理解することはできませんが、それだけではなく、検出することができますとしての答えの2番目の部分は非常に興味深いですscriptが、また他の状況を、のようなsu -lssh、Linuxのコンソールとおそらく他のものであり、(の他の議論を通じてps)より多くの情報を提供します。
ステフェイン・グーリッホン

5

興味深い問題。私は小さな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によって提案されたものとは少し異なると思います。私のスクリプトは、Linux / UnixプロセスがPID 1を見つけるまで、またはプロセスとして「スクリプト」を見つけるまで、親子関係を上に向かって機能します。


4
興味深いアプローチ。ただし、たとえば、xtermスクリプトセッションからを開始すると、そのスクリプトは、そのxtermのシェルがスクリプトの下で実行されることに注意してください。まあそれはある方法ですが、出力はtypescriptに行きません。私のアプローチでは、現在のセッションに関連付けられている端末をチェックするため、その問題は発生しません。
ステファンChazelas

0

パスに個人のbin /ディレクトリがある場合(例:/ home / user / bin)、 'script'(バイナリと同じ名前)という名前のシェルスクリプトを次の内容で配置します。

#!/bin/bash
export SCRIPT_RUNNING=1
exec /usr/bin/script # full path to your script(1) binary

これで、実行中のスクリプト内で、環境変数SCRIPT_RUNNINGをテストし、それに基づいて必要なことをすべて実行できます。

編集:

実際、はるかに簡単な方法があります。以下はそれをすべて言い、3つのファイル、〜/ bin / script、〜/ bin / script-shellおよび〜/ .scriptrcを作成します。

~ > 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の場合は、hash -rこれらのファイルを作成した後に実行することを忘れないでくださいwhich script

前と同様に、これが機能するためには、PATHに〜/ binがあり、標準パスの前にある必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.