Risposte:
Il messaggio di errore viene generato perché ~
viene citata la tilde , come descritto nella risposta di Zanna . Se si desidera utilizzare il ~
, la parte rilevante dello script dovrebbe essere:
BIN_DIR=~/bin/
Se per qualsiasi motivo desideri citare la stringa, puoi utilizzare la variabile di ambiente $HOME
:
BIN_DIR="$HOME/bin/"
Secondo me il secondo approccio è una migliore pratica.
~
negli script. funziona esattamente come nella riga di comando. Il problema è che la citazione blocca l'espansione della tilde come spiegato nella risposta di Zanna .
$HOME
negli script sia una buona idea.
$HOME
che usare l'espansione tilde? L'unica spiegazione che hai dato è di dire "è un'idea migliore, perché dovresti prestare meno attenzione". Non ho idea di cosa significhi. Puoi spiegarlo in una modifica? Senza di essa, non c'è nulla che supporti la tua risposta, quindi sicuramente appartiene ad essa. L'espansione Tilde è stata richiesta da POSIX da un po 'di tempo e la linea hashbang dello script è #!/bin/bash
quindi suppongo che la portabilità non sia la ragione.
Non funziona perché ~
è citato. Le virgolette doppie "
sopprimono l' espansione della tilde . Non esiste una directory con il nome letterale ~/bin
. Come spiegato in man bash
(sottolineatura mia):
Espansione Tilde
Se una parola inizia con un carattere tilde non quotato (`~ '), tutti i caratteri che precedono la prima barra non quotata (o tutti i caratteri, se non è presente una barra non quotata) sono considerati un prefisso tilde. Se nessuno dei caratteri nel prefisso tilde viene citato, i caratteri nel prefisso tilde che segue la tilde vengono trattati come un possibile nome di accesso. Se questo nome di accesso è la stringa nulla, la tilde viene sostituita con il valore del parametro shell HOME. Se HOME non è impostato, viene invece sostituita la home directory dell'utente che esegue la shell. Altrimenti, il prefisso tilde viene sostituito con la home directory associata al nome di accesso specificato.
È possibile rimuovere le virgolette , poiché ~
è l'unico carattere nel percorso ~/bin
che farà eseguire l'espansione alla shell e in questo caso vogliamo l'espansione. La shell non eseguirà ulteriori espansioni sul risultato dell'espansione della tilde, almeno in Bash 4 , di cui dispongono tutte le versioni recenti o remote di Ubuntu . Quindi, anche se la tua home directory contiene caratteri insoliti come gli spazi, va bene.
Oppure puoi usare $HOME
invece di ~
, perché l' espansione dei parametri non è soppressa da virgolette doppie, ma solo da virgolette singole . Le virgolette fanno sì che il valore espanso non è soggetto a ulteriori espansioni, così suddivisione in parole o espansione dei nomi non si verificano. Così $HOME
funziona anche con le home directory di nome stranamente, troppo, fino a quando si mantiene le doppie virgolette.
cd '~'
è -bash: cd: ~: No such file or directory
.
~
non fa parte dell'espansione dei parametri.