Mkdir neden BIN_DIR = “~ / bin /” olan bir komut dosyasında başarısız oluyor (böyle bir dosya veya dizin yok)?


Yanıtlar:


11

Hata mesajı, ~Zanna'nın cevabında açıklandığı gibi tilde alıntılandığı için üretilir . Kullanmak istiyorsanız ~, komut dosyasının ilgili kısmı:

BIN_DIR=~/bin/

Herhangi bir nedenle dizeyi alıntılamak istiyorsanız, ortam değişkenini kullanabilirsiniz $HOME:

BIN_DIR="$HOME/bin/"

Bence ikinci yaklaşım daha iyi uygulama.


6
~Komut dosyalarında kullanmanın yanlış bir yanı yok . komut satırında olduğu gibi çalışır. Sorun şu ki, alıntılama Zanna'nın cevabında açıklandığı gibi tilde genişlemeyi engelliyor .
terdon

@terdon, katılıyorum. Ama yanlış bir şey olduğunu söylemedim, ama daha iyi bir fikir, çünkü daha az dikkat etmelisin.
pa4080

5
Ancak burada komut satırı ile komut dosyası arasında kesinlikle bir fark yoktur. Bunun bir komut dosyasında olması önemsizdir, komut satırında tam olarak aynı hataya sahip olursunuz. Sorun alıntıdır, bir senaryoda değil.
terdon

Bu tamamen doğru olsa da $HOME, komut dosyalarında kullanmanın iyi bir fikir olduğu doğrudur .
tatlı

3
@ pa4080 Genişletmenin neden$HOME tilde genişletmeyi kullanmaktan daha iyi olduğunu düşündüğünüzü açıklayabilir misiniz ? Verdiğiniz tek açıklama "daha iyi bir fikir, çünkü daha az dikkat etmelisiniz" demek. Bunun ne anlama geldiği hakkında hiçbir fikrim yok. Bir düzenlemede açıklayabilir misiniz? Onsuz, cevabınızı destekleyen hiçbir şey yoktur, bu yüzden kesinlikle ona aittir. Yaklaşık yorumlaması için POSIX tarafından gerekli olmuştur şimdi ise oldukça ve komut dosyasının hashbang çizgidir #!/bin/bashben taşınabilirliği neden değildir varsayalım böylece.
Eliah Kagan

23

~Çalışmıyor çünkü alıntı yapılıyor. Çift tırnaklar tilde genişletmeyi" bastırır . Gerçek adı olan bir dizin yok . Açıklandığı gibi (vurgu mayın):~/binman bash

Tilde Genişletme

Bir kelime tırnaksız tilde karakteriyle (`~ ') başlarsa, ilk tırnaksız eğik çizgiden önceki tüm karakterler (veya tırnaksız eğik çizgi yoksa tüm karakterler) tilde öneki olarak kabul edilir. Tilde önekindeki karakterlerden hiçbiri alıntılanmazsa, tilde işaretini izleyen tilde önekindeki karakterler olası bir oturum açma adı olarak kabul edilir. Bu oturum açma adı null dizgiyse, tilde işareti HOME parametresinin değeri ile değiştirilir. HOME ayarlanmamışsa, kabuğu çalıştıran kullanıcının giriş dizini onun yerine kullanılır. Aksi takdirde, tilde öneki belirtilen giriş adıyla ilişkili giriş dizini ile değiştirilir.

Tırnak işaretlerini kaldırabilirsiniz , çünkü ~yoldaki ~/binkabuğun bir genişleme gerçekleştirmesine neden olacak tek karakterdir ve bu durumda genişlemeyi istiyoruz. Kabuk gerçekleştirmez , tilde genişlemesi sonucu hakkında başka açılımlar Bash 4 en az Ubuntu tüm güncel veya uzaktan son bültenleri, hangi sahiptir . Yani ana dizininiz boşluk gibi olağandışı karakterler içeriyor olsa bile, sorun değil.

Yoksa kullanabilirsiniz $HOMEyerine ait ~çünkü parametre genişletme çift tırnak tarafından bastırılmış değil sadece tarafından, tek tırnak . Çift tırnak do böylece genişletilmiş değeri, kendisi başka açılımları tabi olmadığından emin sözcüklere ayırma veya dosya adı genişleme gerçekleşmez. Böylece $HOME, çift tırnakları sakladığınız sürece, garip olarak adlandırılmış ev dizinleriyle de çalışır.


Bu açıklamaya göre "parametresi genişletme yalnızca tek tırnak, çift tırnak tarafından bastırılır değil" çıkışında: cd '~'olduğunu -bash: cd: ~: No such file or directory.
pa4080

2
@ pa4080 Genişlemesi ~, parametre genişlemesinin bir parçası değildir.
Barmar
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.