สคริปต์ Bash พิมพ์“ ไม่พบคำสั่ง” ในบรรทัดว่าง


112

ทุกครั้งที่ฉันเรียกใช้สคริปต์โดยใช้bash scriptname.shจากบรรทัดคำสั่งใน Debian ฉันจะได้รับCommand Not foundผลลัพธ์ของสคริปต์

สคริปต์ทำงานได้ แต่จะมีCommand Not Foundคำสั่งพิมพ์บนหน้าจอสำหรับแต่ละบรรทัดว่างเสมอ แต่ละบรรทัดว่างทำให้ไม่พบคำสั่ง

ฉันกำลังเรียกใช้สคริปต์จาก/varโฟลเดอร์

นี่คือสคริปต์:

#!/bin/bash

echo Hello World

ฉันเรียกใช้โดยพิมพ์ต่อไปนี้:

bash testscript.sh

เหตุใดจึงเกิดขึ้น


อย่างจริงจังสุทธิเต็มไปด้วยข้อร้องเรียนดังกล่าว เชลล์เป็นล่ามที่อ่อนแอและง่อยมาก ที่นี่เพียงเล็กน้อยและที่นั่นและล้มเหลว คุณต้องดูแม้แต่ช่องว่างสีขาวทั้งหมดในสคริปต์ สคริปต์ของฉันล้มเหลวเนื่องจากอักขระฟีดบรรทัดที่มองไม่เห็น อาจเป็นเพียงภาษาสคริปต์เท่านั้นที่ช่องว่างสีขาวมีความสำคัญ!
Atul

1
ใช้bash -x scriptname.shเพื่อติดตามข้อผิดพลาด - ในกรณีของฉันมันเป็นไฟล์ sh ที่บันทึกไว้ใน Windows ด้วย VSCode และลงท้ายบรรทัดเป็น "CRLF" ใน VSCode ที่มุมล่างขวาคุณสามารถเปลี่ยนตัวยุติบรรทัดจาก "CRLF" เป็น "LF" ได้ อัปโหลดไฟล์นี้และสามารถเรียกใช้งานได้ในที่สุดด้วยbash scriptname.shไฟล์.
Kai Noack

แน่นอนว่านี่เป็นสำเนาของstackoverflow.com/questions/39527571/…แต่คำตอบมากมายที่นี่อธิบายสถานการณ์อื่น ๆ ที่คุณได้รับ "command not found" ด้วยเหตุผลอื่น ๆ ผู้เยี่ยมชมควรอ่านคำตอบทั้งหมดหากปัญหาของคุณไม่ได้เกี่ยวกับบรรทัดว่างโดยเฉพาะ
tripleee

คำตอบ:


162

ตรวจสอบให้แน่ใจว่าบรรทัดแรกของคุณคือ:

#!/bin/bash

เข้าสู่เส้นทางของคุณเพื่อทุบตีถ้าไม่ใช่ /bin/bash


ลองวิ่ง:

dos2unix script.sh

ซึ่งจะแปลงส่วนท้ายบรรทัด ฯลฯ จาก Windows เป็นรูปแบบ Unix คือมันแถบ \ r (CR) จากปลายสายจะเปลี่ยนพวกเขาจากไป\r\n (CR+LF)\n (LF)

รายละเอียดเพิ่มเติมเกี่ยวกับdos2unixคำสั่ง (man page)


อีกวิธีในการตรวจสอบว่าไฟล์ของคุณอยู่ในรูปแบบ dos / Win หรือไม่:

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

ผลลัพธ์จะมีลักษณะดังนี้:

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

สิ่งนี้จะส่งออกข้อความไฟล์ทั้งหมดพร้อมกับ<CR>แสดงสำหรับแต่ละ\rอักขระในไฟล์


นั่นอาจไม่จำเป็นเนื่องจากเขาใช้มันโดยตรงbash scriptname.sh(แต่ก็ยังคงเป็นแนวทางปฏิบัติที่ดี)
paxdiablo

1
สวัสดี #! / bin / bash เป็นบรรทัดแรกของสคริปต์ของฉัน
David

1
@chown - ฉันมีปัญหาเดียวกันกับ Mac ฉันสะดุดในโพสต์นี้ ฉันไม่แน่ใจว่ามันช่วย OP หรือไม่ แต่วิธีแก้ปัญหาของคุณช่วยฉันได้
Prashant

