Již dříve jsem byl frustrován rozdíly ve výstupu z which
příkazy napříč různými platformami (Linux vs. Solaris vx. OS X), přičemž do věci mohou hrát také různé shelly. type
bylo navrženo jako lepší alternativa, ale jak přenosné by to bylo?
V minulosti jsem psal funkce, které analyzují výstup which
a zvládnout různé případy použití, se kterými jsem se setkal. Fungují na všech počítačích, které používám, a tak jsou v pořádku pro mé osobní skripty, ale zdá se mi to strašně nespolehlivé u softwaru, který se chystám někam umístit, aby ho mohli používat ostatní.
Abychom uvedli jen jeden možný příklad, předpokládejme, že musím ze skriptu zjistit, zda jsou na počítači dostupné bash a zsh, a poté spustit příkaz s příkazem zsh, pokud je přítomen, as bash, pokud zsh není a bash je dostatečný. verze, aby neměl konkrétní chybu. Většina zbytku skriptu by mohla být Bourne Shell nebo Ruby nebo cokoli jiného, ale tato jedna konkrétní věc musí být provedena (AFAIK) buď s zsh, nebo s nejnovější verzí bash.
Mohu počítat s type
dostupnost napříč platformami? Existuje nějaká jiná alternativa k which
který může snadno a konzistentně odpovědět na otázku, zda je nainstalován konkrétní software?
(Pokud chcete také uvést nápady konkrétně související s příkladem, který jsem uvedl, je to skvělé, ale hlavně se ptám na obecný případ:jaký je nejspolehlivější způsob, jak zjistit, zda je konkrétní věc nainstalována na daném počítači ?)
Přijatá odpověď:
V 21. století, zvláště pokud cílíte na stroje, které pravděpodobně mají bash nebo zsh, můžete počítat s type
být k dispozici. (Neexistoval v extrémně starých unicích, jako v roce 1970 nebo začátkem 80. let.) Nemůžete počítat s tím, že jeho výstup bude něco znamenat, ale můžete počítat s tím, že vrátí 0, pokud existuje příkaz s tímto jménem a jinak nenulová.
which
není standardní a v praxi nespolehlivé. type
je doporučená alternativa. whereis
trpí stejnými problémy jako which
a je méně častý. whence
je specifický pro ksh a zsh.
Pokud je to možné, bylo by spolehlivější otestovat existenci příkazu a otestovat, zda jeho chování vypadá rozumně. Například otestujte přítomnost vhodné verze bash spuštěním bash -c 'somecommand'
, např.
# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …
Dnes můžete počítat téměř se vším ve specifikaci Singe UNIX verze 2 (kromě exotických věcí jako Fortran a SCCS, které jsou každopádně volitelné). Můžete se spolehnout i na většinu verze 3, ale to ještě není úplně všude implementováno. Podpora verze 4 je útržkovitější. Pokud se chystáte číst tyto specifikace, doporučuji přečíst si verzi 3, která je mnohem čitelnější a méně nejednoznačná než verze 2.
Související:Jak zkopírovat rozložení diskových oddílů celého disku pomocí standardních nástrojů?
Příklady, jak zjistit specifika systému, najdete v autoconf a configure
skripty různého softwaru.