GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo uno script bash può conoscere la directory in cui è installato quando viene fornito con . operatore?

Credo $(dirname "$BASH_SOURCE") farà quello che vuoi, purché il file che stai cercando non lo sia un collegamento simbolico.

Se il file che stai cercando potrebbe essere un collegamento simbolico, puoi fare qualcosa di simile al seguente per ottenere la vera directory:

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")

Ecco quella che potrebbe essere una soluzione elegante:

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

Ciò, tuttavia, non funzionerà durante l'approvvigionamento di collegamenti. In tal caso, si potrebbe fare

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

Cose da notare:

  • array come ${array[x]} non sono conformi a POSIX - ma poi, il BASH_SOURCE array è comunque disponibile solo in Bash
  • su macOS, il BSD nativo readlink non supporta -f , quindi potresti dover installare GNU readlink utilizzando ad es. brew entro brew install coreutils e sostituisci readlink di greadlink
  • a seconda del tuo caso d'uso, potresti voler utilizzare il -e o -m commuta invece di -f più possibilmente -n; vedere la pagina man di readlink per i dettagli

Un approccio diverso al problema, se utilizzi "." per impostare le variabili di ambiente, un altro modo standard per farlo è fare in modo che il tuo script echo i comandi di impostazione delle variabili, ad esempio:

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

quindi valuta l'output:

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

Ecco come funzionano i pacchetti come i moduli. In questo modo è anche facile supportare le shell derivate da sh (X=...; export X ) e csh (setenv X ... )


Linux
  1. Risolto il problema con lo script Bash che prevedeva l'input del percorso con / alla fine si interrompe quando il percorso non termina con /?

  2. Come faccio a conoscere il nome del file di script in uno script Bash?

  3. Come ottengo la directory assoluta di un file in bash?

  4. Come cambio la directory in Git Bash con Git per Windows?

  5. Come posso testare il mio script Bash su versioni precedenti di Bash?

Come scrivere uno script Bash con esempi

Come posso installare l'ultimo Anaconda con wget

Come uccidere lo script Python con lo script bash

Come eseguire uno script bash?

Quando leggo un file con "meno" o "più", come posso ottenere il contenuto a colori?

Come posso suonare il campanello audio all'interno di uno script bash in esecuzione sotto lo schermo di gnu?