Bu ilginç bir tanesi. ~
için $HOME
'un değiştirilmesi, ödevin alıntıdan çıkarılması gibi çalışır.
Bu komut dosyasının en üstünde bir set -x
koyarsanız, tırnak işareti içeren sürümün -e
için verilen dosya olan ~/...
olarak ayarlandığını görürsünüz. Tırnakları kaldırırsanız, dosya adı genişletilmiş /home/somebody/...
'a ayarlanır. Yani ilk durumda, görüyorsunuz:
+ [ -e ~/... ]
ve bunu sevmiyor. İkinci durumda, gördüğünüz:
+ [ -e /home/somebody/... ]
ve çalışır. değişkene olmadan yaparsanız
, gördüğünüz:
+ [ -e /home/somebody/... ]
ve evet, işe yarıyor. Soruşturmanın biraz sonra
, ben aslında
bash
onun açılımları gerçekleştirir sırası olduğunu gördük. bash adam sayfasından:
açılımları sırası şöyledir: ayracı genişletme, yaklaşık yorumlaması, parametre, değişken ve (soldan-sağa şekilde hazırlanacaktır) aritmetik genişleme ve komut ikamesi, kelime bölme ve yol adı genişleme. işe yaramıyor yüzden
, değişken yaklaşık yorumlaması sonra ikame edilir. Başka bir deyişle, bash
'un ~
'u genişletmek istediği noktada, bir tane yok. Değişken genişlemeden sonra sadece kelime ~/...
olarak değişir ve bundan sonra tilde genişleme olmaz.
Bir şey olabilir yapmak için if
deyimi değiştirmektir: iki kez $ dosya argümanı değerlendirecek
if [[ -e $(eval echo $filename) ]]; then
Bu. İlk kez (eval
ile), tilde genişleme fazı sırasında ~
olmayacaktır, ancak $filename
, değişken genleşme fazı sırasında olarak değiştirilecektir.Daha sonra, ikinci değerlendirmede (if
'un bir parçası olarak yapılmakta olan), ~
, tilde genişleme aşamasında orada olacaktır.
Bunu .profile
dosyamda denedim ve işe yarıyor gibi görünüyor, özel durumunuzu doğrulamanızı öneririz.
Komut satırında kullanılmaması gereken komut satırı kolaylığını '~ 'olarak kabul ediyorum. –