สคริปต์ Bash จะไม่ทำงานหากไม่มีการพิมพ์ "bash" ไว้ข้างหน้า


11

ในระบบโรงเรียนของเราเราสามารถเรียกใช้ไฟล์สคริปต์โดยไม่ต้องพิมพ์bashหรือcshคุณมีอะไรโดยไม่ระบุว่าเป็นสคริปต์ประเภทใด อย่างไรก็ตามบน Ubuntu ฉันต้องพิมพ์bash script.bashเป็นตัวอย่าง สิ่งนี้จำเป็นเสมอใน Ubuntu หรือเป็นการตั้งค่าที่ฉันสามารถเปลี่ยนได้บ้าง


1
มันตั้งเป็นไฟล์ที่ปฏิบัติการได้หรือไม่?
jsolarski

ใช่ไฟล์นั้นสามารถเรียกใช้งานได้ซึ่งเป็นสาเหตุที่ฉันคิดว่ามันจะทำงานด้วยตัวเอง
muttley91

1
เกิดข้อผิดพลาดอะไรขึ้นเมื่อคุณพิมพ์. / script คุณแน่ใจหรือไม่ว่าสคริปต์นั้นไม่ได้เปลี่ยนจากตัวแก้ไข Windows ที่วางอักขระพิเศษไว้ที่ท้ายบรรทัด? นั่นจะทำให้บรรทัดแรกแตกหักซึ่งชี้ว่าสคริปต์นั้นต้องถูกดำเนินการด้วย bash
João Pinto

1
คุณเริ่มต้นอย่างไรและสิ่งที่ผิดพลาดคืออะไร?
ผู้ใช้ไม่ทราบ

+1 สำหรับไม่ใช้.shสำหรับสคริปต์ทุบตี โดยทั่วไปไฟล์นามสกุลนั้นไม่ได้ใช้สำหรับสคริปต์ที่เรียกใช้งานได้ในโลก UNIX
nyuszika7h

คำตอบ:


17
  1. ให้แน่ใจว่าคุณเริ่มต้นสคริปต์ด้วย./scriptหรือเส้นทางแบบเต็มหรืออะไรก็ตาม เพียงแค่scriptอาจจะทำงานไม่ได้ (มันทำงานหากไดเรกทอรีที่อยู่ใน$PATHเช่น/usr/bin) ตั้งแต่บนระบบ UNIX มันไม่ใช่นิสัยที่จะมีไดเรกทอรีปัจจุบันในเส้นทางของคุณ (สำหรับเหตุผลด้านความปลอดภัยและจะดี!)

  2. ตรวจสอบให้แน่ใจว่าสคริปต์นั้นสามารถเรียกใช้งานได้ตัวอย่างเช่น: chmod +x scriptจะทำให้สามารถเรียกใช้งานได้

  3. ตรวจสอบให้แน่ใจว่าคุณมี#!/bin/bashบรรทัดแรกในสคริปต์ของคุณ ตรวจสอบให้แน่ใจด้วยว่ามันไม่ได้ถูกแก้ไขด้วยตัวแก้ไข Windows บางชนิดเนื่องจากสิ่งเหล่านั้นมักจะใช้ "DOS type" ของ eol (จุดสิ้นสุดของบรรทัด) ซึ่งแตกต่างจาก UNIX หนึ่ง (ถ้ารายการตรวจสอบข้างต้นนั้นใช้ได้ ล่าม: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว "หรือมากกว่านั้นแม้ว่ามันจะเป็น / bin / bash นี่ก็มักจะเป็นเหตุผลเพราะไม่ใช่การพิมพ์ - ดังนั้นคุณมักจะไม่เห็นมัน - \ r จะได้รับการปฏิบัติเหมือนเป็นส่วนหนึ่งของ เส้นทางของล่าม)

