GNU/Linux >> Znalost Linux >  >> Linux

proč gdb nemá rád aliasy

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 .


Linux
  1. Jak používat aliasy shellu v Linuxu

  2. Definujte alias, který odkazuje na jiné aliasy

  3. Proč Bash `(())` nefunguje uvnitř `[[]]`?

  1. Proč vytvořit odkaz jako je tento:ln -nsf?

  2. Proč nemůžete jednoduše dd CD Audio jako obyčejné datové CD?

  3. Proč wget neověřuje certifikáty SSL?

  1. 10 praktických aliasů Bash pro Linux

  2. Aliasy příkazového řádku v prostředí Linux

  3. Jak vytvořit aliasy kláves příkazového řádku v Linuxu