fuente de script bash: no existe tal archivo o directorio

9

Tengo un guión que comienza así

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

pero cuando lo ejecuto vuelve line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

pero el archivo existe y cuando lo ejecuto source ~/myProjects/valkyrie/cluster.conffunciona bien. ¿Alguna idea? Configuré la VALKYRIEvariable en otro lugar para que el código duro en la ruta no sea una opción

Khoi
fuente
No estoy 100% seguro de si esto ayudará, pero podría intentar citar completamente la variable, en caso de que haya espacios en ~. Por lo tanto, source "${VALKYRIE}/cluster.conf".
Sparhawk
No, no ayuda.
Khoi
1
Creo que tiene algo que ver con ~no expandirse adecuadamente. Cuando ejecuto su script con una ruta falsa intencionalmente, el error no dice ~, pero expande la ruta. ¿Puedes intentar reemplazar el ~en tu script con la ruta absoluta? Además, intente ejecutar lo siguiente en un script echo ~.
Sparhawk
2
También puedes probar en $HOMElugar de ~.
Sparhawk
3
@Khoi Eso lo explica. ~/.pam_environmentno es un script de shell, por lo que no hace las cosas comunes que esperaría de un shell, como la expansión de tilde y la expansión de parámetros, por lo que ~ni $HOMEserá reemplazado. Si mueve esa línea a su ~/.profilelugar y agrega export al frente, debería funcionar.
geirha 01 de

Respuestas:

8

~no parece estar expandiéndose correctamente. Cuando ejecuto su script con una ruta falsa intencionalmente, el error no dice ~, pero expande la ruta (es decir, /home/sparhawk/fakepathno ~/fakepath. Puede intentar usar en $HOMElugar de ~, o usar la ruta completa en el script en su lugar.

(No estoy seguro de por qué ~no funciona en su sistema, ya que su script funciona bien para mí).

Gavilán
fuente
Cuando observa el orden en que bash realiza expansiones ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), verá que la expansión de tilde ocurre antes de la expansión variable. Por eso $HOMEes mejor que ~en una variable
Glenn Jackman
@glennjackman No estoy seguro de entender. ¿Por qué importa la prioridad para las variables vs. ~?
Sparhawk
1
no es exactamente "prioridad", es simplemente lo que viene primero. Considere x="~/.bashrc"; ls $x: en el orden de las expansiones para el comando "ls", bash busca una tilde y no la encuentra; finalmente bash ve una variable y la expande. bash no regresa y busca tildes nuevamente, en este punto es solo un personaje simple. y no hay archivos en el directorio actual que comiencen con una tilde.
Glenn Jackman
Ah bien. Creo que lo entiendo. Siempre me he preguntado por qué ese comando falla y x=~/".bashrc"; ls $xfunciona. Gracias por la info.
Sparhawk