web-dev-qa-db-ja.com

エイリアスまたは関数を使用して、シェルで実際に実行されたコマンドを確認する方法

私はbash関数(またはエイリアス)を持っています(例:function install() {Sudo apt-get install $@})。コマンドinstall dicelabを実行すると、実際に実行されるのはSudo apt-get install dicelabです。シェルによって実際に実行されたものはどこで確認できますか?より複雑なエイリアスが期待どおりに機能することを確認したいと思います。

20
Alon Aviv

シェルでset -xを使用します。

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

set -xを使用すると、xtraceシェルオプションがオンになり(set +xがオフになります)、bashdashksh93pdkshzshなどのすべてのBourneのようなシェルで機能します。これにより、エイリアスの展開や変数の展開などが実行された後に実行されるコマンドを表示するようにシェルに求められます。

出力はシェルの標準エラーストリーム(通常のプロンプトと同様)にあるため、標準出力のリダイレクトに干渉せず、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!

デフォルトでは、すべてのインタラクティブシェルでset -xを使用して実行しています。実際に何が実行されたかを確認するのはうれしいことです...しかし、プログラム可能なタブ補完などにより、一部のシェルで不要なトレース出力が発生する可能性があることに気付きました。

30
Kusalananda

Shell-expand-line、バインドされている Control-Alt-e デフォルトでは:

$ bind -p | grep Shell-expand-line
"\e\C-e": Shell-expand-line

特に、現在の行のエイリアスをその定義に置き換えます。これにより、まだ実行中のコマンドを確認できますgoing to run。例:

$ install dicelab # now press C-Alt-e
$ Sudo apt-get install  dicelab # the above line will be replaced with this
14

実行するエイリアスまたは関数定義を確認するために、bash組み込みtypeを使用できます。

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { Sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
1
belkka