which, whereis și type în Linux / Bash

Ajutor și căutarea comenzilor debianutils / GNU which, util-linux (whereis), Bash built-in (type)

Află ce program rulează de fapt când scrii o comandă: fișierul din PATH, o comandă internă, un alias sau o funcție.

Sintaxă comandă
which [-a] comandă
whereis [-b] [-m] comandă
type [-a] [-t] nume
command -v nume

Ce face which, whereis și type

Când scrii o comandă, shell-ul caută în ordine: aliasuri, cuvinte cheie, funcții, comenzi interne (built-in) și abia apoi programe în directoarele din PATH. Comenzile din această pagină îți spun ce a găsit.

which caută doar în PATH și afișează calea fișierului executabil. whereis caută și pagina de manual și sursele. type este o comandă internă Bash și este cea mai exactă: recunoaște și aliasurile, funcțiile și comenzile interne, pe care which nu le vede.

În scripturi, pentru a verifica dacă o comandă există, se recomandă command -v: este standard POSIX, este internă shell-ului și întoarce un cod de ieșire diferit de 0 dacă numele nu există.

Opțiuni și argumente

Opțiune / Parametru Descriere
which -a Afișează toate potrivirile din PATH, nu doar prima.
whereis -b / -m Doar fișierele binare / doar paginile de manual.
type -t Afișează doar tipul: alias, keyword, function, builtin sau file.
type -a Toate locurile unde există numele (de exemplu și comanda internă, și fișierul).
command -v Afișează numele sau calea și întoarce 0 dacă există; potrivită pentru scripturi.

Exemple

Exemplul 1: Unde se află un program

which dă calea executabilului, iar whereis adaugă și pagina de manual.

which python3
whereis tar

Ieșire în terminal

/usr/bin/python3
tar: /usr/bin/tar /usr/share/man/man1/tar.1.gz

Exemplul 2: Ce fel de nume este fiecare

type recunoaște comenzile interne, cuvintele cheie și funcțiile definite în shell, pe care which nu le poate găsi.

salut() { echo "Salut, Ana!"; }
type cd
type -t if
type -t salut
type -t cd

Rezultat

cd is a shell builtin
keyword
function
builtin

Exemplul 3: Verificarea unei dependențe într-un script

command -v întoarce cod diferit de 0 când comanda lipsește, așa că scriptul poate afișa un mesaj clar în loc să eșueze mai târziu.

for unealta in printf comanda_inexistenta; do
  if command -v "$unealta" > /dev/null; then
    echo "$unealta: există"
  else
    echo "$unealta: lipsește, instaleaz-o înainte"
  fi
done

Rezultat

printf: există
comanda_inexistenta: lipsește, instaleaz-o înainte

Greșeli frecvente

  • Folosirea lui which pentru aliasuri sau funcții: nu le vede. Folosește type.
  • Verificarea existenței unei comenzi în scripturi cu which: comportamentul și mesajele diferă între distribuții; command -v este standard.
  • Uitarea faptului că Bash ține minte căile găsite (hash): după ce muți un program, rulează hash -r.

Comenzi înrudite

  • man: Deschide manualul oficial al unei comenzi, al unui fișier de configurare sau al unei funcții, direct în terminal.
  • locate: Găsește fișiere după nume aproape instantaneu, căutând într-o bază de date actualizată periodic cu updatedb.
  • alias: Creează scurtături personalizate și memorabile pentru comenzi lungi sau frecvente.
  • export: Transformă o variabilă de shell într-o variabilă de mediu (environment variable) accesibilă proceselor copil.