Düzeltme: Linux'ta “Kötü Tercüman: Böyle Bir Dosya veya Dizin Yok” Hatası

Yayınlanan: 2023-05-01
Cherry KW 9200 Mini Klavyede yazı yazan kişi
Hannah Stryker / Nasıl Yapılır Geek
Bir kabuk betiğini çalıştırırken "kötü yorumlayıcı: böyle bir dosya veya dizin yok" hatası alırsanız, betik dosyanızı Windows'tan Unix satır sonlarına dönüştürmeniz gerekir. Yöntemlerden biri, dos2unix komutunu şu şekilde kullanmaktır:

dos2unix komut dosyası1.sh

Bir Bash betiği çalıştırmayı denediniz ve "/bin/bash^M: kötü yorumlayıcı: Böyle bir dosya veya dizin yok" hata mesajı aldınız mı? Çıktı pek yardımcı değil ve neredeyse betiğinizin eksik olduğu izlenimini veriyor. Neyse ki, durum böyle değil ve düzeltme çok basit.

İçindekiler

"Kötü Tercüman: Böyle Bir Dosya veya Dizin Yok" Hatası Nedir?
"Kötü Tercüman: Böyle Bir Dosya veya Dizin Yok" Hatası Nasıl Düzeltilir
dos2unix Komutunu Kullanma
tr Komutunu Kullanma
sed Komutunu Kullanma
vi veya vim kullanma
Geany'yi kullanma
Kate veya Kwrite'ı Kullanma
Notepad++'ı kullanma
VS Kodunu Kullanma

“Kötü Tercüman: Böyle Bir Dosya veya Dizin Yok” Hatası Nedir?

/bin/bash^M: bad interpreter: No such file or directory şeklinde bir hata mesajı almak, kabuk betik dosyanızın yanlış satır sonlarına sahip olduğu anlamına gelir; Sonraki satır. DOS tabanlı Windows \r\n olarak not edilmiş bir "satır başı ve satır besleme" (CRLF) sonlandırıcısını görmeyi sever. Buna karşılık, Linux, modern macOS ve diğer Unix tabanlı sistemler yalnızca "satır besleme" (LF) veya \n kullanır.

Bu kötü yorumlayıcı hatasını görüyorsanız, muhtemelen siz veya betiği aldığınız kişi onu bir Windows bilgisayarda yazmış olabilir. Bash, Windows bilgisayarı tarafından ayarlanan \r\n satır sonlarını görür ve kabuğun betiğinizi doğru şekilde yorumlamasını engellediği için üzülür.

Linux komut satırında "kötü yorumlayıcı: böyle bir dosya veya dizin yok" hata mesajı.

file komutunu betiğinize işaret ederek sorunu bir Linux terminalinde bile onaylayabilirsiniz.

 dosya script1.sh 

Linux'ta file komutuyla bir dosyanın satır sonlarını kontrol edin.

Dosya DOS satır sonları kullanıyorsa, çıktıya eklenen "CRLF satır sonlandırıcılı" mesajını görürsünüz. Komut dosyamız uygun Unix (LF) yeni satırlarını kullanıyor olsaydı, sonlandırıcılardan hiç bahsetmezdi. Neyse ki, LF işine geri dönmek kolaydır.

“Kötü Tercüman: Böyle Bir Dosya veya Dizin Yok” Hatası Nasıl Düzeltilir

Bu hata mesajından kurtulmak ve komut dosyalarınızı normal şekilde çalıştırmaya başlamak için tek yapmanız gereken, DOS satır sonlarından Unix satır sonlarına geçiş yapmaktır. Bunu terminal komutlarıyla veya favori kod düzenleyicinizde yapabilirsiniz. Bunu düzeltmenin sekiz yolu:

dos2unix Komutunu Kullanma

Yalnızca DOS (aka, Windows) dosyalarını uygun bir şekilde dos2unix adlı tamamen Unix uyumlu dosyalara dönüştürmek için yapılmış bir komut satırı programı var. Çoğu varsayılan depoda mevcuttur, bu nedenle onu Ubuntu'ya şu şekilde kurabilirsiniz:

 sudo apt dos2unix'i kurun

Fedora kurulumumuzda dos2unix önceden yüklenmiş olarak geldi, ancak sahip olduğunuzu onaylayabilirsiniz:

 sudo dnf dos2unix'i kurun

Arch Linux'ta:

 sudo pacman -S dos2unix

dos2unix kullanmak basittir; sadece dosya adını ver.

 dos2unix komut dosyası1.sh 

dos2unix komutunu girin.

Komut dosyanızı çalıştırmadan önce dönüştürmenin başarılı olduğunu onaylamak istiyorsanız file ile kontrol edin. Ayrıca, birden çok dosyayı yalnızca bir boşlukla ayırarak adlandırarak toplu dönüştürme yapabilirsiniz.

 dos2unix script1.sh script2.sh script3.sh

Veya tutarlı bir dosya adlandırmanız varsa, elbette joker karakterler kullanarak daha kısa komutlar yazabilirsiniz.

 dos2unix betiği*.sh 

