Jako většina uživatelů mám nastavenou spoustu aliasů, které poskytují výchozí sadu příznaků pro často používané programy. Například,
alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Problém je v tom, že pokud chci použít which
abych viděl, kde mám vim
/grep
/ls
/etc přichází z, alias překáží:
$ which vim
vim: aliased to vim -X
Toto je užitečný výstup, ale ne to, co v tomto případě hledám; Znám vim
má alias vim -X
ale chci vědět, kde to vim
pochází z.
Krátce k dočasnému zrušení definice aliasu, abych mohl použít which
existuje snadný způsob, jak mít which
‚rozbalit‘ alias a spustit se na něm?
Upravit: Zdá se, že which
je shell-builtin s různým chováním v různých shellech. V Bash, SiegeX návrh --skip-alias
vlajková díla; nicméně jsem na Zsh. Existuje tam něco podobného?
Přijatá odpověď:
which
je ve skutečnosti špatný způsob, jak dělat takové věci, protože vytváří odhady o vašem prostředí na základě $SHELL
a spouštěcí soubory (myslí si), které shell používá; nejen, že někdy hádá špatně, ale obecně mu nemůžete říct, aby se choval jinak. (which
na mém Ubuntu 10.10 nerozumí --skip-alias
jak uvádí například @SiegeX.) type
používá aktuální prostředí shellu místo toho, aby se šťoural do vašich konfiguračních souborů, a lze mu říct, aby ignoroval části tohoto prostředí, takže vám ukáže, co se skutečně stane, místo toho, co by se stalo při rekonstrukci vašeho výchozího shellu.
V tomto případě type -P
obejde všechny aliasy nebo funkce:
$ type -P vim
/usr/bin/vim
Můžete jej také požádat, aby odloupl všechny vrstvy, jednu po druhé, a ukáže vám, co najde:
$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim
(Rozšíříme to z komentářů:)
Problém s which
je, že je to obvykle externí program místo vestavěného shellu, což znamená, že nevidí vaše aliasy nebo funkce a musí se je pokusit rekonstruovat ze spouštěcích/konfiguračních souborů shellu. (Pokud je to vestavěný shell, jako je tomu v zsh
ale zjevně ne bash
, je pravděpodobnější, že použije prostředí shellu a udělá správnou věc.)
type
je příkaz kompatibilní s POSIX, který se musí chovat, jako by byl vestavěný (to znamená, že musí používat prostředí shellu, ze kterého je vyvolán, včetně místních aliasů a funkcí), takže obvykle je em> vestavěný.
Obecně se v csh
nenachází /tcsh
, ačkoli ve většině moderních verzí těch which
je vestavěný shell a dělá správnou věc; někdy je vestavěný what
místo toho a někdy není dobrý způsob, jak vidět aktuální prostředí shellu z csh
/tcsh
vůbec.