Aliasy jsou rysem shellu. Definováním aliasu se vytvoří nový název příkazu shellu. Je rozpoznán pouze shellem a pouze tehdy, když se objeví jako název příkazu.
Pokud například napíšete
> ff
na příkazovém řádku shellu vyvolá váš alias, ale pokud napíšete
> echo ff
ff
je jen argument, ne příkaz. (Alespoň v bash si můžete zahrát nějaké triky, pokud definice aliasu končí mezerou. Podívejte se na odpověď Stéphana Chazelase na možné řešení, pokud jste rozhodnuti používat aliasy shellu.)
Zadali jste
> gdb ff
takže shell vyvolal gdb
, předejte mu řetězec ff
jako argument.
Argumenty můžete předat laděnému programu pomocí gdb
příkazového řádku, ale musíte použít --args
volba. Například:
> gdb firefox --safe-mode
se pokusí (a selže) ošetřit --safe-mode
jako možnost gdb
. Chcete-li příkaz spustit s argumentem, můžete to provést ručně:
> gdb firefox
...
(gdb) run --safe-mode
nebo, jak mi připomíná odpověď thrig, můžete použít --args
:
> gdb --args firefox --safe-mode
...
(gdb) run
(První argument za --args
je název příkazu; všechny zbývající argumenty jsou předány vyvolanému příkazu.)
Je možné extrahovat argumenty z aliasu shellu, ale já bych doporučil definovat samostatný alias:
alias ff='firefox --safe-mode'
alias gdbff='gdb --args firefox --safe-mode'
Nebo, lépe, použijte funkce shellu, které jsou mnohem univerzálnější. Manuál bash říká:
Téměř pro každý účel jsou funkce shellu preferovány před aliasy.
Ne přímo, ale je to možné s určitým přetahováním aliasů shellu ZSH do tvaru vhodného pro gdb
.
alias testtest='echo test test test'
function gdb-alias() {
local cmdargs
cmdargs=( ${(z)${aliases[$1]}} )
gdb -q --args $cmdargs
}
Tím se alias rozdělí (robustnější kód by zkontroloval, zda je první argument skutečně alias, nebo je dokonce nastaven atd.), jako by to udělal ZSH, a poté tyto argumenty přivede na gdb
prostřednictvím praktického --args
příznak (viz info gdb invocation
). Pokud potom spustíme 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)
což ukazuje, že echo
(moje implementace sestavy echo
, každopádně) byl provozován gdb
s argumenty z aliasu.
(To se pravděpodobně zlomí u globálních aliasů nebo jakýchkoli aliasů s metaznakem shellu foo, možná, v závislosti na tom, zda gdb hodí tyto argumenty přes shell kompatibilní s čímkoli, co by mohlo být nastaveno v ZSH, ale mělo by být v pořádku pro jednoduché x='y z'
typ věci. Možná.)
V shellech POSIX jsou aliasy rozbaleny pouze na pozici příkazu (kdekoli se očekává příkaz) nebo za aliasy, jejichž rozšíření končí prázdným znakem (v zsh
, pouze mezera a v mnoha dalších implementacích pouze mezera nebo tabulátor)¹. Potřebujete také --args
možnost gdb
aby bylo možné předávat argumenty laděnému programu. Takže můžete:
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 také podporuje globální aliasy (s alias -g
), které jsou rozšířeny na mnoha dalších místech, ale pravděpodobně byste nechtěli použít takový alias pro firefox --safe-mode
zde, jak byste nechtěli echo ff
například pro výstup čehokoli jiného než ff
.