Bash'da home karakteri (~) kullanılarak dizinin mevcut olup olmadığını kontrol edin


16

Aşağıdakiler bashbir dizinin başarısız olup olmadığını neden kontrol ediyor?

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

~/Desktopgerçekten var. Bu arada Mac'te.


Sorun bu tür komut dosyalarında

read -p "Provide the destination directory: " DESTINATION

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

1
Tıpkı yaptığınız gibi cd "~/Desktop"bir hata da alırsınız. Tırnak işaretsiz veya değişken olarak (tırnak işaretleri olmadan) saklanmalıdır. Örneğin, a=~/Desktop; cd $a;çalışıyor ancak çalışmıyor a="~/Desktop"; cd Desktop;Bkz serverfault.com/questions/417252/…
dylnmc

Yanıtlar:


7

Justin, quanta'nın cevabı hakkındaki ilk yorumunda sorusunu açıkladı. O read(veya başka bir dinamik yolla) kullanarak bir metin satırında okuyor ve dalga işaretini genişletmek istiyor.

Soru, "Bir değişkenin içeriği üzerinde yaklaşık işareti genişletmesi nasıl yapılır?"

Genel yaklaşım kullanmaktır eval, ancak >değişkente boşluklar ve çıkış yeniden yönlendirmesi ( ) gibi bazı önemli uyarılarla birlikte gelir . Aşağıdakiler benim için çalışıyor gibi görünüyor:

read -p "Provide the destination directory: " DESTINATION

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

Aşağıdaki girişlerin her biriyle deneyin:

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

açıklama

  • ${mypath//>}Şeritler >sırasında dosyanın bilmeden olabilir karakterleri eval.
  • eval echo ...Gerçek yaklaşık yorumlaması yaptığı iştir
  • Etrafındaki çift tırnak işaretleri evalboşluklu dosya adlarını desteklemek içindir.

Buna ek olarak, -eokuma seçeneğini ekleyerek UX'i geliştirebilirsiniz :

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

Şimdi kullanıcı tilde yazıp sekmeye bastığında genişleyecektir. Ancak, bu yaklaşım yukarıdaki değerlendirme yaklaşımının yerine geçmez , çünkü genişleme yalnızca kullanıcı sekmeye bastığında gerçekleşir. Eğer sadece ~ / foo yazar ve isabet girerse, tilde kalır.

Ayrıca bakınız:


23

Çalışıp çalışmadığını görmek için dizindeki çift tırnak işaretlerini kaldırın:

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

Bunun nedeni, tilde genişletmenin yalnızca alıntı yapılmadığında çalışmasıdır.

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.

Değerin dinamik olarak girilip girilmeyeceği hakkında. Yani ( pastie.org/4471350 ) ve DESTINATIONöyle ~/Desktop.
Justin

3
Tilde genişletme, değişken ayarlandığında değil, değerlendirildiğinde yapılır, bu adil bir örnek değildir.
MadHatter

+1, sorunumu çözmek için bu yeterli.
Flying Fisher


1

Çalıştırmak

echo $HOME

kullanın $HOMEve kullanıcının komut dosyasını gerçekten kullandığından emin olun. eğer kök ~onu içine alacaksa kullanır /root, değil /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

~ yerine $ HOME olmalıdır

~ bir KLAVYE şeyidir


Buradaki diğer cevabı okursanız bunun yanlış olduğunu fark edersiniz.
civcivler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.