エイリアスまたは関数を介して、シェルで実際に実行されたコマンドを確認するにはどうすればよいですか


20

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


つまり$@、あなたのエイリアスの一部?エイリアスは実際には引数をサポートしていないことに注意してください。引数は、エイリアスを呼び出すコンテキストの位置パラメータ(存在する場合)に展開されます。通常の実行方法はsomealias some args、エイリアスを展開し、それに続く引数を残すだけで機能します。引数に実際にアクセスできるようにしたい場合は、関数を使用して、引用符で"$@"
囲む-ilkkachu


1
@AlonAviv、良い。:)それでも、最善のことは、引用"$@"符を付ける習慣を付けることです。そうしないと、空白文字またはグロブ文字を含む引数が焼き付けられます。
-ilkkachu

1
@DarkHeartこれは重複していません。もう1つの質問は、シェル関数に関するものではありません。
クサラナナンダ

2
主題を完全に変更する(そして既存の回答の1つを無効にする)ように編集されるまで、これもそうではありませんでした。
マイケルホーマー

回答:


29

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

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

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

使用set -x上のターンをxtraceシェルオプション(set +xそれをオフ)とで動作するはずのすべてのBourneシェルのような、のようなbashdash ksh93pdkshzsh。これにより、エイリアスの展開や変数の展開などが実行された後に実行されるコマンドを表示するようシェルに要求されます。

出力はシェルの標準エラーストリームにあるため(通常のプロンプトと同様)、標準出力のリダイレクトを妨げず、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デフォルトでは、すべての対話型シェルで実行しています。実際に実行されたものを見るのは素晴らしいことです...しかし、プログラム可能なタブ補完などがいくつかのシェルで望ましくないトレース出力を引き起こす可能性があることに気付きました。


14

あなたは使用することができますshell-expand-lineにバインドされ、 Control- - Alteデフォルトでは、

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

とりわけ、現在の行のエイリアスをそれらの定義で置き換えるため、まだ実行しようとしているコマンドを確認できます。例:

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

これは便利な機能です。zshに同等のコマンドがあるshell-expand-lineかどうか知っていますか?
-the_velour_fog

申し訳ありませんが、私はを使用しないので、そうではありませんzsh。しかし、一部の人々は独自のアイデアを思いつきました:wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
Arkadiusz Drabczyk


1

type実行するエイリアスまたは関数定義を表示するには、bashビルトインを使用できます。

$ 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 "@"
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.