17. december

which, type, where?

Dagens kommandoer er which, type og where.

Hvis man bruger tcsh eller zsh som kommandofortolker, kan man få et godt indtryk af 'which' ved simpelthen at skrive 'which which', det giver svaret:

which: shell built-in command

(Desværre giver bash, som er standardkommandofortolker i de fleste distributioner, intet svar.)

Det vi kan læse her er at 'which' er en indbygget kommando i kommandofortolkeren, men vi kan også regne ud hvad kommandoen gør. Den fortæller nemlig hvilken kommando kommandofortilken vil udføre, et måske lidt mere illustrativt eksempel:

which man
vil oftest give
/usr/bin/man
hvilket fortæller at kommandofortolkeren vil udføre programmet der ligger i /usr/bin/man når man taster 'man'.

Der kan være flere grunde til at ønske at vide hvilket program der rent faktisk bliver udført, f.eks. at man gerne vil vide om det er et script til kommandofortolkeren så man har en chance for at rette i det. Vi har allerede set to andre programmer der i mange tilfælde vil kunne bruges til det samme nemlig 'find' (den 2. december) og 'locate' (den 16. december), men der er visse fordele forbundet med which. For det første er det meget hurtigere end specielt 'find' men også 'locate'. Derudover vil både 'find' og 'locate' (alt efter hvor præcis man gør sin søgning, også returnere både manualsider og evt. biblioteker med matchende navne. Den væsentligste grund er dog at ingen af dem kan finder kommandoer der er indbygget i kommandofortolkeren. Det er specielt interessant i de tilfælde hvor kommandofortolkeren har indbygget kommandoer der også findes som programmer på systemet, eller håndtere aliaser. Mange steder er 'which' selv et eksempel på en kommando der både findes indbygget i kommandofortolkeren og som selvstændigt program. F.eks. vil 'locate ll' sjældent give et brugbart resultat, mens 'which ll' på mit system vil svare

ll: aliased to ls -l

I gamle dage var 'which' tit et alias for 'type -p' (eller noget lignende), og 'type' kan da også give de samme informationer, men er lidt mere generel. Den væsentligste ting 'type' kan er dog at give samtlige forekomster af mulige kommandoer med et givet navn, en facilitet der i kommandofortolkerne tcsh og zsh ligger i 'where' (som desværre ikke findes i bash). F.eks. giver 'where pwd' på mit system svaret:

pwd: aliased to /bin/pwd
pwd: shell built-in command
/bin/pwd

Hvis vi starter nedefra kanman altså se at der er et program der hedder '/bin/pwd' og en indbygget funktion i kommandofortolkeren der hedder 'pwd' og at jeg har gjort 'pwd' til et alias for '/bin/pwd' (det er en måde at omgå kommandofortolkerens indbygget kommando på) fordi jeg foretrækker den.

Når jeg nu flere gange har nævnt diverse kommandofortolkere vil jeg lige slutte af med at nævne at i zsh er alle disse kommandoer specialtilfælde af den indbyggede kommando 'whence', som kan mere endnu, men det ligger udenfor dagens emne.