エイリアスまたは関数を介してシェルで実行される実際のコマンドを表示する方法

エイリアスまたは関数を介してシェルで実行される実際のコマンドを表示する方法

たとえば、bash関数(またはエイリアス)がありますfunction install() {sudo apt-get install $@}。コマンドを実行するときにinstall dicelab実際に何を実行する必要がありますかsudo apt-get install dicelab?シェルが実際に実行される内容をどこで見ることができますか?より複雑なエイリアスが期待どおりに機能することを確認したいと思います。

ベストアンサー1

set -xシェルで使用されます。

$ alias hello='echo hello world!'
$ hello
hello world!
$ set -x
$ hello
+ echo hello world!
hello world!

set -xオープンシェルオプションを使用しxtraceset +xオフ)、などのすべてのBourne様シェルで動作する必要bashがありますdash ksh93。これは、エイリアス拡張、変数拡張などの後に実行されたコマンドを表示するようにシェルにメッセージを表示します。pdkshzsh

PS4出力はシェルの標準エラーストリーム(通常のプロンプトと同様)にあるため、標準出力のリダイレクトを妨げることはなく、シェル変数で定義されたプロンプト(通常はデフォルト)が+␣先頭にあります。

いくつかの機能の例:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }
$ helloworld
hello world!
$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

あなたの具体的な例に基づいて(文法修正と引用符を追加):

$ install () { sudo apt-get install "$@"; }
$ set -x
$ install dicelab
+ install dicelab
+ sudo apt-get install dicelab
bash: sudo: command not found

(私のシステムで使用またはインストールされていないsudoため、このエラーは予想されます。)

共通ユーティリティが呼び出されたため、特定の時点でそのユーティリティを使用するには、関数名installを別の名前(?)で指定する必要があります。aptin


トレース出力は次のとおりです。デバッグ出力。これは表現するコマンドの実行時にシェルが実行するアクションです。画面に表示される出力がシェル入力に収まらない場合があります。

また私はbash。他のシェルには、別のデフォルトのトレースプロンプト(たとえばzsh、現在のコマンドの文字列と履歴番号を含む)があるか、ネストされzshた呼び出しなどのプロンプトが「スタック」されない可能性があります。bash


デフォルトでは、すべての対話型シェルで実行したのと同じコマンドを実行していますset -x。実際に実行されている内容を確認すると良いでしょう。しかし、プログラム可能なタブの完成などにより、一部のシェルで不要なトレース出力が発生する可能性があり、一部のシェルのデフォルトのトレース出力がわずかに冗長であることがわかりました(例zsh:)。

おすすめ記事