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.


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.)


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 #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.