Skrip Bash mencetak "Command Not Found" pada baris kosong

111

Setiap kali saya menjalankan skrip menggunakan bash scriptname.shdari baris perintah di Debian, saya mendapatkan Command Not founddan kemudian hasil skrip.

Skrip berfungsi tetapi selalu ada Command Not Foundpernyataan yang dicetak di layar untuk setiap baris kosong. Setiap baris kosong menghasilkan perintah tidak ditemukan.

Saya menjalankan skrip dari /varfolder.

Berikut skripnya:

#!/bin/bash

echo Hello World

Saya menjalankannya dengan mengetik yang berikut:

bash testscript.sh

Mengapa ini terjadi?

David
sumber
Serius, net penuh dengan keluhan seperti itu. Shell sangat lemah dan pincang penerjemah. Sedikit di sana-sini dan gagal. Anda bahkan harus menonton semua ruang putih dalam skrip. Skrip saya gagal karena karakter baris feed tidak terlihat. Mungkin ini hanya bahasa skrip di mana spasi putih penting!
Atul
1
Gunakan bash -x scriptname.shuntuk melacak kesalahan. - Dalam kasus saya itu adalah file-sh yang disimpan di bawah Windows dengan VSCode dan ujung baris sebagai "CRLF". Di VSCode di pojok kanan bawah Anda dapat mengubah terminator baris dari "CRLF" menjadi "LF". Mengupload file ini dan akhirnya dapat menjalankannya dengan bash scriptname.sh.
Kai Noack
Ini jelas merupakan duplikat dari stackoverflow.com/questions/39527571/… tetapi banyak jawaban di sini menjelaskan sejumlah situasi lain di mana Anda mendapatkan "perintah tidak ditemukan" karena alasan lain. Pengunjung disarankan untuk membaca semua jawaban jika masalah Anda tidak secara khusus tentang baris kosong.
tripleee

Jawaban:

161

Pastikan baris pertama Anda adalah:

#!/bin/bash

Masukkan jalur Anda menuju pesta jika tidak /bin/bash


Coba jalankan:

dos2unix script.sh

Itu akan mengubah akhiran baris, dll dari Windows ke format unix. yaitu menghapus \ r (CR) dari ujung baris untuk mengubahnya dari \r\n (CR+LF)menjadi \n (LF).

Lebih detail tentang dos2unixperintah (halaman manual)


Cara lain untuk mengetahui apakah file Anda dalam format dos / Win:

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

Outputnya akan terlihat seperti ini:

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

Ini akan menampilkan seluruh teks file dengan <CR>ditampilkan untuk setiap \rkarakter dalam file.

chown
sumber
Itu mungkin tidak perlu karena dia menjalankannya secara langsung bash scriptname.sh(tapi ini masih latihan yang bagus, tentu saja).
paxdiablo
1
Hai #! / Bin / bash adalah baris pertama dari skrip saya
David
1
@chown - Saya memiliki masalah yang sama di Mac. Saya menemukan posting ini. Saya tidak yakin apakah itu membantu OP atau tidak. Tapi solusi Anda membantu saya.
Prashant
1
Terima kasih. Inilah persis masalah yang saya hadapi. Jawaban ini berhasil.
slayedbylucifer
5
Bagaimana Anda bisa menulis jawaban untuk pertanyaan pemrograman saat mengemudi?
Omar Tariq
61

Anda dapat menggunakannya bash -x scriptname.shuntuk melacaknya.

clyfish
sumber
47

Saya juga mengalami masalah serupa. Masalahnya sepertinya adalah izin. Jika Anda melakukannya ls -l, Anda mungkin dapat mengidentifikasi bahwa file Anda mungkin TIDAK mengaktifkan bit eksekusi. Ini TIDAK akan memungkinkan skrip untuk dieksekusi. :)

Seperti yang ditambahkan @artooro dalam komentar:

Untuk memperbaiki masalah itu, jalankan chmod +x testscript.sh

Lypso345
sumber
4
Untuk memperbaiki masalah itu, jalankanchmod +x testscript.sh
artooro
Ini adalah jawaban yang berhasil untuk saya, Selalu diberi tahu bahwa saya tidak memiliki izin, jadi saya sudo'ed dan diberi tahu perintah tidak ditemukan. Saya tidak berpikir untuk memeriksa izin.
DiamondDrake
1
Terima kasih Lypso345, ini menyelesaikan masalah yang saya alami.
ammills01
chmod 777 testscript.sh FTW
GeneCode
16

Ini mungkin sepele dan tidak ada hubungannya dengan pertanyaan OP, tapi saya sering membuat kesalahan ini di awal ketika saya sedang belajar scripting

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

Ini akan menghasilkan respons 'perintah tidak ditemukan'. Cara yang benar adalah menghilangkan spasi

VAR_NAME=$(hostname)
altamont.dll
sumber
11

Jika skrip melakukan tugasnya (relatif) dengan baik, maka itu berjalan dengan baik. Masalah Anda mungkin satu baris dalam file yang mereferensikan program yang tidak berada di jalur, tidak diinstal, salah eja, atau yang serupa.

