エイリアスff
を作成し、~/.zsh/aliases.zsh
から取得しました。
エイリアスはそれ自体でうまく動作します。
alias ff
ff='firefox --safe-mode'
期待どおりに実行されます。
しかし、gdb
の下で実行しようとすると、次のようになります。
> gdb ff
GNU gdb (Debian 7.12-6+b1) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
...
For help, type "help".
Type "apropos Word" to search for commands related to "Word"...
ff: No such file or directory.
(gdb) quit
gdb firefox --safe-mode
を使用してみましたが、実行されません。
誰かが何が悪いのかを特定できますか?
エイリアスはシェルの機能です。エイリアスを定義すると、新しいシェルコマンド名が作成されます。シェルによってのみ認識され、コマンド名として表示された場合にのみ認識されます。
たとえば、次のように入力した場合
> ff
シェルプロンプトでエイリアスを呼び出しますが、
> echo ff
ff
は単なる引数であり、コマンドではありません。 (少なくともbashでは、エイリアスの定義がスペースで終わっている場合、いくつかのトリックを実行できます。シェルエイリアスを使用する場合は、可能な解決策について StéphaneChazelasの回答 を参照してください。)
入力した
> gdb ff
そのため、シェルはgdb
を呼び出し、引数として文字列ff
を渡しました。
gdb
コマンドラインを介してデバッグプログラムに引数を渡すことができますが、--args
オプションを使用する必要があります。例えば:
> gdb firefox --safe-mode
--safe-mode
をgdb
のオプションとして処理しようとします(失敗します)。引数を指定してコマンドを実行するには、手動で実行できます。
> gdb firefox
...
(gdb) run --safe-mode
または、 thrig's answer を思い出させるように、--args
を使用できます:
> gdb --args firefox --safe-mode
...
(gdb) run
(--args
に続く最初の引数はコマンド名です。残りのすべての引数は、呼び出されたコマンドに渡されます。)
Shellエイリアスから引数を抽出することは可能ですが、別のエイリアスを定義することをお勧めします。
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
または、もっと便利なシェル関数を使用します。 bashのマニュアルにはこう書かれています:
ほとんどすべての目的で、シェル関数はエイリアスよりも優先されます。
直接ではありませんが、ZSHシェルエイリアスをgdb
に適した形式に変更することで可能です。
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
これは、ZSHが行うようにエイリアスを分割し(より堅牢なコードは最初の引数が実際にエイリアスであるか、設定されているかなどをチェックします)、それらの引数を便利な--args
フラグを介してgdb
にフィードします(info gdb invocation
を参照)。次にgdb-alias testtest
を実行すると
% gdb-alias testtest
Reading symbols from echo...(no debugging symbols found)...done.
(gdb) r
Starting program: /Users/jhqdoe/usr/Darwin15.6.0-x86_64/bin/echo test test test
test test test
[Inferior 1 (process 93721) exited normally]
(gdb)
これは、echo
( とにかくecho
の私のアセンブリ実装 が)エイリアスからの引数を使用してgdb
によって実行されたことを示しています。
(これはおそらく、gdbがZSHで設定されている可能性のあるすべてのものと互換性のあるシェルを介してこれらの引数をスローするかどうかに応じて、グローバルエイリアスまたはシェルメタ文字fooのエイリアスで壊れますが、単純なx='y z'
タイプのもの。たぶん。)
POSIXシェルでは、エイリアスはコマンド位置(コマンドが期待される場所)でのみ、または空白文字で終わるエイリアスの後にのみ展開されます(zsh
ではスペースのみ、他の多くの実装ではスペースまたはタブ)¹。デバッグ対象のプログラムに引数を渡すには、gdb
の--args
オプションも必要です。だからあなたはできる:
alias gdba='gdb --args ' # note the trailing space which does mean
# that aliases are to be expanded after it
alias ff='firefox --safe-mode'
gdba ff
¹zshはglobalエイリアス(alias -g
付き)もサポートしていますが、これはさらに多くの場所で展開されますが、firefox --safe-mode
にこのようなエイリアスを使用したくない場合もあります。たとえば、echo ff
がff
以外のものを出力しないようにする必要があります。
gdb
受け入れ引数を取得するためにエイリアスは必要ありません。
あなたの場合、それは:
gdb firefox
(gdb) set args --safe-mode