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?
#!/usr/bin/env bash
#!/bin/bash
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?
#!/usr/bin/env bash
#!/bin/bash
Yanıtlar:
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
, python
bu 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
İş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
hexdump -C yourscript | head -n 1
. dos2unix yourscript
Düzeltmek için hala kullanırdım .
#!/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.
dos2unix
ayrıca bir UTF-8 Malzeme Listesini de kaldırır. Bir UTF-8 Malzeme Listesi hata mesajını açıklamış olabilir.
Bu ayrıca UTF-8 betiğindeki BOM tarafından da kaynaklanabilir. Komut dosyasını Windows'ta oluşturursanız, bazen dosyanın başında bir miktar önemsiz kalırsınız.
Aslında, bash betiği için doğru shebang şudur:
#!/usr/bin/env bash
Çünkü freeBSD’de bash /usr/local/bin/bash
Varsa her iki sorunu çözmek için vi kullanabilirsiniz:
vi <your_file>
:set ff=unix
:set nobomb
:wq
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
Yanlışlıkla bash çalıştırılabilir bir bash dosyası ekleyerek sorunu yaşadım PATH
ve #!/usr/bin/env bash
betiğimde daha esnek shebang kullanıldı (ilk bash yolundan çalıştırılabilir al).
command -v bash
/cygdrive/c/Program Files/Git/bin//bash
cygwin
Windows 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/bash
geçip pencerelerden GIT'i kaldırarak çözdüm PATH
.
Deneyin #!/bin/bash
İkinci şey: find / -name bash
Üçüncü şey:ls -al /bin/bash
which bash
. Bir tane bulduğunu biliyoruz çünkü işe yarıyor bash script.sh
.