1
ขอบคุณ. นี่คือปัญหาที่ฉันพบ คำตอบนี้ทำให้ได้ผล
slayedbylucifer

5
คุณจะเขียนคำตอบสำหรับคำถามการเขียนโปรแกรมขณะขับรถได้อย่างไร?
Omar Tariq


47

ฉันยังพบปัญหาที่คล้ายกัน ปัญหาน่าจะเป็นสิทธิ์ หากคุณทำเช่นls -lนั้นคุณอาจสามารถระบุได้ว่าไฟล์ของคุณอาจไม่ได้เปิดบิตรันไว้ สิ่งนี้จะไม่อนุญาตให้สคริปต์ทำงาน :)

ตามที่ @artooro เพิ่มในความคิดเห็น:

เพื่อแก้ไขปัญหานั้นให้เรียกใช้ chmod +x testscript.sh


4
ในการแก้ไขปัญหานั้นให้เรียกใช้chmod +x testscript.sh
artooro

นี่เป็นคำตอบที่ได้ผลสำหรับฉันมักจะถูกบอกว่าฉันไม่ได้รับอนุญาตดังนั้นฉันจึง sudo'ed และได้รับคำสั่งว่าไม่พบคำสั่ง ฉันไม่คิดจะตรวจสอบสิทธิ์
DiamondDrake

1
ขอบคุณ Lypso345 สิ่งนี้ช่วยแก้ปัญหาที่ฉันพบได้
ammills01

chmod 777 testscript.sh FTW
GeneCode

16

สิ่งนี้อาจเป็นเรื่องเล็กน้อยและไม่เกี่ยวข้องกับคำถามของ OP แต่ฉันมักทำผิดพลาดในตอนแรกเมื่อฉันเรียนรู้การเขียนสคริปต์

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

สิ่งนี้จะสร้างการตอบสนอง 'ไม่พบคำสั่ง' วิธีที่ถูกต้องคือกำจัดช่องว่าง

VAR_NAME=$(hostname)

11

หากสคริปต์ทำงานได้ดี (ค่อนข้าง) แสดงว่าทำงานได้ดี ปัญหาของคุณอาจเป็นบรรทัดเดียวในไฟล์ที่อ้างถึงโปรแกรมที่ไม่ได้อยู่ในเส้นทางไม่ได้ติดตั้งสะกดผิดหรืออะไรที่คล้ายกัน

วิธีหนึ่งคือวางไว้set -xที่ด้านบนสุดของสคริปต์ของคุณหรือเรียกใช้bash -xแทนที่จะเป็นเพียงbash- สิ่งนี้จะส่งออกบรรทัดก่อนที่จะดำเนินการและโดยปกติคุณจะต้องดูที่เอาต์พุตคำสั่งทันทีก่อนเกิดข้อผิดพลาดเพื่อดูว่าอะไรเป็นสาเหตุของปัญหา

ถ้าอย่างที่คุณพูดมันเป็นบรรทัดว่างที่ทำให้เกิดปัญหาคุณอาจต้องการตรวจสอบว่ามีอะไรอยู่ในนั้น วิ่ง:

od -xcb testscript.sh

และตรวจสอบให้แน่ใจว่าไม่มีตัวตลกที่ "มองไม่เห็น" เช่นCTRL-M(carriage return) ที่คุณอาจได้รับโดยใช้ตัวแก้ไขประเภท Windows


+1 สำหรับคำสั่ง 'od'! เจ๋งมากฉันไม่รู้เรื่องนั้น! ขอบคุณ!
chown

11

ใน Bash สำหรับ Windows ฉันพยายามเรียกใช้อย่างไม่ถูกต้อง

run_me.sh 

ไม่มี. / ที่จุดเริ่มต้นและมีข้อผิดพลาดเดียวกัน

สำหรับผู้ที่มีพื้นหลัง Windows รูปแบบที่ถูกต้องจะดูซ้ำซ้อน:

./run_me.sh



6

สำหรับการดำเนินการนั้นคุณต้องระบุเส้นทางแบบเต็มของตัวอย่างนั้น

/home/Manuel/mywrittenscript

อันที่จริงเชลล์ไม่สนใจนามสกุลไฟล์เลย ไม่แน่ใจว่าข้อดีนี้ถูกโพสต์เป็นคำตอบแยกต่างหาก
tripleee

