#! / bin / bash - böyle bir dosya veya dizin yok


70

Bir bash betiği yarattım ancak çalıştırmayı denediğimde anladım

#!/bin/bash no such file or directory

Komutu çalıştırmam gerekiyor: bash script.shçalışması için.

Bunu nasıl düzeltebilirim?


Şimdi bu sorunu cygwin altında yemin edebilirim bir senaryo ile zaten sorunsuz çalışıyordu. Tüm cevapları kontrol ettim ama hiçbiri uygun görünmüyor. Diğer sorular ve cevaplar ayrıca 32/64 bit sorunlardan da bahsetti, ancak kabuk komut dosyaları için bu dışlanabilirdi, değil mi?
Ocak

Sebep bulundu, birisinin yerine kullanması ve burada da aranması durumunda unix.stackexchange.com/a/450389/62636 adresinde yeni anwer detaylarını ekledi ...#!/usr/bin/env bash#!/bin/bash
Ocak

Yanıtlar:


100

Bu tür bir mesaj genellikle sahte bir Shebang hattından kaynaklanır, ya ilk satırın sonunda ekstra bir satır başı ya da başlangıcında bir malzeme listesi.

Çalıştırmak:

$ head -1 yourscript | od -c

ve nasıl bittiğini görün.

Bu yanlış:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Bu da yanlış:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Doğru:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Kullanın dos2unix(veya sed, tr, awk, perl, pythonbu sorunu ise Senaryonu düzeltmek için ...).

Hem bir malzeme listesi hem de CR’leri takip edecek olanı burada bulabilirsiniz:

sed -i '1s/^.*#//;s/\r$//' brokenScript


Komut dosyasını çalıştırmak için kullandığınız kabuğun, görüntülenen hata iletilerini biraz etkileyeceğini unutmayın.

İşte sadece isimlerini ( echo $0) gösteren ve aşağıdaki ilgili shebang satırlarına sahip üç script :

correctScript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Bash altında, onları çalıştırmak şu mesajları gösterir:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Terbiyeli olanları tercüman olarak açıkça çağırmak, CRLF betiğinin herhangi bir sorun olmadan çalışmasına izin verir:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

İşte altında gözlemlenen davranış ksh:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

ve altında dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom

2
Sorunun bu olup olmadığını açıklamanın başka bir yolu hexdump -C yourscript | head -n 1. dos2unix yourscriptDüzeltmek için hala kullanırdım .
Kevin M

Evet çok iyi olabilirdi. Pencerelerde düzenleme yaptım. Bahşiş için şeyler.
Nicolas de Fontenay

1
Bir CRLF sorunu olsaydı #!/bin/bash no such file or directory, hiçbir şeyin yürütmeye ya da açmaya çalışmasının bir nedeni olmadığından bir hata mesajı görmezdiniz #!/bin/bash. Bu /bin/bash<CR>idam olurdu.
Stéphane Chazelas

1
@StephaneChazelas dos2unix sorunu çözdüğü için, CRLF problemi olmadığı konusunda çok az şüphe var. Hata mesajı muhtemelen yanlış bir şekilde transkripsiyona
uğradı

6
dos2unixayrıca bir UTF-8 Malzeme Listesini de kaldırır. Bir UTF-8 Malzeme Listesi hata mesajını açıklamış olabilir.
Stéphane Chazelas


9

Aslında, bash betiği için doğru shebang şudur:

#!/usr/bin/env bash

Çünkü freeBSD’de bash /usr/local/bin/bash


13
“hak” bu gibi durumlarda kullanılması zor bir kelimedir. Belki de daha iyi bir cümle "daha az hataya eğilimli" olacaktır.
HalosGhost 27.04.2014

1
Bu da korkunç; / usr'ın var olduğu varsayımı kötü bir IMO'dur. Haiku, örneğin, / usr yok.
jessicah

9

Varsa her iki sorunu çözmek için vi kullanabilirsiniz:

vi <your_file>
:set ff=unix
:set nobomb
:wq

Cevaplar mümkün olduğunca kendi kendine yeterli olmalıdır. Soru iki problemden bahsetmiyor; Eğer başka cevaplar üzerine inşa edecekseniz, en azından ne olduğunu söylemelisiniz. Daha da iyisi, bunun soruyu nasıl cevapladığını açıklamalısınız .
G-Man

Daha fazla pencere aracı indirmeden çok hızlı düzeltme, teşekkürler!
steampowered

1
@ G-Man Diğer cevaplar, bu konuya girmek istediğimden çok daha detaylı bir şekilde bahsetti. Tekrar etmenize gerek yok, ancak eğer acı verici bir şekilde açık değilse, bir WIndows satırı biten ve gizli bir Windows BOM karakteri olabilir. Bence cevapları tarayan pek çok insan, özellikle diğer cevaplarda çok daha fazla ayrıntı olduğunda, kendi içinde olmak yerine kısalıklara değer veriyor.
cwash,

4

Dos2unix'iniz yoksa bu sorunu çözmenin bir yoludur.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4

3

Bayt Sırası Markası (BOM)

Buna bir malzeme listesi neden olabilir. Vikipedi, bir malzeme listesi bir

Bayt siparişi işareti (BOM), bir metin akışının başlangıcında sihirli bir sayı olarak görünen metni birkaç şeyi işaret eden bir programa işaret edebilen Unicode karakter, U + FEFF bayt sipariş işaretidir (BOM).

Ne yazık ki, She-Bang hattını idare eden Linux çekirdeğine hiçbir şey işaret etmiyor. Kullanarak bir malzeme listesi olduğunu doğrulayabilirsiniz file,

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

Veya ilk birkaç karakterin altını çizebilir ve BOM karakterlerinden herhangi biriyle manuel olarak eşleşip eşleşmediklerini görebilirsiniz.

BOM karakterlerini böyle öğrendikten sonra soyun.

sed -i '1 s/^\xef\xbb\xbf//' *.txt

0

Yanlışlıkla bash çalıştırılabilir bir bash dosyası ekleyerek sorunu yaşadım PATHve #!/usr/bin/env bashbetiğimde daha esnek shebang kullanıldı (ilk bash yolundan çalıştırılabilir al).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

cygwinWindows GIT GUI'leri ile birlikte çalışması için GIT for Windows programını yükledim (cygwin native git ... ile çalışmıyordu). Bunu şimdi başa #!/bin/bashgeçip pencerelerden GIT'i kaldırarak çözdüm PATH.


-3

Deneyin #!/bin/bash

İkinci şey: find / -name bash
Üçüncü şey:ls -al /bin/bash


Ya da sadece which bash. Bir tane bulduğunu biliyoruz çünkü işe yarıyor bash script.sh.
Kevin,

Doğru. Ve belirtildiği gibi, bir programın sizin için bash (veya başka bir tercüman) bulabilmesi için daha taşınabilir / usr / bin / env yöntemi vardır. Bir pah kodlamaya gerek yok.
Hennes
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.