Bir joker karakterle dönüştürmek için dos2unix komutunuzda bir yıldız işareti kullanın.

dos2unix komutu, dosya sahipliğini değiştirmek gibi özel türde dönüştürmeler yapmanıza yardımcı olacak birkaç işarete sahiptir. CRLF'ye geri dönmek isterseniz, unix2dos ters biçiminde bile kullanabilirsiniz. Daha fazla bilgi edinmek için dos2unix --help girin.

tr Komutunu Kullanma

Özel bir yardımcı programı kuramıyorsanız veya kurmak istemiyorsanız, Linux'ta bu yeni satırları temizleyecek yerleşik araçlar vardır. tr komutuyla, satır sonlarının \r kısmını sıyırabilirsiniz, böylece elimizde \n sonlandırıcılar kalır.

 tr -d '\r' < script1.sh > script1_unix.sh

Burada tr , script1.sh dosyasının metnini alıyor, bulduğu her \r örneğini siliyor ve çıktıyı script1_unix.sh dosyası olarak kaydediyor.

sed Komutunu Kullanma

Kabuğunuzda yerleşik olan güçlü sed komutu, dosyanız için satır sonlarını da değiştirebilir.

 sed -i 's/\r//' script1.sh

sed sözdizimine aşina değilseniz, sed dosyamızı ( -i ) düzenlemesini ve her satırbaşını ( \r ) hiçbir şeyle değiştirmesini ( s/ ) söylüyoruz. Bu da bizi Unix'in tercih edilen \n satır sonlandırıcıları ile baş başa bırakıyor.

vi veya vim kullanma

Komut dosyalarınızı düzenlemek için vi veya vim kullanıyorsanız, şu anda açık olan dosyayı Unix satır sonlarına dönüştürmek için bu komutu iletmeniz yeterlidir.

 :dosya biçimini ayarla=unix 

Komut dosyası biçimini bir vim komutuyla değiştirin.

İLİŞKİLİ: Vi veya Vim Düzenleyicisinden Nasıl Çıkılır?

Geany'yi kullanma

Bir masaüstü ortamında çalışıyorsanız, dosyalarınızı Unix dünyasına hazır hale getirmek için terminalde oyalanmanıza gerek yok. Hemen hemen her kod düzenleyicide ve IDE'de satır sonları için bir geçiş vardır. Buna Geany de dahil.

Geany'de satır sonlarını dönüştürmek için Belge > Satır Sonlarını Ayarla > Dönüştür ve LF'ye (Unix) Ayarla'ya gidin.

Geany'de Belge menüsü altında "Satır Sonlarını Ayarla"ya gidin ve "Dönüştür ve LF'ye Ayarla (Unix)" seçeneğini seçin.

Komut dosyanızı kaydedin ve yeniden çalıştırmayı deneyin.

Kate veya Kwrite'ı Kullanma

Komut dosyanızı düzenlemek için Kwrite kullanıyorsanız veya Kwrite'ın daha güçlü kuzeni Kate kullanıyorsanız, Araçlar > Satır Sonu > Unix'e tıklayarak LF biçimine dönüştürebilirsiniz.

Kwrite'de, Araçlar menüsünde "Satır Sonu"nu açın ve "Unix"i seçin.

Dosyayı kaydedin ve betiğinizi yeniden çalıştırın.

Notepad++'ı kullanma

Kodu Notepad++'ta düzenlerseniz, satır sonlarını da kolayca dönüştürebilirsiniz; bu kullanışlıdır çünkü muhtemelen Windows'ta çalıştırıyorsunuzdur (Linux için Notepad++ yüklemediyseniz) ve bunları Linux sisteminize geçmeden önce dönüştürebilirsiniz. Dosya açıkken Düzen > EOL Dönüştürme > Unix (LF) seçeneğine gidin.

Komut dosyanızı çalıştırmadan önce kaydettiğinizden emin olun.

Notepad++'ın varsayılan olarak Unix satır sonları olan dosyalar oluşturmasını istiyorsanız, Ayarlar > Tercihler'e gidin, "Yeni Belge" sekmesini seçin ve "Biçim (satır sonu)" seçeneklerinin altında "Unix (LF)" radyo düğmesini tıklayın.

VS Kodunu Kullanma

Visual Studio Code (VS Code) hemen hemen aynı şekilde çalışır, yalnızca anahtarı bulmak daha da kolaydır. VS Code penceresinin sağ alt köşesindeki "CRLF"ye tıklamanız yeterlidir.

Dosya > Tercihler > Ayarlar'a gidip ayarlar arama çubuğuna eol yazarak VS Code'u varsayılan olarak Unix satır sonlarını kullanacak şekilde ayarlayabilirsiniz. En üstteki sonuç, “Eol” ayarı için bir açılır menü olmalıdır. “\n” olarak değiştirin.

VS Kodu ayarlarında, varsayılan EOL ayarını "\n" olarak değiştirin.

İLİŞKİLİ: Bash Betiklerinizin Donanım Farkındalığını Nasıl Sağlarsınız?