GNU/Linux >> Znalost Linux >  >> Linux

Jak může bash skript znát adresář, ve kterém je nainstalován, když je zdrojem . operátor?

Věřím, že $(dirname "$BASH_SOURCE") bude dělat, co chcete, pokud soubor, který získáváte, není symbolický odkaz.

Pokud soubor, který získáváte, může být symbolický odkaz, můžete udělat něco jako následující, abyste získali skutečný adresář:

PRG="$BASH_SOURCE"
progname=`basename "$BASH_SOURCE"`

while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done

dir=$(dirname "$PRG")

Zde je to, co by mohlo být elegantním řešením:

script_path="${BASH_SOURCE[0]}"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"

To však nebude fungovat při získávání odkazů. V takovém případě by se to dalo

script_path="$(readlink -f "$(readlink "${BASH_SOURCE[0]}")")"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"

Věci k poznámce:

  • pole jako ${array[x]} nejsou kompatibilní s POSIX - ale pak BASH_SOURCE pole je každopádně dostupné pouze v Bash
  • v systému macOS, nativní BSD readlink nepodporuje -f , takže možná budete muset nainstalovat GNU readlink pomocí např. vařit podle brew install coreutils a nahraďte readlink podle greadlink
  • v závislosti na vašem případu použití možná budete chtít použít -e nebo -m přepínače namísto -f plus možná -n; podrobnosti naleznete na manuálové stránce readlink

Jiný pohled na problém - pokud používáte "." Chcete-li nastavit proměnné prostředí, dalším standardním způsobem, jak toho dosáhnout, je mít ve skriptu příkazy pro nastavení proměnné echo, např.:

# settings.sh
echo export CLASSPATH=${CLASSPATH}:/foo/bar

potom vyhodnoťte výstup:

eval $(/path/to/settings.sh)

Tak fungují balíčky jako moduly. Tento způsob také usnadňuje podporu shellů odvozených od sh (X=...; export X ) a csh (setenv X ... )


Linux
  1. Jak zastavit skript Loop Bash v terminálu?

  2. Opravit skript Bash Očekávání vstupu cesty s / Na konci se přeruší, když cesta nekončí na /?

  3. Jak mohu otestovat svůj Bash skript na starších verzích Bash?

  1. Jak mohu nainstalovat nejnovější Anacondu s wget

  2. Jak spustit bash skript?

  3. Jak mohu získat obsah v barvách při čtení souboru s „méně“ nebo „více“?

  1. Jak nastavit parametry, když Pipe Bash Script to Bash?

  2. Jak mohu zazvonit na zvukový zvonek v bash skriptu spuštěném pod obrazovkou gnu?

  3. Jak spustit bash skript přes absolutní cestu?