Gli alias sono una caratteristica della shell. La definizione di un alias crea un nuovo nome di comando della shell. Viene riconosciuto solo dalla shell e solo quando appare come nome di comando.
Ad esempio, se digiti
> ff
al prompt della shell, richiamerà il tuo alias, ma se digiti
> echo ff
il ff
è solo un argomento, non un comando. (Almeno in bash, puoi giocare qualche trucco se la definizione dell'alias termina con uno spazio. Vedi la risposta di Stéphane Chazelas per una possibile soluzione se sei determinato a usare gli alias della shell.)
Hai digitato
> gdb ff
quindi la shell ha invocato gdb
, passandogli la stringa ff
come argomento.
Puoi passare argomenti al programma sottoposto a debug tramite gdb
riga di comando, ma devi usare il --args
opzione. Ad esempio:
> gdb firefox --safe-mode
tenta (e fallisce) di trattare --safe-mode
come opzione a gdb
. Per eseguire il comando con un argomento, puoi farlo manualmente:
> gdb firefox
...
(gdb) run --safe-mode
oppure, come mi ricorda la risposta di thrig, puoi usare --args
:
> gdb --args firefox --safe-mode
...
(gdb) run
(Il primo argomento che segue --args
è il nome del comando; tutti gli argomenti rimanenti vengono passati al comando richiamato.)
È possibile estrarre gli argomenti da un alias della shell, ma ti consiglio di definire semplicemente un alias separato:
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
O, meglio, usa le funzioni della shell, che sono molto più versatili. Il manuale di bash dice:
Per quasi tutti gli scopi, le funzioni di shell sono preferite agli alias.
Non direttamente, ma è possibile con alcune discussioni sugli alias della shell ZSH in una forma adatta a gdb
.
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
Questo divide l'alias (un codice più robusto controllerà se il primo argomento è effettivamente un alias, o addirittura è impostato, ecc.) come farebbe ZSH e poi invia quegli argomenti a gdb
tramite il comodo --args
flag (vedi info gdb invocation
). Se poi eseguiamo 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)
che mostra che echo
(la mia implementazione in assembly di echo
, comunque) era eseguito da gdb
con gli argomenti dell'alias.
(Questo probabilmente si romperà sugli alias globali o su qualsiasi alias con il metacarattere della shell foo, forse, a seconda che gdb lanci quegli argomenti attraverso una shell compatibile con qualsiasi cosa che potrebbe essere impostata in ZSH, ma dovrebbe andare bene per il semplice x='y z'
tipo roba. Forse.)
Nelle shell POSIX, gli alias vengono espansi solo nella posizione di comando (ovunque sia previsto un comando) o dopo gli alias la cui espansione termina con un carattere vuoto (in zsh
, solo uno spazio e, in molte altre implementazioni, solo spazio o tab)¹. Ti serve anche il --args
opzione a gdb
per poter passare argomenti al programma sottoposto a debug. Quindi puoi fare:
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 supporta anche global alias (con alias -g
) che sono espansi in molti altri posti, ma probabilmente non vorrai usare un tale alias per il tuo firefox --safe-mode
qui perché non vorresti echo ff
ad esempio per generare qualcosa di diverso da ff
.