Qual è la differenza tra where e where


16

Qual è la differenza tra i comandi wheree whichshell? Ecco alcuni esempi

 ~  where cc
/usr/bin/cc
/usr/bin/cc
~  which cc
/usr/bin/cc

e

  ~  which which
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
/usr/bin/which
  ~  which where
/usr/bin/which: no where in (/usr/local/bin:/bin:/usr/bin:/home/bnikhil/bin:/bin)

anche

  ~  where which
which: aliased to alias | /usr/bin/which --tty-only --read-alias --show-dot
 --show-tilde
which: shell built-in command
/usr/bin/which
/usr/bin/which
  ~  where where
where: shell built-in command

A me sembra che facciano la stessa cosa essendo una shell incorporata, non sei sicuro di come sia diverso da un comando?

Risposte:


11

zshè una delle poche shell (essendo le altre tcsh( whichoriginate come uno cshscript per gli cshutenti, che ha anche avuto i suoi limiti, tcshlo ha reso incorporato come un miglioramento)) dove whichfa qualcosa di sensato poiché è un built-in della shell, ma in qualche modo tu o il tuo sistema operativo (tramite alcuni rcfile) lo ha rotto sostituendolo con una chiamata al whichcomando di sistema che non può fare nulla di sensato in modo affidabile poiché non ha accesso agli interni della shell, quindi non può sapere come quella shell interpreta un nome di comando .

In zsh, tutti which, type, whencee wheresono builtin comandi che sono tutti utilizzati per scoprire quali comandi sono, ma con diverse uscite. Sono tutti lì per motivi storici, puoi ottenere tutti i loro comportamenti con diversi flag al whencecomando.

Puoi ottenere i dettagli di ciò che fanno ciascuno eseguendo:

info -f zsh --index-search=which

Oppure digitare info zsh, quindi visualizzare l'indice con ie immettere il nome predefinito (il completamento è disponibile).

Ed evitare di usare /usr/bin/which. Non c'è guscio al giorno d'oggi in cui che which è necessario. Come dice Timothy, usa l'integrato fornito dalla tua shell. La maggior parte delle shell POSIX avrà il typecomando, e puoi usare command -vsolo per ottenere il percorso di un comando (sebbene entrambi typee command -vsiano opzionali in POSIX (ma non Unix, e non più in LSB), sono disponibili nella maggior parte se non in tutti Conchiglie tipo Bourne che probabilmente incontrerai mai).

(A proposito, sembra /usr/binapparire due volte nel tuo $PATH, potresti aggiungere un typeset -U pathal tuo ~/.zshrc)


2
Questo è emerso anche in una domanda precedente. Per estendere questo punto, dovresti sempre usare una shell integrata nel comando dove esiste. Quindi in bash, usa "type" invece di "which".
Tim B,

Ottima risposta e grazie anche per quel suggerimento.
nikhil,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.