Bash komut dosyası boş satırlara "Komut Bulunamadı" yazıyor


112

bash scriptname.shDebian'da komut satırını kullanarak bir komut dosyasını her çalıştırdığımda, komut dosyasının Command Not foundsonucunu alıyorum .

Komut dosyası çalışır ancak Command Not Foundher boş satır için ekranda her zaman yazdırılan bir ifade vardır . Her boş satır bir komutun bulunamamasına neden olur.

Komut dosyasını /varklasörden çalıştırıyorum .

İşte senaryo:

#!/bin/bash

echo Hello World

Aşağıdakileri yazarak çalıştırıyorum:

bash testscript.sh

Bu neden olur?


Cidden, net bu tür şikayetlerle dolu. Shell çok zayıf ve ezik bir tercüman. Burada ve orada çok az ve başarısız oluyor. Senaryodaki tüm beyaz boşlukları bile izlemelisin. Komut dosyam görünmez satır besleme karakteri nedeniyle başarısız oluyordu. Muhtemelen bu sadece beyaz boşlukların önemli olduğu bir betik dilidir!
Atul

1
bash -x scriptname.shHatayı izlemek için kullanın . - Benim durumumda, Windows altında VSCode ve satır sonları "CRLF" olarak kaydedilmiş bir sh-dosyasıydı. Sağ alt köşedeki VSCode'da satır sonlandırıcıyı "CRLF" den "LF" ye değiştirebilirsiniz. Bu dosyayı yükledi ve sonunda ile çalıştırabilirdi bash scriptname.sh.
Kai Noack

Bu kesinlikle stackoverflow.com/questions/39527571/… adresinin bir kopyasıdır, ancak buradaki birçok yanıt, başka nedenlerle "komut bulunamadı" mesajı aldığınız bir dizi başka durumu açıklamaktadır. Sorununuz özellikle boş satırlarla ilgili değilse, ziyaretçilerin tüm yanıtları okumaları önerilir .
43'te üçlü

Yanıtlar:


162

İlk satırınızın şu olduğundan emin olun:

#!/bin/bash

Eğer değilse bash yolunuzu girin /bin/bash


Koşmayı deneyin:

dos2unix script.sh

Bu, satır sonlarını, vb. Windows'tan unix biçimine dönüştürecektir. yani hat uçlarından \ r (CR) onları değiştirmek için şeritler \r\n (CR+LF)için \n (LF).

dos2unixKomut hakkında daha fazla ayrıntı (man sayfası)


Dosyanızın dos / Win biçiminde olup olmadığını anlamanın başka bir yolu:

cat scriptname.sh | sed 's/\r/<CR>/'

Çıktı şunun gibi görünecek:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

Bu, dosyadaki <CR>her \rkarakter için görüntülenen tüm dosya metninin çıktısını alacaktır .


Doğrudan birlikte çalıştırdığı için muhtemelen gerekli değil bash scriptname.sh(ama yine de iyi bir uygulama tabii ki).
paxdiablo

1
Merhaba #! / Bin / bash, senaryomun ilk satırı
David

1
@chown - Mac'te de aynı sorunu yaşadım. Bu gönderiye rastladım. OP'ye yardımcı olup olmadığından emin değilim. Ama çözümünüz bana yardımcı oldu.
Prashant

1
Teşekkürler. Karşılaştığım sorun tam da buydu. Bu cevaplar işe yaradı.
slayedbylucifer

5
Sürüş sırasında bir programlama sorusuna nasıl cevap yazabilirsiniz?
Omar Tariq

61

bash -x scriptname.shİzini sürmek için kullanabilirsiniz .


47

Ben de benzer bir sorunla karşılaştım. Sorun izinler gibi görünüyor. Bunu yaparsanız ls -l, dosyanızın yürütme bitinin açık OLMADIĞINI tespit edebilirsiniz. Bu, komut dosyasının yürütülmesine izin VERMEZ. :)

@Artooro yoruma eklendiğinde:

Bu sorunu çözmek için çalıştırın chmod +x testscript.sh


4
Bu sorunu çözmek için çalıştırınchmod +x testscript.sh
artooro

Bu benim için işe yarayan cevaptı, Her zaman iznim olmadığı söylendi, bu yüzden sudo'ladım ve komutun bulunamadığı söylendi. İzinleri kontrol etmeyi düşünmedim.
DiamondDrake

1
Teşekkürler Lypso345, bu yaşadığım sorunu çözdü.
ammills01

chmod 777 testscript.sh FTW
GeneCode

16

Bu önemsiz olabilir ve OP'nin sorusuyla ilgili olmayabilir, ancak senaryo yazmayı öğrenirken bunu sık sık başta yanlış yaptım

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

Bu, 'komut bulunamadı' yanıtı üretecektir. Doğru yol, boşlukları ortadan kaldırmaktır