แน่นอนในระบบไฟล์ linux ตรงกันข้ามกับส่วนขยายของ windows นั้นใช้เป็นเพียงส่วนหนึ่งของชื่อและไม่ต้องพูดอะไรเกี่ยวกับเนื้อหาของไฟล์ฉันต้องไม่พูดในข้อ จำกัดในกรณีของฉัน
Masood Moghini

6

ถ้าคุณมี Notepad ++ และคุณได้รับข้อความนี้ .sh ข้อผิดพลาด: "ไม่พบ" คำสั่ง หรือข้อผิดพลาดนี้ autoconf "สาย 615: ../../autoconf/bin/autom4te: ไม่มีแฟ้มหรือไดเรกทอรีดังกล่าว"

เมื่อวันที่ Notepad ของคุณ ++ ไปแก้ไข -> EOL แปลงแล้วตรวจสอบMacinthos (CR) สิ่งนี้จะแก้ไขไฟล์ของคุณ ฉันขอแนะนำให้ตรวจสอบไฟล์ทั้งหมดด้วยคำสั่งนี้เพราะในไม่ช้าข้อผิดพลาดดังกล่าวจะเกิดขึ้น


ขอบคุณสำหรับสิ่งนี้. สำหรับกรณีของฉันฉันกำลังเรียกใช้สคริปต์บน busybox linux distro มีข้อผิดพลาดเดียวกัน "ไม่พบ" ในบรรทัดว่างทั้งหมดในสคริปต์ของฉัน มันยังมีปัญหากับคำสั่ง if / else การเปลี่ยน EOL ใน Notepad ++ เป็น Unix ได้รับการแก้ไข
GeneCode

4

มีปัญหาเดียวกัน น่าเสียดาย

dos2unix winfile.sh
bash: dos2unix: command not found

ฉันจึงทำสิ่งนี้เพื่อแปลง

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

แล้ว

bash unixfile.sh

2

ปัญหาในการเรียกใช้สคริปต์อาจเชื่อมโยงกับการจัดรูปแบบคำสั่งหลายบรรทัดที่ไม่ถูกต้องเช่นหากคุณมีอักขระเว้นวรรคหลังบรรทัด "\" เช่นสิ่งนี้:

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

(โปรดสังเกตว่าช่องว่างหลัง "\") จะทำให้เกิดปัญหา แต่เมื่อคุณลบช่องว่างนั้นออกจะทำงานได้ดีอย่างสมบูรณ์


0

ฉันยังมีไฟล์Cannot execute command. ทุกอย่างดูถูกต้อง แต่ในความเป็นจริงฉันมีพื้นที่ที่ไม่แตกหัก&nbsp;ต่อหน้าคำสั่งของฉันซึ่งแน่นอนว่าเป็นไปไม่ได้ที่จะมองเห็นด้วยตาเปล่า:

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

ซึ่งใน Vim ดูเหมือนว่า:

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

หลังจากเรียกใช้ตัวตรวจสอบสคริปต์ Bash เท่านั้นที่shellcheckฉันพบปัญหา


shellcheckมีให้บริการทางออนไลน์แม้ว่าคุณจะต้องคัดลอก + วางสคริปต์ของคุณทุกประการเพื่อให้สามารถช่วยได้ shellcheck.net
tripleee

0

ฉันพบสิ่งนี้ในวันนี้โดยไม่ได้ตั้งใจคัดลอกพรอมต์คำสั่งดอลลาร์$(ข้างหน้าสตริงคำสั่ง) ลงในสคริปต์


-1

เพิ่มไดเร็กทอรีปัจจุบัน (.) ไปยัง PATH เพื่อให้สามารถรันสคริปต์ได้เพียงแค่พิมพ์ชื่อที่อยู่ในไดเร็กทอรีปัจจุบัน:

PATH=.:$PATH

1
นี่ถือเป็นช่องโหว่ด้านความปลอดภัย อย่าเพิ่ม.เส้นทางของคุณ
gniourf_gniourf

คำอธิบายว่าทำไม "คำตอบ" นี้จึงเป็นความคิดที่ไม่ดี: superuser.com/questions/156582/…
jmng

-1

คุณอาจต้องการอัปเดตไฟล์. bashrc และ. bash_profile ด้วยนามแฝงเพื่อจดจำคำสั่งที่คุณกำลังป้อน

ไฟล์. bashrc และ. bash_profile เป็นไฟล์ที่ซ่อนอยู่ซึ่งอาจอยู่ในไดรฟ์ C: ที่คุณบันทึกไฟล์โปรแกรมของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.