Periksa apakah direktori ada menggunakan karakter rumah (~) di bash gagal


16

Mengapa yang berikut bashmemeriksa jika direktori gagal?

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

~/Desktopmemang ada. Omong-omong, ini ada di Mac.


Masalahnya dengan jenis skrip ini

read -p "Provide the destination directory: " DESTINATION

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

1
Sama seperti ketika Anda melakukannya, cd "~/Desktop"Anda juga mendapatkan kesalahan. Itu harus dikutip atau disimpan sebagai variabel (tanpa tanda kutip). Misalnya, a=~/Desktop; cd $a;berfungsi tetapi tidak a="~/Desktop"; cd Desktop;Lihat serverfault.com/questions/417252/…
dylnmc

Jawaban:


7

Justin mengklarifikasi pertanyaannya dalam komentar pertamanya tentang jawaban kuanta. Dia membaca dalam satu baris teks menggunakan read(atau dengan cara dinamis lainnya) dan ingin memperluas tilde.

Pertanyaannya menjadi "Bagaimana Anda melakukan ekspansi tilde pada konten variabel?"

Pendekatan umum adalah menggunakan eval, tetapi ia datang dengan beberapa peringatan penting, yaitu spasi dan redirection output ( >) dalam variabel. Sepertinya ini bekerja untuk saya:

read -p "Provide the destination directory: " DESTINATION

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

Cobalah dengan masing-masing input berikut:

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

Penjelasan

  • The ${mypath//>}strip keluar >karakter yang bisa mengkritik file selama eval.
  • Inilah eval echo ...yang dilakukan ekspansi tilde yang sebenarnya
  • Kutipan ganda di sekitar evaladalah untuk mendukung nama file dengan spasi.

Sebagai suplemen untuk ini, Anda dapat meningkatkan UX dengan menambahkan -e opsi untuk membaca:

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

Sekarang ketika pengguna mengetikkan tilde dan tab hit, itu akan berkembang. Pendekatan ini tidak menggantikan pendekatan eval di atas, karena ekspansi hanya terjadi jika pengguna menekan tab. Jika dia hanya mengetikkan ~ / foo dan klik masuk, itu akan tetap sebagai tilde.

Lihat juga:


23

Hapus tanda kutip ganda di sekitar direktori untuk melihat apakah itu bekerja:

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

Alasannya adalah ekspansi tilde hanya berfungsi ketika tidak dikutip.

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.

Bagaimana jika nilainya datang secara dinamis. Yaitu ( pastie.org/4471350 ) dan DESTINATIONadalah ~/Desktop.
Justin

3
Ekspansi tilde dilakukan ketika variabel diatur, bukan saat dievaluasi, jadi itu bukan contoh yang adil.
MadHatter

+1, ini sudah cukup untuk menyelesaikan masalah saya.
Flying Fisher


1

Lari

echo $HOME

gunakan $HOME, dan pastikan pengguna benar-benar menggunakan skrip. jika root menggunakan ~itu akan mencari /root, bukan /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

seharusnya $ HOME bukan ~

~ adalah hal KEYBOARD


Jika Anda membaca jawaban lain di sini, Anda akan menyadari bahwa ini salah.
anak ayam
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.