GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué a gdb no le gustan los alias?

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 .


Linux
  1. 10 prácticos alias de Bash para Linux

  2. Cómo usar alias de shell en Linux

  3. ¿Por qué `\d` no funciona en expresiones regulares en sed?

  4. ¿Por qué la compresión Gzip no elimina los fragmentos de datos duplicados?

  5. ¿Por qué el puente de Linux no funciona?

15 alias de línea de comandos para ahorrar tiempo

Cómo crear alias de Bash

Cómo crear alias de dominio

Comando de alias de Linux

¿Por qué no puede simplemente agregar CD Audio como un CD de datos ordinario?

¿Por qué wget no verifica los certificados SSL?