VAR_NAME=$(hostname)

11

Komut dosyası işini (nispeten) iyi yaparsa, o zaman sorunsuz çalışıyor demektir. Sorununuz muhtemelen yolda olmayan, yüklenmemiş, yanlış yazılmış veya benzeri bir programa atıfta bulunan dosyadaki tek bir satırdır.

Bunun bir yolu, set -xbetiğinizin en üstüne bir yerleştirmek veya bash -xsadecebash - bu, satırları çalıştırmadan önce çıktılar ve genellikle soruna neyin neden olduğunu görmek için hatadan hemen önce komut çıktısına bakmanız gerekir.

Dediğiniz gibi, sorunlara neden olan boş satırlarsa, içlerinde tam olarak ne olduğunu kontrol etmek isteyebilirsiniz . Çalıştırmak:

od -xcb testscript.sh

ve CTRL-MWindows tipi bir düzenleyici kullanarak elde edebileceğiniz (satır başı) gibi "görünmez" komik karakterler olmadığından emin olun .


'Od' komutu için +1! Bu harika, bunu bilmiyordum! Teşekkürler!
chown

11

Windows için Bash'de hatalı şekilde çalıştırmayı denedim

run_me.sh 

Başlangıçta ./ olmadan ve aynı hatayı aldı.

Windows arka planı olan kişiler için doğru form gereksiz görünüyor:

./run_me.sh



6

yürütmek için, örneğin bunun tam yolunu sağlamalısınız

/home/Manuel/mywrittenscript

Aslında, kabuk dosya uzantılarını hiç umursamıyor. Bunun ayrı bir cevap olarak gönderilmesini hak ettiğinden emin değilim.
üçlü

tabii ki .in linux dosya sisteminde windows uzantılarının aksine sadece ismin bir parçası olarak kullanılır ve dosyanın içeriği hakkında hiçbir şey söylemez . Benim durumumda kısıtlama söylememeliyim .
Masood Moghini 01

6

Notepad ++ kullanıyorsanız ve şu .sh Hata Mesajını alırsanız: "komut bulunamadı" veya bu otomatik bağlantı Hata Mesajı "satır 615: ../../autoconf/bin/autom4te: Böyle bir dosya veya dizin yok" .

Notepad ++ cihazınızda, Düzenle -> EOL Dönüştürme'ye gidin ve Macinthos'u (CR) kontrol edin . Bu, dosyalarınızı düzenleyecektir. Ayrıca bu komutla tüm dosyaları kontrol etmenizi öneririm, çünkü yakında böyle bir hata meydana gelecektir.


Bunun için teşekkürler. Benim durumum için busybox linux dağıtımında komut dosyası çalıştırıyordum. Komut dosyalarımdaki tüm boş satırlarda aynı hata "bulunamadı" oldu. if / else ifadesiyle de sorunları vardı. Notepad ++ 'da EOL'yi Unix'e değiştirmek sorunu çözdü.
GeneCode

4

Aynı sorunu yaşadım. ne yazık ki

dos2unix winfile.sh
bash: dos2unix: command not found

bu yüzden bunu dönüştürmek için yaptım.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

ve sonra

bash unixfile.sh

2

Komut dosyalarının çalıştırılmasıyla ilgili sorunlar, çok satırlı komutların kötü biçimlendirilmesine de bağlı olabilir, örneğin "\" satır kırılmasından sonra bir boşluk karakteriniz varsa. Örneğin bu:

./run_me.sh \ 
--with-some parameter

("\" sonrasındaki fazladan boşluğun lütfen unutmayın) sorunlara neden olacağını, ancak bu alanı kaldırdığınızda mükemmel şekilde düzgün çalışacağını lütfen unutmayın.


0

Ben de bazılarını alıyordum Cannot execute command. Her şey doğru görünüyordu, ama aslında emrimden &nbsp;hemen önce kırılmaz bir yerim vardı ki bu da çıplak gözle görülmesi imkansızdı:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

Vim'de şöyle görünüyordu:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

Sadece Bash komut dosyası denetleyicisini çalıştırdıktan sonra shellchecksorunu buldum.


shellcheckçevrimiçi olarak mevcuttur, ancak yardımcı olması için komut dosyanızı tam olarak kopyalayıp yapıştırmanız gerekir. shellcheck.net
üçlü

0

Bugün bununla karşılaştım, dolar komut istemini $(bir komut dizesinin önünde) betiğe dalgın bir şekilde kopyaladım .



-1

Girdiğiniz komutu tanımak için .bashrc ve .bash_profile dosyalarınızı diğer adlarla güncellemek isteyebilirsiniz.

.bashrc ve .bash_profile dosyaları, muhtemelen program dosyalarınızı kaydettiğiniz C: sürücünüzde bulunan gizli dosyalardır.

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.