O dirname
comando é o mais básico, basta analisar o caminho até o nome do arquivo da $0
variável (nome do script):
dirname "$0"
Mas, como matt b apontou, o caminho retornado é diferente dependendo de como o script é chamado. pwd
não faz o trabalho porque isso apenas informa qual é o diretório atual, não o diretório em que o script reside. Além disso, se um link simbólico para um script for executado, você obterá um caminho (provavelmente relativo) para onde o link reside, não o script real.
Alguns outros mencionaram o readlink
comando, mas, na sua forma mais simples, você pode usar:
dirname "$(readlink -f "$0")"
readlink
resolverá o caminho do script para um caminho absoluto a partir da raiz do sistema de arquivos. Portanto, quaisquer caminhos que contenham pontos simples ou duplos, tildes e / ou links simbólicos serão resolvidos para um caminho completo.
Aqui está um script demonstrando cada um destes 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))"
Executando este script no meu diretório home, usando um caminho relativo:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Novamente, mas usando o caminho completo para o script:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Agora alterando diretórios:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
E, finalmente, usando um link simbólico para executar o 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 removê-lo sem uma substituição de comando -DIR="${DIR%x}"
.