SDB:Příkaz which

Přejít na: navigace, hledání


Problém

Příkaz, který zadáte v příkazové řádce, se nechová v souladu s dokumentací zobrazenou příkazem man. Potřebujete zjistit, který příkaz se ve skutečnosti spouští.

Postup

V Bashi například zadáte:

$ time -o time.out ls
bash: -o: command not found

V manuálové stránce je však volba -o uvedena. Jaký příkaz time se ve skutečnosti spouští? Pomoci může několik příkazů.

Příkaz: type

Příkaz type je tím, co hledáte. Tento příkaz do hledání zahrnuje i aliasy a vestavěné příkazy shellu.

$ type time
time is a shell keyword
$ type -a time
time is a shell keyword
time is /usr/bin/time

Další informace o klíčových slovech shellu získáte pomocí vestavěného příkazu help.

$ help time
time: time [-p] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
   and system CPU time spent executing PIPELINE when it terminates.
   The return status is the return status of PIPELINE.  The `-p' option
   prints the timing summary in a slightly different format.  This uses
   the value of the TIMEFORMAT variable as the output format.
times: times
    Print the accumulated user and system times for processes run from
   the shell.

Všimněte si, že tento příkaz time nepodporuje volbu -o. Abyste tedy mohli použít verzi, kterou popisuje manuálová stránka, musíte zadat celou cestu k tomuto příkazu.

$ /usr/bin/time -o time.out ls

Příkaz: which

Příkaz which vypíše, ve kterém z adresářů uvedených v proměnné PATH byl příkaz nalezen. Obzvláště zajímavá je volba -a, která vypíše všechny výskyty příkazu na cestě, nejen první z nich. Tento příkaz však nerozpozná aliasy ani vestavěné příkazy shellu.

$ which time
/usr/bin/time

Mějte také na paměti, že ve standardní instalaci systému ve verzi 10.2 je příkaz which v souboru /etc/bash.bashrc definován jako funkce shellu a nejedná se tedy o program v adresáři /usr/bin:

$ type -a which
which is aliased to `_which'
which is /usr/bin/which
$ type -a _which
_which is a function
_which () 
{ 
   local file=$(type -p ${1+"$@"} 2>/dev/null);
   if test -n "$file" -a -x "$file"; then
       echo "$file";
       return 0;
   fi;
   hash -r;
   type -P ${1+"$@"}
}

Odkazy

Daemon Dancing in the Dark blog - Does anybody really know what time it is?

<keyword>bash,shell,which,type</keyword>