GNU/Linux >> Znalost Linux >  >> Linux

Shebangy nezávislé na cestě?

Mám skript, který chci spustit na dvou počítačích. Tyto dva stroje získávají kopie skriptu ze stejného úložiště git. Skript musí běžet se správným interpretem (např. zsh ).

Bohužel obě env a zsh žijí na různých místech v místních a vzdálených počítačích:

Vzdálený počítač

$ which env
/bin/env

$ which zsh
/some/long/path/to/the/right/zsh

Místní počítač

$ which env
/usr/bin/env

$which zsh
/usr/local/bin/zsh

Jak mohu nastavit shebang tak, aby byl skript spuštěn jako /path/to/script.sh vždy používá Zsh dostupné v PATH ?

Přijatá odpověď:

Nemůžete to vyřešit přímo pomocí shebang, protože shebang je čistě statický. Co byste mohli udělat, je mít nějaký »nejméně společný násobič« (z pohledu shellu) v shebang a znovu spustit skript se správným shellem, pokud tento LCM není zsh. Jinými slovy:Nechte svůj skript spustit pomocí shellu nalezeného na všech systémech, otestujte zsh -pouze funkce a pokud test dopadne špatně, použijte skript exec pomocí zsh , kde test uspěje a vy jen pokračujete.

Jedna jedinečná funkce v zsh , je například přítomnost $ZSH_VERSION proměnná:

#!/bin/sh -

[ -z "$ZSH_VERSION" ] && exec zsh - "$0" ${1+"[email protected]"}

# zsh-specific stuff following here
echo "$ZSH_VERSION"

V tomto jednoduchém případě je skript nejprve spuštěn pomocí /bin/sh (všechny systémy podobné Unixu po 80. letech rozumí #! a mít /bin/sh , buď Bourne nebo POSIX, ale naše syntaxe je kompatibilní s oběma). Pokud $ZSH_VERSION není set, skript exec 's sám přes zsh . Pokud $ZSH_VERSION je nastaveno (resp. skript již běží přes zsh ), test je jednoduše přeskočen. Voilà.

Toto selže pouze v případě, že zsh není v $PATH vůbec.

Upravit: Abyste se ujistili, musíte pouze exec zsh na obvyklých místech můžete použít něco jako

for sh in /bin/zsh 
          /usr/bin/zsh 
          /usr/local/bin/zsh; do
    [ -x "$sh" ] && exec "$sh" - "$0" ${1+"[email protected]"}
done

To by vás mohlo zachránit před nechtěným exec něco ve vaší $PATH což není zsh očekáváte.

Související:Citace v konstrukcích typu ssh $host $FOO a ssh $host „sudo su user -c $FOO“?
Linux
  1. Jak ladit Bash skript?

  2. Časový limit ve skriptu Shell?

  3. ${!foo} A Zsh?

  1. Určení cesty ke zdrojovému skriptu Shell?

  2. Kontrola, zda skript běží?

  3. Získat úplnou cestu ze skriptu Bash?

  1. Backspace v Zsh zaseknutý?

  2. One-liner vs Script?

  3. Jak ve skriptu Python nastavím PYTHONPATH?