Perché mkdir ha esito negativo (nessun file o directory simile) in uno script con BIN_DIR = “~ / bin /”?


Risposte:


11

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.


6
Non c'è niente di sbagliato nell'uso ~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 .
terdon,

@terdon, sono d'accordo. Ma non ho detto che c'è qualcosa che non va, ma è un'idea migliore, perché dovresti prestare meno attenzione.
pa4080,

5
Ma non c'è assolutamente alcuna differenza tra la riga di comando e uno script qui. Il fatto che questo sia in uno script è completamente irrilevante, avresti esattamente lo stesso errore nella riga di comando. Il problema è la citazione, non che si trova in uno script.
terdon,

Anche se è del tutto vero, è anche giusto che l'uso $HOMEnegli script sia una buona idea.
dessert,

3
@ pa4080 Puoi aggiungere una spiegazione del perché pensi che sia meglio espandersi $HOMEche 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/bashquindi suppongo che la portabilità non sia la ragione.
Eliah Kagan,

23

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 ~/binche 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 $HOMEinvece 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ì $HOMEfunziona anche con le home directory di nome stranamente, troppo, fino a quando si mantiene le doppie virgolette.


Secondo questa affermazione "l'espansione dei parametri non è soppressa da virgolette doppie, solo da virgolette singole" : l'output di cd '~'è -bash: cd: ~: No such file or directory.
pa4080,

2
@ pa4080 L'espansione di ~non fa parte dell'espansione dei parametri.
Barmar,
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.