it-swarm-ja.com

あなたがタイプスクリプトにいるかどうかを知る方法は?

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

ここで、コマンドの後にコマンドを入力しているときに、TypeScriptを使用しているかどうかを忘れたとします。

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

11
Rob Avery IV

多分と:

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...)になります。

7

興味深い問題。私は小さな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"

これはStephaneChazelasによって提案されたものとは少し異なると思います。私のスクリプトは、Linux/UnixプロセスがPID1を見つけるまで、またはプロセスとして「スクリプト」を見つけるまで、親子関係を上っていきます。

5
Bruce Ediger

パスに個人用の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の場合は、これらのファイルを作成した後にhash -rを実行することを忘れないでください。これにより、コマンドとして「script」を入力したときに〜/ bin/scriptが実行されます(which scriptで確認してください)。 。

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

0
Roadowl