Erro de script Bash tentando encontrar o diretório do próprio script: final inesperado do arquivo

0

Aproveitando gentilmente essa resposta do StackOverflow , quero encontrar o diretório em que um script está sendo executado para que eu possa carregar o parente caminhos para ele no login:

O script é bem pequeno agora:

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
DIR=$( cd -P "$( dirname "$SOURCE" )" && pwd )

Mas quando eu fizer login ou ligar para source <this_script.sh> , recebo:

-bash: script.sh: line 4: syntax error: unexpected end of file

Perguntas do casal:

  1. O que está acontecendo?
  2. Qual é a correção?

Isso está sendo executado:

-bash-3.2$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Editar 1:

tentando a solução do Gile:

parent="$(dirname "$SOURCE")"
echo "PARENT IS $parent"
DIR="$(cd -P "$parent" && pwd)"
echo "DIR IS $DIR"

Eu recebo o seguinte ao tentar source ou efetuar login:

Last login: Mon Mar 12 08:07:13 2012 from ....
PARENT IS .
: No such file or directory
DIR IS
: command not found
: command not found
: command not found
: command not found
    
por Nick Klauer 08.03.2012 / 16:41

2 respostas

1

Você provavelmente está perdendo uma nova linha no final da sua última linha.

    
por 08.03.2012 / 17:29
0

Eu não consigo reproduzir esse comportamento com o bash 3.2.25 (2) compilado da fonte.

Houve uma alteração em algum lugar na série 3.2 na maneira como $(…) foi analisado.

uuu. Bash now parses command substitutions according to Posix rules: parsing the command contained in $() to find the closing delimiter.

Não sei por que não consegui reproduzi-lo, se for esse o caso, mas você pode estar com o antigo comportamento de análise de bugs. Tente simplificar o comando.

parent=$(dirname "$SOURCE")
DIR=$(cd -P "$parent" && pwd)

Acho que adicionar aspas duplas em torno da substituição do comando externo pode ajudar. Embora as aspas duplas não façam diferença quando você as usa em torno da parte de valor de uma atribuição, lembro-me de uma versão de shell que tinha um analisador de bugs que quebrou em foo=$(something) mas lidou com foo="$(something)" ; isso pode ter sido isso.

    
por 10.03.2012 / 00:43