Les alias sont une fonctionnalité du shell. La définition d'un alias crée un nouveau nom de commande shell. Il n'est reconnu que par le shell et uniquement lorsqu'il apparaît en tant que nom de commande.
Par exemple, si vous tapez
> ff
à une invite du shell, il invoquera votre alias, mais si vous tapez
> echo ff
le ff
est juste un argument, pas une commande. (Au moins dans bash, vous pouvez jouer quelques tours si la définition de l'alias se termine par un espace. Voir la réponse de Stéphane Chazelas pour une solution possible si vous êtes déterminé à utiliser des alias shell.)
Vous avez tapé
> gdb ff
donc le shell a invoqué gdb
, en lui passant la chaîne ff
comme argument.
Vous pouvez passer des arguments au programme débogué via le gdb
ligne de commande, mais vous devez utiliser le --args
option. Par exemple :
> gdb firefox --safe-mode
essaie (et échoue) de traiter --safe-mode
en option sur gdb
. Pour exécuter la commande avec un argument, vous pouvez le faire manuellement :
> gdb firefox
...
(gdb) run --safe-mode
ou, comme me le rappelle la réponse de thrig, vous pouvez utiliser --args
:
> gdb --args firefox --safe-mode
...
(gdb) run
(Le premier argument après --args
est le nom de la commande ; tous les arguments restants sont passés à la commande invoquée.)
Il est possible d'extraire les arguments d'un alias de shell, mais je vous recommande de définir simplement un alias séparé :
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
Ou, mieux, utilisez les fonctions du shell, qui sont beaucoup plus polyvalentes. Le manuel bash dit :
Dans presque tous les cas, les fonctions shell sont préférées aux alias.
Pas directement, mais c'est possible avec quelques disputes d'alias de shell ZSH dans une forme adaptée à gdb
.
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
Cela divise l'alias (un code plus robuste vérifierait si le premier argument est bien un alias, ou même est défini, etc.) comme le ferait ZSH, puis transmet ces arguments à gdb
via le pratique --args
drapeau (voir info gdb invocation
). Si nous exécutons ensuite 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)
qui montre que echo
(mon implémentation d'assemblage de echo
, de toute façon) a été exécuté par gdb
avec les arguments de l'alias.
(Cela se cassera probablement sur les alias globaux, ou tout alias avec le métacaractère shell foo, peut-être, selon que gdb lance ces arguments via un shell compatible avec tout ce qui pourrait être défini dans ZSH, mais devrait convenir pour le simple x='y z'
taper des trucs. Peut-être.)
Dans les shells POSIX, les alias ne sont développés qu'en position de commande (là où une commande est attendue) ou après les alias dont le développement se termine par un caractère blanc (en zsh
, uniquement un espace et, dans de nombreuses autres implémentations, uniquement un espace ou une tabulation)¹. Vous avez également besoin du --args
option à gdb
pour pouvoir passer des arguments au programme en cours de débogage. Vous pouvez donc :
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 prend également en charge global alias (avec alias -g
) qui sont développés à de nombreux autres endroits, mais vous ne voudriez probablement pas utiliser un tel alias pour votre firefox --safe-mode
ici car vous ne voudriez pas echo ff
par exemple pour afficher autre chose que ff
.