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?


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.


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.


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


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)

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.


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



6

untuk mengeksekusi itu, Anda harus memberikan jalur lengkapnya misalnya

/home/Manuel/mywrittenscript

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.


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

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.


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.


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.



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

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.