Salah satu caranya adalah dengan menempatkan a set -xdi bagian atas skrip Anda atau menjalankannya dengan bash -xalih - alih hanya bash- ini akan mengeluarkan baris sebelum mengeksekusinya dan Anda biasanya hanya perlu melihat keluaran perintah segera sebelum kesalahan untuk melihat apa yang menyebabkan masalah

Jika, seperti yang Anda katakan, baris kosong yang menyebabkan masalah, Anda mungkin ingin memeriksa apa yang sebenarnya ada di dalamnya. Lari:

od -xcb testscript.sh

dan pastikan tidak ada karakter lucu yang "tidak terlihat" seperti CTRL-M(carriage return) yang mungkin Anda dapatkan dengan menggunakan editor tipe Windows.

paxdiablo
sumber
1 untuk perintah 'od'! Itu keren, saya tidak tahu tentang itu! Terima kasih!
chown
11

Di Bash untuk Windows, saya mencoba menjalankan secara tidak benar

run_me.sh 

tanpa ./ di awal dan mendapatkan kesalahan yang sama.

Untuk orang dengan latar belakang Windows, formulir yang benar tampak berlebihan:

./run_me.sh
Michael Freidgeim
sumber
8

gunakan dos2unixpada file skrip Anda.

bash-o-logist
sumber
6

untuk mengeksekusi itu, Anda harus memberikan jalur lengkapnya misalnya

/home/Manuel/mywrittenscript
Masood Moghini
sumber
Memang, shell sama sekali tidak peduli dengan ekstensi file. Tidak yakin manfaat ini diposting sebagai jawaban terpisah.
tripleee
Tentu saja. di sistem file linux yang bertentangan dengan ekstensi windows digunakan hanya sebagai bagian dari nama dan tidak mengatakan apa-apa tentang konten file. Saya tidak boleh mengatakan dalam kendala kasus saya .
Masood Moghini
6

Jika Anda memiliki Notepad ++ dan mendapatkan Pesan Kesalahan .sh ini: "perintah tidak ditemukan" atau Pesan Kesalahan autoconf ini "baris 615: ../../autoconf/bin/autom4te: Tidak ada file atau direktori seperti itu" .

Di Notepad ++ Anda, Pergi ke Edit -> EOL Conversion lalu centang Macinthos (CR) . Ini akan mengedit file Anda. Saya juga mendorong untuk memeriksa semua file dengan perintah ini, karena kesalahan seperti itu akan segera terjadi.

Juniar
sumber
Terima kasih untuk ini. Untuk kasus saya, saya menjalankan skrip di distro linux busybox. Memiliki kesalahan yang sama "tidak ditemukan" di semua baris kosong di skrip saya. itu juga bermasalah dengan pernyataan if / else. mengubah EOL di Notepad ++ menjadi Unix memperbaikinya.
GeneCode
4

Punya masalah yang sama. Sayangnya

dos2unix winfile.sh
bash: dos2unix: command not found

jadi saya melakukan ini untuk mengonversi.

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

lalu

bash unixfile.sh
Eugene Cuz
sumber
2

Masalah dengan menjalankan skrip mungkin juga terkait dengan pemformatan yang buruk dari perintah multi-baris, misalnya jika Anda memiliki karakter spasi setelah pemutusan baris "\". Misalnya ini:

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

(harap dicatat bahwa spasi ekstra setelah "\") akan menyebabkan masalah, tetapi ketika Anda menghapus spasi itu, itu akan berjalan dengan baik.

Marek Wysocki
sumber
0

Saya juga mengalami beberapa Cannot execute command. Semuanya tampak benar, tetapi sebenarnya saya memiliki ruang yang tidak dapat dipecahkan &nbsp;tepat sebelum perintah saya yang tentu saja tidak mungkin dilihat dengan mata telanjang:

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

Yang, di Vim, tampak seperti:

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

Hanya setelah menjalankan pemeriksa skrip Bash shellchecksaya menemukan masalah.

Stefan van den Akker
sumber
shellchecktersedia secara online, meskipun Anda tentu saja perlu menyalin + menempelkan skrip Anda dengan tepat agar dapat membantu. shellcheck.net
tripleee
0

Saya mengalami ini hari ini, tanpa sadar menyalin prompt perintah dolar $(di depan string perintah) ke dalam skrip.

CNSKnight
sumber
-1

Tambahkan direktori saat ini (.) Ke PATH agar dapat mengeksekusi skrip, hanya dengan mengetikkan namanya, yang berada di direktori saat ini:

PATH=.:$PATH
Mike Goethals
sumber
1
Ini dianggap sebagai kerentanan keamanan. JANGAN TAMBAHKAN .KE JALAN ANDA.
gniourf_gniourf
Penjelasan mengapa "jawaban" ini adalah ide yang buruk: superuser.com/questions/156582/…
jmng
-1

Anda mungkin ingin memperbarui file .bashrc dan .bash_profile dengan alias untuk mengenali perintah yang Anda masukkan.

File .bashrc dan .bash_profile adalah file tersembunyi yang mungkin terletak di drive C: tempat Anda menyimpan file program.

Kean Amaral
sumber