コマンドがスクリプトから出てくるのか、コマンドラインに手動で入力されているのかを調べることは可能ですか?

コマンドがスクリプトから出てくるのか、コマンドラインに手動で入力されているのかを調べることは可能ですか?

カスタムコマンドを使用して特定のツールの環境を設定できる実装があります。

例: custom_command tool_name

このコマンドは、通話時間、ユーザー、およびツール名をログファイルに記録します。

これらのログにより、特定のツールが最後に使用された時期を確認できます。

これで、ユーザーはログインプロファイルにコマンドを入力することに慣れています。

もしそうなら、コマンドラインまたは他のスクリプトから手動で入力してcomamndが呼び出されていることを確認できますか?もしそうなら、スクリプト名は何ですか?

いくつかの方法を試してみました。私が見つけることができるのは、シェルという親スクリプト名だけです。

私の理解はこれが不可能だということです。しかし、私はちょうど私の幸運を試してみたかった。

答え1

bashスクリプトでは通常、次のようにします。

#!/bin/bash

if test "$0" != "$BASH_SOURCE"; then
    SOURCED=1
    MY_NAME=$BASH_SOURCE
else
    SOURCED=0
    MY_NAME=$0
fi

# do something here

if test "$SOURCED" = "1"; then
    # use return instead of exit
    return
fi

# do something here only when not sourced
exit

答え2

私はこれが完全に可能だとは思わない。

もちろん、親プロセスが何であるか、そのコマンドライン引数が何であるかはわかりますが、最終的に対話型シェルを実行するときに起動スクリプトで実行されるプログラムの親プロセスは、対話型で実行されるプログラムと同じです。

実行された場所にのみ存在する場合は、.profileソースが後にあることを検出できます/etc/bashrc(このシェルで実行を無視するのをやめるコマンドを入力できるため)。

別のアプローチは、親プロセスの開始時間を確認することです。通常、コマンドの対話型実行はシェルの起動直後に実行され、initスクリプトはシェルの起動直後に実行されます。

より洗練されたアイデアは、それをよりカスタマイズされた方法で開始ファイルのソースを制御するラッパーに置き換えることです/bin/bash(このアイデアは最初のアイデアと似ていますが、コマンドが実行されます)後ろに .bashrc)。これが良いアイデアかどうかはわかりませんが、少なくともこれを行うときは非常に注意してください。

関連情報