È interessante. Sostituendo $HOME
per ~
funziona come rimuovere le virgolette dal compito.
Se si inserisce uno set -x
nella parte superiore di quello script, si vedrà che la versione con le virgolette imposta il nome del file su ~/...
che è ciò che è dato a -e
. Se si rimuovono le virgolette, il nome file è impostato su /home/somebody/...
espanso. Quindi nel primo caso, vedi:
+ [ -e ~/... ]
e non gli piace. Nel secondo caso, si vede:
+ [ -e /home/somebody/... ]
e fa lavoro.
Se lo si fa, senza la variabile, si vede:
+ [ -e /home/somebody/... ]
e, sì, funziona.
Dopo un po 'di indagine, ho scoperto che in realtà è l'ordine in cui svolge la sua bash
espansioni. Dalla pagina man bash:
L'ordine di espansione è: espansione delle parentesi graffe, espansione della tilde, un parametro variabile e sostituzione di espansione e comando aritmetica (fatto in maniera da sinistra a destra), suddivisione in parole, e percorso espansione.
Ecco perché non funziona, la variabile è sostituito dopo l'espansione tilde. In altre parole, nel punto in cui bash
desidera espandere ~
, non ce n'è uno. È solo dopo l'espansione variabile che la parola viene modificata in ~/...
e non ci sarà più alcuna espansione di tilde.
Una cosa che si poteva fare è di cambiare la sua dichiarazione if
a:
if [[ -e $(eval echo $filename) ]]; then
Questa valuterà l'argomento $ nomefile due volte. La prima volta (con eval
), non ci sarà ~
durante la fase di espansione tilde ma $filename
verrà modificato in ~/...
durante la fase di espansione delle variabili.
Quindi, nella seconda valutazione (quella eseguita come parte dello if
), lo ~
sarà presente durante la fase di espansione tilde.
L'ho provato sul mio file .profile
e sembra funzionare, vi suggerisco di confermare nel vostro caso particolare.
Ritengo che '' 'sia una comodità della riga di comando che non dovrebbe essere utilizzata negli script. –