Controlla se la directory esiste usando il carattere home (~) in bash non riesce


16

Perché quanto segue bashverifica se una directory fallisce?

if [ ! -d "~/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

~/Desktopesiste davvero. A proposito, questo è su un Mac.


Il problema è con questo tipo di script

read -p "Provide the destination directory: " DESTINATION

if [ ! -d $DESTINATION ]; then
    echo "\t'$DESTINATION' does not exist." >&2;
    exit 1;
fi

1
Proprio come quando lo fai cd "~/Desktop"ricevi anche un errore. Deve essere non quotato o memorizzato come variabile (senza virgolette). Ad esempio, a=~/Desktop; cd $a;funziona ma non a="~/Desktop"; cd Desktop;vedi serverfault.com/questions/417252/…
dylnmc

Risposte:


7

Justin ha chiarito la sua domanda nel suo primo commento sulla risposta di Quanta. Sta leggendo in una riga di testo usandoread (o con altri mezzi dinamici) e vuole espandere la tilde.

La domanda diventa "Come si esegue l'espansione tilde sul contenuto di una variabile?"

L'approccio generale è usare eval, ma viene fornito con alcuni avvertimenti importanti, vale a dire gli spazi e il reindirizzamento dell'output ( >) nella variabile. Quanto segue sembra funzionare per me:

read -p "Provide the destination directory: " DESTINATION

if [ ! -d "`eval echo ${DESTINATION//>}`" ]; then
    echo "'$DESTINATION' does not exist." >&2;
    exit 1;
fi

Provalo con ciascuno dei seguenti input:

~
~/existing_dir
~/existing dir with spaces
~/nonexistant_dir
~/nonexistant dir with spaces
~/string containing > redirection
~/string containing > redirection > again and >> again

Spiegazione

  • Le ${mypath//>}strisce fuori> i caratteri che potrebbe massacravano un file durante il eval.
  • Il eval echo ... è quello che esegue l'espansione tilde effettivo
  • Le doppie virgolette intorno a evalsono per il supporto di nomi di file con spazi.

Come supplemento a questo, puoi migliorare la UX aggiungendo l' -eopzione per leggere:

read -p "Provide the destination directory: " -e DESTINATION

Ora quando l'utente digita tilde e colpisce la scheda, si espande. Questo approccio non sostituisce l'approccio eval sopra, tuttavia, poiché l'espansione si verifica solo se l'utente tocca la scheda. Se digita ~ / foo e preme Invio, rimarrà come una tilde.

Guarda anche:


23

Rimuovi le doppie virgolette nella directory per vedere se funziona:

if [ ! -d ~/Desktop ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

Il motivo è che l'espansione tilde funziona solo quando non è quotata.

info "(bash) Tilde Expansion"

3.5.2 Tilde Expansion
---------------------

If a word begins with an unquoted tilde character (`~'), all of the
characters up to the first unquoted slash (or all characters, if there
is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
characters in the tilde-prefix are quoted, the characters in the
tilde-prefix following the tilde are treated as a possible LOGIN NAME.
If this login name is the null string, the tilde is replaced with the
value of the `HOME' shell variable.  If `HOME' is unset, the home
directory of the user executing the shell is substituted instead.
Otherwise, the tilde-prefix is replaced with the home directory
associated with the specified login name.

Che ne dici se il valore arriva in modo dinamico. Vale a dire ( pastie.org/4471350 ) e lo DESTINATIONè ~/Desktop.
Giustino,

3
L'espansione della tilde viene eseguita quando viene impostata la variabile, non quando viene valutata, quindi non è un buon esempio.
MadHatter,

+1, questo è abbastanza per risolvere il mio problema.
Flying Fisher,


1

correre

echo $HOME

utilizzare $HOMEe assicurarsi che l'utente stia effettivamente utilizzando lo script. se root usa il ~suo andare a cercare /root, no /home/$USER.

if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

-1
if [ ! -d "$HOME/Desktop" ]; then
   echo "DOES NOT EXIST"
   exit 1;
fi

dovrebbe essere $ HOME invece di ~

~ è una cosa da TASTIERA


Se leggi l'altra risposta qui ti renderai conto che questo è sbagliato.
pulcini,
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.