![gdbがエイリアスが好きではない理由[重複]](https://linux33.com/image/127186/gdb%E3%81%8C%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%81%8C%E5%A5%BD%E3%81%8D%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1%5B%E9%87%8D%E8%A4%87%5D.png)
エイリアスを作成し、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
実行されません。
誰でも問題が何であるかを理解できますか?
答え1
エイリアスはシェルの機能です。エイリアスを定義すると、新しいシェルコマンド名が生成されます。これはシェルでのみ認識され、コマンド名で表示される場合にのみ認識されます。
たとえば、次のように入力すると
> ff
シェルプロンプトでエイリアスを呼び出しますが、次のように入力すると
> echo ff
これはff
コマンドではなくパラメータにすぎません。 (少なくともbashでは、エイリアス定義が空白で終わる場合は、いくつかのトリックを使用できます。Stefan Chazerasの答えシェルエイリアスを使用することにした場合は、考えられる回避策をご覧ください。 )
あなたは入力
> gdb ff
したがって、シェルは文字列を引数として渡してgdb
呼び出されます。ff
コマンドラインを介してデバッグしているプログラムに引数を渡すことはできますが、gdb
このオプションを使用する必要があります--args
。たとえば、
> gdb firefox --safe-mode
引数を使用してコマンドを実行するには、手動--safe-mode
でgdb
実行できます。
> gdb firefox
...
(gdb) run --safe-mode
または、次のようにトリガーの答え以下が利用可能であることを思い出してください--args
。
> gdb --args firefox --safe-mode
...
(gdb) run
(次の最初の引数--args
はコマンド名です。残りの引数はすべて呼び出されたコマンドに渡されます。)
シェルエイリアスからパラメータを抽出することは可能ですが、別々のエイリアスを定義することをお勧めします。
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
あるいは、より多様な機能を提供するシェル機能を使用する方がよいでしょう。 Bashのマニュアルは次のように言います:
ほとんどすべての目的で、シェル関数はエイリアスより優れています。
答え2
直接ではありませんが、ZSHシェルエイリアスをgdb
。
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
これはZSHのようにエイリアスを分割し(より強力なコードでは、最初の引数が実際にエイリアスであるか設定されているかなどを確認します)、便利なフラグを使用してその引数をgdb
提供--args
します(参考文献を参照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
エイリアスのパラメータを介して実行されます。
(これは、グローバルエイリアスまたはシェルメタ文字fooを持つエイリアスで壊れる可能性があります。gdbがZSHに設定されているものと互換性のあるシェルを介してこれらの引数をスローするかどうかによって異なりますが、単純なx='y z'
タイプの場合は問題ありません。)
答え3
POSIXシェルでは、エイリアスはコマンドの場所(コマンドが必要な場所)でのみ拡張されるか、スペース文字で終わるエイリアス(zsh
他の多くの実装ではスペースまたはタブのみ)を展開した後にのみ拡張されます。デバッグしているプログラムにパラメータを渡すオプションも必要です--args
。gdb
だからあなたはこれを行うことができます:
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もサポートグローバルエイリアス(含む)はより多くの場所に拡張されますが。以外の項目を出力したくないので、ここではそのようなエイリアスを使いたくalias -g
ないでしょう。firefox --safe-mode
echo ff
ff
答え4
許可されたパラメータを取得するためにエイリアスは必要ありませんgdb
。
あなたの場合は次のとおりです。
gdb firefox
(gdb) set args --safe-mode