shi*_*ish 10 linux shell alias gdb
我创建了一个别名ff并从~/.zsh/aliases.zsh.
别名本身运行良好:
alias ff
ff='firefox --safe-mode'
Run Code Online (Sandbox Code Playgroud)
它按预期运行。
但是当我尝试在下面运行它时,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
Run Code Online (Sandbox Code Playgroud)
我尝试使用,gdb firefox --safe-mode但不会运行。
有人可以识别出什么问题吗?
Kei*_*son 20
别名是 shell 的一个特性。定义别名会创建一个新的 shell 命令名称。它只能被 shell 识别,并且只有当它作为命令名称出现时。
例如,如果您键入
> ff
Run Code Online (Sandbox Code Playgroud)
在 shell 提示符下,它会调用您的别名,但如果您键入
> echo ff
Run Code Online (Sandbox Code Playgroud)
这ff只是一个参数,而不是命令。(至少在 bash 中,如果别名定义以空格结尾,您可以玩一些技巧。如果您决定使用 shell 别名,请参阅Stéphane Chazelas 的答案以获取可能的解决方案。)
你打字
> gdb ff
Run Code Online (Sandbox Code Playgroud)
所以外壳调用了gdb,将字符串ff作为参数传递给它。
您可以通过gdb命令行将参数传递给被调试的程序,但您必须使用该--args选项。例如:
> gdb firefox --safe-mode
Run Code Online (Sandbox Code Playgroud)
尝试(但失败)将其--safe-mode视为gdb. 要使用参数运行命令,您可以手动执行此操作:
> gdb firefox
...
(gdb) run --safe-mode
Run Code Online (Sandbox Code Playgroud)
或者,正如thrig 的回答提醒我的那样,您可以使用--args:
> gdb --args firefox --safe-mode
...
(gdb) run
Run Code Online (Sandbox Code Playgroud)
(后面的第一个参数--args是命令名称;所有剩余的参数都传递给调用的命令。)
可以从 shell 别名中提取参数,但我建议只定义一个单独的别名:
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
Run Code Online (Sandbox Code Playgroud)
或者,更好的是使用 shell 函数,它的用途要广泛得多。bash手册说:
对于几乎所有用途,shell 函数都比别名更受欢迎。
不是直接的,但是可以通过将 ZSH shell 别名进行一些处理来转换为适合gdb.
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
Run Code Online (Sandbox Code Playgroud)
这会像 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)
Run Code Online (Sandbox Code Playgroud)
这表明echo(无论如何,我的程序集实现echo)是gdb使用别名中的参数运行的。
(这可能会中断全局别名,或者任何带有 shell 元字符 foo 的别名,这可能取决于 gdb 是否通过与 ZSH 中设置的任何内容兼容的 shell 抛出这些参数,但对于简单x='y z'类型的东西应该没问题。也许。 )