bash script kaynağı: Böyle bir dosya veya dizin yok


9

Böyle başlayan bir senaryom var

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

ama koştuğumda geri dönüyor line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

ama dosya var ve ben çalıştırdığımda source ~/myProjects/valkyrie/cluster.confiyi çalışır. Herhangi bir fikir? Ben set VALKYRIEböylece yolunda gömmemeli bir seçenek değildir başka bir yerde değişkeni.


Bunun yardımcı olup olmayacağından% 100 emin değilim, ancak ~ içinde boşluklar varsa, değişkeni tamamen alıntılamayı deneyebilirsiniz. Dolayısıyla source "${VALKYRIE}/cluster.conf",.
Sparhawk

Hayır, yardımcı olmuyor.
Khoi

1
Bence bu ~doğru bir şekilde genişlememekle ilgili bir şey . Komut dosyanızı kasıtlı olarak sahte bir yolla çalıştırdığımda, hata söylemiyor ~, ancak yolu genişletiyor. ~Senaryonuzdaki mutlak yolu değiştirmeyi deneyebilir misiniz ? Ayrıca, bir komut dosyasında aşağıdakileri çalıştırmayı deneyin echo ~.
Sparhawk

2
Bunun $HOMEyerine deneyebilirsiniz ~.
Sparhawk

3
@Khoi Bunu açıklıyor. ~/.pam_environmentbir kabuk betiği değildir, bu nedenle tilde genişletme ve parametre genişletme gibi bir kabuktan bekleyebileceğiniz ortak şeyleri yapmaz, bu nedenle ne değiştirilir ne ~de $HOMEdeğiştirilir. Bu satırı ~/.profileonun yerine taşır ve export önden eklerseniz , çalışması gerekir.
geirha

Yanıtlar:


8

~düzgün genişlemiyor gibi görünüyor. Komut dosyanızı kasıtlı olarak sahte bir yolla çalıştırdığımda, hata söylemiyor ~, ancak yolu genişletiyor (yani /home/sparhawk/fakepathdeğil ~/fakepath. Bunun $HOMEyerine ~komut dosyasında tam yolu kullanmayı veya kullanmayı deneyebilirsiniz .

( ~Komut dosyanız benim için iyi çalıştığı için neden sisteminizde çalışmadığından emin değilim .)


Bash'ın genişletmeleri gerçekleştirdiği sıraya baktığınızda ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), değişken genişletmeden önce tilde genişletmesinin gerçekleştiğini görürsünüz . Bu yüzden bir değişkenden $HOMEdaha iyidir~
Glenn Jackman

@glennjackman Anladığımdan emin değilim. Öncelik, değişkenler vs. için neden önemlidir ~?
Sparhawk

1
tam olarak "öncelik" değildir, basitçe önce gelen şeydir. Düşünün x="~/.bashrc"; ls $x- "ls" komutu için genişletme sırasında bash bir tilde arar ve bir tane bulamaz; sonunda bash bir değişkeni görür ve genişletir. bash geri dönüp tekrar tildleri aramaz, bu noktada sadece düz bir karakterdir. ve geçerli dizinde tilde ile başlayan dosya yok.
glenn jackman

Ah tamam. Sanırım anladım. Her zaman bu komutun neden başarısız olduğunu ve x=~/".bashrc"; ls $xçalıştığını merak ettim . Bilgi için teşekkürler.
Sparhawk
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.