sorgente dello script bash: nessun file o directory


9

Ho una sceneggiatura che inizia così

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

ma quando lo eseguo ritorna line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

ma il file esiste e quando corro source ~/myProjects/valkyrie/cluster.conffunziona bene. Qualche idea? Ho impostato la VALKYRIEvariabile altrove, quindi l'hard-code nel percorso non è un'opzione.


Non sono sicuro al 100% se questo aiuterà, ma potresti provare a citare completamente la variabile, nel caso ci siano spazi in ~. Quindi, source "${VALKYRIE}/cluster.conf".
Sparhawk,

no, non aiuta.
Khoi

1
Penso che abbia a che fare con il ~non espandersi correttamente. Quando eseguo il tuo script con un percorso intenzionalmente falso, l'errore non dice ~, ma espande il percorso. Puoi provare a sostituire il ~nel tuo script con il percorso assoluto? Inoltre, prova a eseguire quanto segue in uno script echo ~.
Sparhawk,

2
Potresti anche provare $HOMEinvece di ~.
Sparhawk,

3
@Khoi Questo lo spiega. ~/.pam_environmentnon è uno script di shell, in modo da non fare le cose comuni che ci si aspetta da una shell, come espansione della tilde e l'espansione dei parametri, così non ~ne $HOMEverrà sostituito. Se sposti invece quella linea ~/.profilee la aggiungi export in primo piano, dovrebbe funzionare.
geirha,

Risposte:


8

~non sembra espandersi correttamente. Quando eseguo il tuo script con un percorso intenzionalmente falso, l'errore non dice ~, ma espande il percorso (cioè /home/sparhawk/fakepathno ~/fakepath. Potresti provare a utilizzare $HOMEinvece di ~o utilizzare il percorso completo nello script invece.

(Non sono sicuro del motivo per cui ~non funziona sul tuo sistema, poiché il tuo script funziona bene per me.)


Quando guardi l'ordine in cui bash esegue le espansioni ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), vedrai che l'espansione della tilde avviene prima dell'espansione variabile. Ecco perché $HOMEè meglio che ~in una variabile
Glenn Jackman,

@glennjackman Non sono sicuro di aver capito. Perché sarebbe questione prioritaria per le variabili contro ~?
Sparhawk,

1
non è esattamente "priorità", è semplicemente ciò che viene prima. Considera x="~/.bashrc"; ls $x: nell'ordine delle espansioni per il comando "ls", bash cerca una tilde e non la trova; alla fine bash vede una variabile e la espande. bash non torna indietro e cerca di nuovo le tilde, a questo punto è solo un personaggio semplice. e non ci sono file nella directory corrente che iniziano con una tilde.
Glenn Jackman,

Ah ok. Penso di averlo capito. Mi sono sempre chiesto perché quel comando fallisse e x=~/".bashrc"; ls $xfunzionasse. Grazie per le informazioni.
Sparhawk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.