Refere-se a um arquivo no mesmo diretório de um script encontrado em $ PATH

27

Eu tenho um arquivo de script bash, que é colocado em algum diretório adicionado ao $ PATH para que eu possa chamar o script de qualquer diretório.

Existe outro arquivo de texto no mesmo diretório do script. Gostaria de saber como se referir ao arquivo de texto no script?

Por exemplo, se o script é apenas para mostrar o conteúdo do arquivo de texto, cat textfile não funcionará, já que ao chamar o script de um diretório diferente, o arquivo de texto não é encontrado.

    
por Tim 31.07.2011 / 01:52

7 respostas

18

Eles devem funcionar da mesma forma, desde que não haja links simbólicos (na expansão do caminho ou no próprio script):

  • MYDIR="$(dirname "$(realpath "$0")")"

  • MYDIR="$(dirname "$(which "$0")")"

  • Uma versão em dois passos de qualquer um dos itens acima:

    MYSELF="$(realpath "$0")"

    MYDIR="${MYSELF%/*}"

Se houver um link simbólico no caminho para seu script, which fornecerá uma resposta sem incluir a resolução desse link. Se realpath não estiver instalado por padrão no seu sistema, você pode encontrá-lo aqui .

[EDITAR]: parece que realpath não tem vantagem sobre readlink -f sugerido pelo Caleb , provavelmente é melhor usar o último. Meus testes de tempo indicam que é realmente mais rápido.

    
por 31.07.2011 / 02:22
8

Meus sistemas não têm realpath como sugerido por rozcietrzewiacz .

Você pode fazer isso usando o comando readlink . A vantagem de usar isso ao analisar which ou outras soluções é que, mesmo que uma parte do caminho ou do nome do arquivo executado fosse um link simbólico, você seria capaz de encontrar o diretório onde estava o arquivo.

MYDIR="$(dirname "$(readlink -f "$0")")"

Seu arquivo de texto pode ser lido em uma variável como esta:

TEXTFILE="$(<$MYDIR/textfile)"
    
por 01.08.2011 / 12:26
8

$0 no script será o caminho completo para o script e dirname terá um caminho completo e fornecerá apenas o diretório, para que você possa fazer isso no arquivo de texto cat:

$ cat "$(dirname -- "$0")/textfile"
    
por 31.07.2011 / 02:12
3

Você pode colocar isso no topo do seu script:

cd "${BASH_SOURCE%/*}" || exit

The BASH_SOURCE internal bash variable is actually an array of pathnames. If you expand it as a simple string, e.g. "$BASH_SOURCE", you'll get the first element, which is the pathname of the currently executing function or script.

Fonte: link

    
por 27.05.2015 / 09:01
1

Eu estava tentando isso e o realpath não funcionou para mim. A solução que eu fui é:

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

Que funcionou bem até agora. Eu gostaria de saber se há algum problema potencial com a abordagem.

    
por 22.09.2017 / 17:35
1

Eu uso:

#! /bin/sh -
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) || exit
dosomethingwith "${dir%/}/some-file"

Qual é o POSIX e deve funcionar desde que o nome do dir de $0 não termine em caracteres de nova linha, não é - e $CDPATH não está definido (e possivelmente alguns outros casos de canto se o script não foi pesquisado em $PATH ).

    
por 22.09.2017 / 17:53
0

Eu sempre uso which para encontrar o caminho completo de um executável a partir do PATH. Por exemplo:

which python

Se você combinar isso com o comando dirname , você verá:

wp='which python'
dn='dirname $wp'
ls $dn
    
por 11.08.2011 / 07:26

Tags