#! / bin / bash - tidak ada file atau direktori seperti itu


70

Saya telah membuat skrip bash tetapi ketika saya mencoba untuk mengeksekusinya, saya mengerti

#!/bin/bash no such file or directory

Saya perlu menjalankan perintah: bash script.shagar berfungsi.

Bagaimana saya bisa memperbaikinya?


Saya memiliki masalah ini sekarang di bawah cygwin dengan skrip yang saya bisa sumpah sudah berjalan tanpa masalah. Saya memeriksa semua jawaban, tetapi sepertinya tidak ada yang cocok. Pertanyaan dan jawaban lain juga menyebutkan masalah 32/64 bit, tetapi untuk skrip shell ini dapat dikecualikan, kan?
Januari

Ditemukan alasannya, menambahkan rincian di anwer baru unix.stackexchange.com/a/450389/62636 dalam kasus seseorang juga telah digunakan #!/usr/bin/env bashsebagai pengganti #!/bin/bashdan juga mencari di sini ...
Januari

Jawaban:


100

Jenis pesan ini biasanya disebabkan oleh jalur shebang palsu, baik kereta tambahan kembali di akhir baris pertama atau BOM di awal.

Lari:

$ head -1 yourscript | od -c

dan lihat bagaimana akhirnya.

Ini salah:

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

Ini salah juga:

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

Ini benar:

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

Gunakan dos2unix(atau sed, tr, awk, perl, python...) untuk memperbaiki naskah Anda jika ini adalah masalah.

Ini adalah salah satu yang akan menghapus BOM dan tailing CRs:

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


Perhatikan bahwa shell yang Anda gunakan untuk menjalankan skrip akan sedikit memengaruhi pesan kesalahan yang ditampilkan.

Berikut adalah tiga skrip yang hanya menunjukkan nama mereka ( echo $0) dan memiliki baris shebang masing-masing berikut:

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

Di bawah bash, menjalankannya akan menampilkan pesan-pesan ini:

$ ./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

Menjalankan yang palsu dengan memanggil juru bahasa secara eksplisit memungkinkan skrip CRLF berjalan tanpa masalah:

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

Berikut adalah perilaku yang diamati di bawah ksh:

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

dan di bawah dash:

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

2
Cara lain untuk mengungkapkan jika ini masalahnya adalah hexdump -C yourscript | head -n 1. Saya masih akan menggunakannya dos2unix yourscriptuntuk memperbaikinya.
Kevin M

Ya bisa jadi itu. Saya mengedit di windows. Hal untuk tip.
Nicolas de Fontenay

1
Jika itu adalah masalah CRLF, Anda tidak akan melihat #!/bin/bash no such file or directorypesan kesalahan, karena tidak ada alasan apa pun akan mencoba untuk mengeksekusi atau membuka #!/bin/bash. Itu /bin/bash<CR>yang akan dieksekusi.
Stéphane Chazelas

1
@StephaneChazelas Saat dos2unix memperbaiki masalah, ada sedikit keraguan bahwa itu bukan masalah CRLF. Pesan kesalahan itu barangkali hanya ditranskrip secara tidak akurat ..
jlliagre

6
dos2unixjuga menghapus BOM UTF-8. BOM UTF-8 bisa menjelaskan pesan kesalahan.
Stéphane Chazelas


9

Sebenarnya, shebang yang tepat untuk skrip bash adalah ini:

#!/usr/bin/env bash

Karena, di freeBSD, bash terletak di /usr/local/bin/bash


13
"benar" adalah kata yang sulit untuk digunakan dalam kasus seperti itu. Mungkin ungkapan yang lebih baik akan "kurang rawan kesalahan".
HalosGhost

1
Ini juga mengerikan; asumsi bahwa / usr ada adalah yang buruk IMO. Haiku, misalnya, tidak memiliki / usr.
jessicah

9

Anda dapat menggunakan vi untuk memperbaiki kedua masalah jika ada:

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

Jawaban harus mandiri sebanyak mungkin. Pertanyaannya tidak menyebutkan dua masalah; jika Anda akan membangun jawaban lain, Anda setidaknya harus mengatakan apa itu. Lebih baik lagi, Anda harus menjelaskan bagaimana ini menjawab pertanyaan.
G-Man

Perbaikan sangat cepat tanpa mengunduh lebih banyak alat windows, terima kasih!
steampowered

1
@ G-Man Jawaban lain sudah menyebutkan hal ini dengan lebih detail daripada yang saya inginkan. Tidak perlu diulang, tetapi jika itu tidak terlalu jelas, Anda dapat memiliki akhiran baris WIndows dan karakter BOM Windows yang tersembunyi. Saya pikir banyak orang yang memindai jawaban menghargai keringkasan daripada menjadi mandiri, terutama ketika ada lebih banyak detail dalam jawaban lain.
cwash

4

Jika Anda tidak memiliki dos2unix, ini adalah cara untuk memperbaiki masalah ini.

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

3

Tanda Byte-order (BOM)

Ini bisa disebabkan oleh BOM. Dari Wikipedia, BOM adalah a

Tanda urutan byte (BOM) adalah karakter Unicode, tanda urutan byte U + FEFF (BOM), yang penampilannya sebagai angka ajaib pada awal aliran teks dapat memberi sinyal beberapa hal ke program yang menggunakan teks

Sayangnya, itu tidak memberi sinyal apa pun ke kernel Linux yang menangani garis she-bang. Anda dapat memverifikasi bahwa Anda memiliki BOM dengan menggunakan file,

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

Atau Anda dapat men-hexdump beberapa karakter pertama dan melihat apakah mereka cocok dengan salah satu karakter BOM secara manual

Anda dapat menghapus karakter BOM begitu Anda tahu mereka seperti ini,

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

0

Saya mengalami masalah dengan secara tidak sengaja menambahkan bash yang dapat dieksekusi ke PATHdan karena dalam skrip saya #!/usr/bin/env bashshebang yang lebih fleksibel digunakan (ambil bash yang dapat dieksekusi terlebih dahulu dari path).

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

Saya telah menginstal GIT untuk Windows untuk bekerja cygwinbersama dengan Windows GIT GUI (tidak bekerja dengan cygwin native git ...). Saya memecahkan ini sekarang dengan beralih ke #!/bin/bashsheband dan menghapus GIT untuk windows dari PATH.


-3

Mencoba #!/bin/bash

Hal kedua: find / -name bash
Hal ketiga:ls -al /bin/bash


Atau adil which bash. Kami tahu itu menemukan satu karena itu bekerja dengan bash script.sh.
Kevin

Benar. Dan seperti yang disebutkan, ada metode yang lebih portabel / usr / bin / env untuk memiliki program cari bash (atau juru bahasa lain) untuk Anda. Tidak perlu melakukan hardcode pah.
Hennes
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.