Bir komut dosyası çalıştırılırken 'kaynak: bulunamadı' hata mesajı


34

Bazı yolları dışa aktarılmamışsa /etc/profileve değiştirecek küçük bir otomatik kurulum komut dosyası oluşturuyorum $HOME/.profile. Sonra bunları otomatik olarak yeniden yüklemek istiyorum.

Bunu okudum source, bu yüzden terminalimi çalıştırdım ve girdim:

source /etc/profile
source ~/.profile

Terminalden herhangi bir hata vermedi.

Ancak, bu iki komutu Bash komut dosyasının içine koymakla sonuçlanır source: not found.

  1. #!/bin/shBelirtilmiş olsa bile betiğin Bash tarafından yürütüldüğünden nasıl emin olabilirim (görünüşe göre, bunu garanti etmez)?
  2. Neden bu iki kaynağın açık bir şekilde orada olduklarında bulunamadığını söylesin?

Yanıtlar:


53

/bin/shdeğil bash. İle komut yürütmek için bash, yazma #!/bin/bashkomut dosyanızda ilk satırı olarak.

Hata bulunamadı source: not found, çünkü /etc/profilebulunamadı. Düşmüş, çünkü sourcebulunamadı. sourcebir Bash yerleşik işlevidir ve siz betiği ile çalıştırmazsınız bash. Bu yüzden neden bulunamadığı açık. Koddaki #!satırı değiştirirseniz çalışır.


9

1. Komut dosyasının Bash tarafından yürütüldüğünden #!/bin/sh, belirtilse bile (görünüşte garanti etmez) nasıl emin olabilirim?

shShell için yazılmış bir betiğin (sizin durumunuzdaki gibi - bkz. #! / Bin / sh ile #! / Bin / bash arasındaki fark nedir? ) Bash tarafından yürütüldüğünden emin olmak için, yalnızca aşağıdaki komutu çalıştırın:

bash script_name

Böylece, artık bu hatayı almayacaksınız.

2. Neden bu iki kaynağın açık bir şekilde orada olduklarında bulunamadığını söylesin?

Bu kaynaklı dosyaların orada olmadığını söylemez. sourceKomutun bulunmadığını söylüyor . Bu normaldir, çünkü betiğinizi #!/bin/shline ile başlattığınızdan, betiğiniz düşündüğünüz gibi shdeğil çalışacaktır bash. Neden normal? Çünkü sourcekomut bir Bash yerleşiktir, fakat shyerleşik değildir . Bir dosyayı kaynaklamak için shkullanmanız gerekir .(nokta). Örnek:

. /etc/profile
. ~/.profile

Başka bir yol da, shebang hattını cevabında söylediği #!/bin/bashgibi kaos olarak değiştirmektir .


4

Bu SO soruya bakın :

/bin/shgenellikle Shell'i taklit etmeye çalışan başka bir kabuktur. Birçok dağıtım kullanmak /bin/bashiçin sho kaynağı destekler. Ubuntu'da ise, /bin/dashkaynağı desteklemeyen kullanılır. Komut dosyasını düzenleyemezseniz, onu çalıştıran kabuğu değiştirmeyi deneyin.

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.