อื่น ๆ ที่กล่าวถึงแล้ว: มันเป็นสิ่งสำคัญที่จะมี/bin/bashถ้าคุณใช้คุณลักษณะทุบตียัง/bin/shถูก symlinked ไป/bin/bashแต่ตอนนี้มีวันที่ (เท่าที่ผมสังเกตเห็น) ก็ symlinked เพื่อdashที่จะไม่ให้เข้ากันได้ทุบตีเพียง shPOSIX มันค่อนข้างสำคัญแม้กระทั่งซอฟต์แวร์ราคาแพงที่ บริษัท ของเรามีปัญหานี้: สคริปต์บรรจุ#!/bin/shเป็นบรรทัดแรก แต่ขึ้นอยู่กับฟังก์ชันทุบตีเช่นกัน


ดังนั้นฉันจะต้องเรียกใช้เช่น: ./script ตามที่ฉันค้นพบ มันดีกว่าต้องพิมพ์ "bash" ทุกครั้งและมันสมเหตุสมผลดี ฉันเชื่อว่าฉันรู้เรื่องนี้มาก่อนมันแค่ทำให้จิตใจของฉันลื่น โอ้ขอบคุณมาก!
muttley91

ในทางทฤษฎีคุณสามารถใส่ไดเร็กตอรี่ปัจจุบันลงในตัวแปร PATH ดังนั้นคุณสามารถใช้เพียงแค่ "script" แทน "./script" แต่ฉันเตือนคุณ: นี่ไม่ใช่นิสัยของระบบ UNIX และมันอาจเป็นปัญหาด้านความปลอดภัย ! นอกจากนี้ยังไม่ดีในโรงเรียนที่จะเรียนรู้สิ่งต่าง ๆ ในแบบที่ไม่เคยเป็นทางออกสำหรับระบบ UNIX ดังนั้นฉันจะหลีกเลี่ยงวิธีนี้ ...
LGB

1
หรือโดยเฉพาะอย่างยิ่ง#!/usr/bin/env bashซึ่งพกพาได้เล็กน้อย
Sparhawk

4

ตรวจสอบให้แน่ใจว่าบรรทัดแรกของไฟล์อ่าน:

#!/bin/bash

หากเป็น Shebang #!/bin/shคุณไม่ควรใช้คุณสมบัติเฉพาะ bash เฉพาะ POSIX เท่านั้น แม้ว่า/bin/shจะเป็นการเชื่อมโยงไปถึงbashbash จะทำงานในโหมดความเข้ากันได้ POSIX เมื่อทำงานเป็น sh ทำให้ปิดใช้งานคุณลักษณะทุบตี (แต่ไม่ใช่ทั้งหมด)

คุณจะต้องตรวจสอบให้แน่ใจว่าสคริปต์นั้นสามารถเรียกใช้งานได้แน่นอน


ไม่ฉันตั้งมันให้ทุบตีนิสัยจนไม่อยู่ดี
muttley91

0

ทางเลือกกำลังใจอย่างมากวิธีที่จะเพิ่มการ.PATH

PATH=".:$PATH"

หรือ

PATH="$PATH:."

ปัญหาเกี่ยวกับวิธีการนี้คือในกรณีก่อนหน้าคำสั่งของระบบใด ๆ อาจถูกแทนที่ด้วย executables จากไดเรกทอรีปัจจุบันและในกรณีหลังคำสั่งที่ไม่รู้จักอาจยังถูกแทนที่

พิจารณาสิ่งต่อไปนี้:

ไฟล์: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

เป็นไปได้ว่าคุณจะไม่สังเกตเห็นจนกว่าจะสายเกินไป


1
การเลือกคำผิดไปเล็กน้อยที่นี่ คำสั่งจะไม่ถูกแทนที่ หากคุณมีคำสั่งในไดเรกทอรีการทำงานปัจจุบันที่เกิดขึ้นจะมีชื่อเดียวกับชื่อหนึ่งที่อาศัยอยู่ในไดเรกทอรีระบบกล่าวว่าechoสำหรับตัวอย่างเช่นหนึ่งในไดเรกทอรีของคุณจะถูกใช้เพียงเพราะไดเรกทอรีที่กำหนดไว้ในตัวแปรก่อนPATH /binเชลล์จะค้นหาคำสั่งในไดเรกทอรีเฉพาะโดยขึ้นอยู่กับลำดับของPATHมันและจะไม่แทนที่ / ทำลายสิ่งใด แต่ใช่สิ่งนี้มีความหมาย
Sergiy Kolodyazhnyy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.