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.