fonte do script bash: Esse arquivo ou diretório não existe

9

Eu tenho um script que começa assim

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

mas quando eu corro ele retorna line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

mas o arquivo existe e quando eu o executo source ~/myProjects/valkyrie/cluster.confele corre bem. Qualquer ideia? Defino a VALKYRIEvariável em outro lugar, para que o código rígido no caminho não seja uma opção.

Khoi
fonte
Não tenho 100% de certeza se isso vai ajudar, mas você pode tentar citar completamente a variável, caso haja espaços em ~. Portanto source "${VALKYRIE}/cluster.conf",.
Sparhawk #
não, isso não ajuda.
Khoi
11
Eu acho que tem algo a ver com ~não expandir adequadamente. Quando executo seu script com um caminho intencionalmente falso, o erro não diz ~, mas expande o caminho. Você pode tentar substituir o ~no seu script pelo caminho absoluto? Além disso, tente executar o seguinte em um script echo ~.
Sparhawk
2
Você também pode tentar em $HOMEvez de ~.
Sparhawk
3
@Khoi Isso explica tudo. ~/.pam_environmentnão é um script de shell, por isso não faz as coisas comuns que você esperaria de um shell, como expansão de til e expansão de parâmetros, portanto, ~nem $HOMEserão substituídos. Se você mover essa linha para ~/.profile, e adicionar export na frente, ela deve funcionar.
Geirha

Respostas:

8

~parece não estar se expandindo corretamente. Quando executo seu script com um caminho intencionalmente falso, o erro não diz ~, mas expande o caminho (ou seja, /home/sparhawk/fakepathnão ~/fakepath. Você pode tentar usar em $HOMEvez de ~ou usar o caminho completo no script.

(Não sei por ~que não funciona no seu sistema, pois seu script funciona bem para mim.)

Sparhawk
fonte
Quando você olha para a ordem em que o bash executa expansões ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), verá que a expansão til ocorre antes da expansão variável. É por isso que $HOMEé melhor do que ~em uma variável
Glenn Jackman
@glennjackman Não sei se entendi. Por que importa prioridade para as variáveis vs. ~?
Sparhawk #
11
não é exatamente "prioridade", é simplesmente o que vem primeiro. Considere x="~/.bashrc"; ls $x- na ordem das expansões para o comando "ls", o bash procura um til e não o encontra; eventualmente, o bash vê uma variável e a expande. O bash não volta e procura por tildes novamente; nesse momento, é apenas um personagem comum. e não há arquivos no diretório atual que começam com um til.
Glenn Jackman
Ah ok. Eu acho que entendi. Eu sempre me perguntei por que esse comando falha e x=~/".bashrc"; ls $xfunciona. Obrigado pela informação.
Sparhawk #