Los alias son una característica del shell. La definición de un alias crea un nuevo nombre de comando de shell. Solo lo reconoce el shell y solo cuando aparece como un nombre de comando.
Por ejemplo, si escribe
> ff
en un indicador de shell, invocará su alias, pero si escribe
> echo ff
el ff
es solo un argumento, no un comando. (Al menos en bash, puede jugar algunos trucos si la definición del alias termina con un espacio. Vea la respuesta de Stéphane Chazelas para una posible solución si está decidido a usar alias de shell).
Escribiste
> gdb ff
por lo que el shell invocó gdb
, pasándole la cadena ff
como argumento.
Puede pasar argumentos al programa depurado a través de gdb
línea de comando, pero tienes que usar el --args
opción. Por ejemplo:
> gdb firefox --safe-mode
intenta (y falla) tratar --safe-mode
como opción a gdb
. Para ejecutar el comando con un argumento, puede hacerlo manualmente:
> gdb firefox
...
(gdb) run --safe-mode
o, como me recuerda la respuesta de thrig, puedes usar --args
:
> gdb --args firefox --safe-mode
...
(gdb) run
(El primer argumento que sigue a --args
es el nombre del comando; todos los argumentos restantes se pasan al comando invocado).
Es posible extraer los argumentos de un alias de shell, pero recomendaría simplemente definir un alias separado:
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
O, mejor, usa funciones de shell, que son mucho más versátiles. El manual de bash dice:
Para casi todos los propósitos, las funciones de shell son preferibles a los alias.
No directamente, pero es posible con algunas disputas de alias de shell ZSH en una forma adecuada para gdb
.
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
Esto divide el alias (un código más robusto verificaría si el primer argumento es realmente un alias, o incluso si está configurado, etc.) como lo haría ZSH y luego alimenta esos argumentos a gdb
a través del práctico --args
bandera (ver info gdb invocation
). Si luego ejecutamos 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)
lo que muestra que echo
(mi implementación de ensamblaje de echo
, de todos modos) fue ejecutado por gdb
con los argumentos del alias.
(Esto probablemente fallará en los alias globales, o cualquier alias con el metacarácter de shell foo, tal vez, dependiendo de si gdb arroja esos argumentos a través de un shell compatible con cualquier cosa que pueda establecerse en ZSH, pero debería estar bien para el simple x='y z'
escribir cosas. Tal vez.)
En los shells POSIX, los alias solo se expanden en la posición de comando (donde se espera un comando) o después de los alias cuya expansión termina en un carácter en blanco (en zsh
, solo un espacio, y en muchas otras implementaciones, solo espacio o pestaña)¹. También necesitas el --args
opción a gdb
para poder pasar argumentos al programa que se está depurando. Entonces puedes hacer:
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 también es compatible con global alias (con alias -g
) que se expanden en muchos más lugares, pero probablemente no quiera usar un alias de este tipo para su firefox --safe-mode
aquí ya que no querrías echo ff
por ejemplo, para generar cualquier cosa que no sea ff
.