私はbash関数(またはエイリアス)を持っています(例:function install() {Sudo apt-get install $@}
)。コマンドinstall dicelab
を実行すると、実際に実行されるのはSudo apt-get install dicelab
です。シェルによって実際に実行されたものはどこで確認できますか?より複雑なエイリアスが期待どおりに機能することを確認したいと思います。
シェルでset -x
を使用します。
$ alias hello='echo hello world!'
$ hello
hello world!
$ set -x
$ hello
+ echo hello world!
hello world!
set -x
を使用すると、xtrace
シェルオプションがオンになり(set +x
がオフになります)、bash
、dash
ksh93
、pdksh
、zsh
などのすべての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
を使用して実行しています。実際に何が実行されたかを確認するのはうれしいことです...しかし、プログラム可能なタブ補完などにより、一部のシェルで不要なトレース出力が発生する可能性があることに気付きました。
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
実行するエイリアスまたは関数定義を確認するために、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 "@"
}