Il dirname
comando è il più semplice, analizzando semplicemente il percorso fino al nome del file fuori dalla $0
variabile (nome dello script):
dirname "$0"
Ma, come ha sottolineato Matt B , il percorso restituito è diverso a seconda di come viene chiamato lo script. pwd
non fa il lavoro perché ti dice solo qual è la directory corrente, non in quale directory si trova lo script. Inoltre, se viene eseguito un collegamento simbolico a uno script, otterrai un percorso (probabilmente relativo) a dove risiede il collegamento, non lo script reale.
Alcuni altri hanno menzionato il readlink
comando, ma nella sua forma più semplice è possibile utilizzare:
dirname "$(readlink -f "$0")"
readlink
risolverà il percorso dello script in un percorso assoluto dalla radice del filesystem. Pertanto, qualsiasi percorso contenente punti singoli o doppi, tilde e / o collegamenti simbolici verrà risolto in un percorso completo.
Ecco uno script che dimostra ciascuno di questi whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
Eseguendo questo script nella mia home directory, usando un percorso relativo:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Ancora una volta, ma usando l'intero percorso dello script:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Ora cambiare directory:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
E infine usando un link simbolico per eseguire lo script:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- e rimuoverlo senza una sostituzione comando -DIR="${DIR%x}"
.