GNU/Linux >> Znalost Linux >  >> Linux

Nejlepší způsob, jak zjistit (ze skriptu), zda je software nainstalován?

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.


Linux
  1. Je možné načíst obsah běžícího bash skriptu z RAM

  2. Bash skript pro odstranění nejstaršího souboru ze složky

  3. Jaký je nejlepší způsob, jak zkontrolovat, zda je svazek připojen ve skriptu Bash?

  1. Zabránění souběžnému spuštění bash skriptu

  2. Bash skript k odstranění nejstaršího souboru ze složky?

  3. „Správný“ způsob, jak otestovat, zda služba běží ve skriptu?

  1. Zjistit, zda je klávesa stisknuta ze skriptu?

  2. Jaký souborový systém je nejlepší zálohovat?

  3. Nejlepší způsob, jak zrušit všechny úlohy Slurm z výstupu příkazů Shell?