ฉันจะรัน bash script ใน Terminal ได้อย่างไร?


108

ฉันมีสคริปต์ทุบตีเช่น:

#!/bin/bash

echo Hello world!

ฉันจะดำเนินการใน Terminal ได้อย่างไร


27
มีสิทธิ์ดำเนินการหรือไม่ ลองแล้วchmod +x scriptname ./scriptname
สม่ำเสมอ

คำตอบ:


49

$prompt: /path/to/scriptและกด Enter โปรดทราบว่าคุณต้องตรวจสอบให้แน่ใจว่าสคริปต์มีสิทธิ์ดำเนินการ


1
หากคุณอยู่ใน/path/to ไดเร็กทอรีอยู่แล้วเช่นด้วยcd /path/toคำสั่งคุณสามารถป้อน./scriptเพื่อเรียกใช้สคริปต์ของคุณได้อย่าลืมในกรณีนี้คือ "./ 'before' script '
FrViPofm


26

cd ไปยังไดเร็กทอรีที่มีสคริปต์หรือวางไว้ในโฟลเดอร์ bin ที่อยู่ใน $ PATH ของคุณ

จากนั้นพิมพ์

./scriptname.sh

ถ้าอยู่ในไดเร็กทอรีเดียวกันหรือ

scriptname.sh

ถ้าอยู่ในโฟลเดอร์ bin


9
สิ่งนี้จะใช้ได้เฉพาะเมื่อสคริปต์มีการตั้งค่าบิตดำเนินการ ที่อาจต้องได้รับการแก้ไข
Bryan Oakley

./scriptname.shการทำงานสำหรับฉัน แต่ให้scriptname.sh เป็นสิทธิ์ของมัน scriptname.sh: command not found-rwxr-xr-x
Spikatrix

1
คำแนะนำสำหรับcdทุกที่ที่ก่อให้เกิดความเข้าใจผิดอื่น ๆ ของผู้เริ่มต้นทั่วไป เว้นแต่ว่าสคริปต์จะมีการอ้างอิงภายในซึ่งต้องการให้รันในไดเร็กทอรีเฉพาะ (เช่นต้องการอ่านไฟล์ข้อมูลที่สคริปต์ไม่มีตัวเลือกให้ชี้ไปที่อย่างอธิบายไม่ได้) คุณไม่จำเป็นต้องไปcdที่ใดก็ได้เพื่อเรียกใช้และ มักจะไม่ต้องการ
tripleee

25

คุณสามารถทำได้:
sh scriptname.sh


6
Downvote: มันผิดถ้ามันเป็น Bash script อย่างถูกต้อง
tripleee

1
Upvote: ใช้ได้ดีใน MacOS X หากสคริปต์ทุบตีของคุณอยู่ในไดเรกทอรีเดียวกัน
Karl Taylor

30
@kot "มันบังเอิญได้ผลสำหรับฉัน" อยู่ไกลจาก "นี่คือคำตอบที่ถูกต้อง" มาก มันสามารถทำงานถ้าshเป็น symlink ไปbashหรือถ้าสคริปต์ไม่ได้ใช้ใด ๆ ที่สร้างทุบตีเฉพาะ ในกรณีเดิมการใช้bashแทนshเป็นโซลูชันแบบพกพาที่ถูกต้องเท่านั้น ในกรณีหลังไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามนี้เนื่องจาก OP ถามเกี่ยวกับคำแนะนำสำหรับสคริปต์ Bash โดยเฉพาะ การละเมิดคำตอบที่ผิดนั้นไร้ความรับผิดชอบ ผู้ใช้ที่ไม่เข้าใจความแตกต่างมักโพสต์ที่นี่และจำเป็นต้องแสดงให้เห็นว่าเหตุใดคำตอบ "ได้ผลสำหรับฉัน" จึงไม่ได้ผลสำหรับพวกเขา
tripleee

@kraftydevil ด้วย ^ หนึ่งในเป้าหมายที่ซ้ำกันยอดนิยมในหัวข้อนี้: stackoverflow.com/questions/5725296/…
tripleee

5
@kot ฉันพูดซ้ำ: มีสถานการณ์ที่ใช้งานได้ (เช่นเดียวกับที่คุณพบ) แต่ไม่ใช่คำตอบที่ถูกต้องในกรณีทั่วไปสำหรับคำถามในบรรทัดแรก อย่างน้อยที่สุดคำตอบนี้ควรอธิบายถึงเงื่อนไขที่ใช้งานได้ แต่คำแนะนำของฉันคือเพียงแค่ลบคำตอบนี้
tripleee

14

ประการแรกคุณต้องทำให้มันสามารถใช้งานได้โดยใช้: chmod +x name_of_your_file_script.

หลังจากที่คุณทำให้มันสามารถเรียกใช้งานได้คุณสามารถเรียกใช้โดยใช้ไฟล์ ./same_name_of_your_file_script


10

เปลี่ยนไดเร็กทอรีของคุณไปยังตำแหน่งที่สคริปต์อยู่โดยใช้คำสั่งcd

จากนั้นพิมพ์

bash program-name.sh

6
ไม่จำเป็นต้องไปcdที่ใดก็ได้ คุณสามารถ speciy ชื่อเส้นทางที่ซับซ้อนโดยพลการเป็นอาร์กิวเมนต์ไปbash; แน่นอนโปรแกรมใด ๆ ที่ใช้อาร์กิวเมนต์ชื่อไฟล์จะทำงานในลักษณะนี้ (หรือแย่มากจนทำให้มึนงง)
tripleee

10

นี่เป็นกระทู้เก่า แต่ฉันบังเอิญเจอและรู้สึกแปลกใจที่ยังไม่มีใครตอบคำถามได้ครบถ้วน ต่อไปนี้ ...

การดำเนินการสอนสคริปต์บรรทัดคำสั่ง!

ถาม:ฉันจะดำเนินการสิ่งนี้ใน Terminal ได้อย่างไร

ความสับสนและความขัดแย้ง:

  • คุณไม่จำเป็นต้องมี "ส่วนขยาย" (เช่น. sh หรือ. py หรือสิ่งอื่นใด) แต่ช่วยในการติดตามสิ่งต่างๆ มันจะไม่เจ็บ อย่างไรก็ตามหากชื่อสคริปต์มีส่วนขยายคุณต้องใช้ชื่อนี้
  • คุณไม่จำเป็นต้องอยู่ในไดเรกทอรีใด ๆ เลยไม่ว่าด้วยเหตุผลใดก็ตาม
  • คุณไม่จำเป็นต้องพิมพ์ชื่อโปรแกรมที่รันไฟล์ (BASH หรือ Python หรืออะไรก็ตาม) เว้นแต่คุณต้องการ มันจะไม่เจ็บ
  • คุณไม่จำเป็นต้องsudoดำเนินการใด ๆ คำสั่งนี้สงวนไว้สำหรับการรันคำสั่งในฐานะผู้ใช้อื่นหรือผู้ใช้ 'root' (ผู้ดูแลระบบ) โพสต์ที่ดีที่นี่

(ผู้ที่เพิ่งเรียนรู้วิธีเรียกใช้สคริปต์ไม่ควรใช้คำสั่งนี้เว้นแต่จะมีความจำเป็นจริงๆเช่นการติดตั้งโปรแกรมใหม่สถานที่ที่ดีในการวางสคริปต์ของคุณอยู่ในโฟลเดอร์ ~ / bin ของคุณคุณสามารถไปที่นั่นได้โดย พิมพ์cd ~/binหรือcd $HOME/binจากพรอมต์เทอร์มินัลคุณจะมีสิทธิ์ทั้งหมดในโฟลเดอร์นั้น)

ในการ "เรียกใช้สคริปต์นี้" จากเทอร์มินัลบนระบบประเภท Unix / Linux คุณต้องทำสามสิ่ง:

  1. บอกตำแหน่งของสคริปต์ให้ระบบทราบ (เลือกหนึ่ง)

    • พิมพ์เส้นทางแบบเต็มพร้อมชื่อสคริปต์ (เช่น/path/to/script.sh) คุณสามารถตรวจสอบเส้นทางแบบเต็มได้โดยพิมพ์pwdหรือecho $PWDในเทอร์มินัล
    • ดำเนินการจากไดเร็กทอรีเดียวกันและใช้./สำหรับพา ธ (เช่น./script.sh) ง่าย.
    • วางสคริปต์ในไดเร็กทอรีที่อยู่บนระบบPATHและพิมพ์ชื่อ (เช่นscript.sh) คุณสามารถตรวจสอบระบบได้PATHโดยพิมพ์echo $PATHหรือecho -e ${PATH//:/\\n}หากคุณต้องการรายชื่อที่ใกล้เคียง
  2. บอกระบบว่าสคริปต์มีสิทธิ์ดำเนินการ (เลือกหนึ่ง)

    • ตั้งค่า "execute bit" โดยพิมพ์chmod +x /path/to/script.shในเทอร์มินัล
    • คุณยังสามารถใช้chmod 755 /path/to/script.shหากคุณต้องการตัวเลข มีการอภิปรายที่ดีกับแผนภูมิเย็นที่นี่
  3. บอกประเภทของสคริปต์ให้ระบบทราบ (เลือกหนึ่ง)

    • พิมพ์ชื่อของโปรแกรมก่อนสคริปต์ (เช่นBASH /path/to/script.shหรือPHP /path/to/script.php) หากสคริปต์มีส่วนขยายเช่น. php หรือ. py เป็นส่วนหนึ่งของชื่อสคริปต์และคุณต้องรวมไว้ด้วย
    • ใช้Shebangซึ่งฉันเห็นว่าคุณมี ( #!/bin/bash) ในตัวอย่างของคุณ หากคุณมีสิ่งนั้นเป็นบรรทัดแรกของสคริปต์ของคุณระบบจะใช้โปรแกรมนั้นเพื่อเรียกใช้สคริปต์ ไม่ต้องพิมพ์โปรแกรมหรือใช้นามสกุล
    • ใช้ "แบบพกพา" shebang คุณยังสามารถให้ระบบเลือกเวอร์ชันของโปรแกรมที่อยู่ในลำดับแรกPATHโดยใช้#!/usr/bin/envตามด้วยชื่อโปรแกรม (เช่น#!/usr/bin/env bashหรือ#!/usr/bin/env python3) มีข้อดีและข้อเสียตามที่กล่าวไว้อย่างละเอียดอยู่ที่นี่

1
สรุปได้ดีทีเดียว บางทีในตัวอย่างสุดท้ายจะเตือนผู้คนว่าscript.shและscript.phpเป็นชื่อไฟล์ตามตัวอักษรของสคริปต์เหล่านี้และหากคุณใส่นามสกุลในชื่อไฟล์คุณจะต้องรวมไว้เมื่อคุณเรียกใช้สคริปต์ (และในทางกลับกันถ้าสคริปต์ไม่ ' ไม่มีนามสกุลอย่าใส่อย่างใดอย่างหนึ่ง) ซึ่งแตกต่างจากเช่น DOS ที่คุณสามารถละเว้น.batหรือ.exeจากชื่อไฟล์และไฟล์ที่จำเป็นต้องมีส่วนขยายจากชุดเล็ก ๆ จึงจะถือว่าสามารถเรียกใช้งานได้
tripleee

1
อื่นทำผิดพลาดที่พบบ่อยเริ่มต้นเป็นความเข้าใจผิดความแตกต่างระหว่างpath, /path, และ./path ~/pathฉันเดาว่าคุณอาจไม่ต้องการอธิบายที่นี่ แต่อาจจะเชื่อมโยงไปยังคำอธิบายเช่น ... โอ้ห้อยฉันต้องโพสต์สิ่งนี้
tripleee

1

และอีกวิธีหนึ่ง

. /path/to/script

ความหมายของจุดคืออะไร?


สิ่งนี้เรียกใช้สคริปต์ในเชลล์ปัจจุบันซึ่งจำเป็นต้องเรียกใช้ นี่ไม่ใช่สิ่งที่คนส่วนใหญ่คาดหวังว่าจะเกิดขึ้นเมื่อคุณเรียกใช้สคริปต์ สิ่งนี้อาจมีผลข้างเคียงต่อสภาพแวดล้อมที่คุณมีอยู่
Software Engineer

-2

หากคุณอยู่ในไดเร็กทอรีหรือโฟลเดอร์ที่มีไฟล์สคริปต์ให้เปลี่ยนการอนุญาตไฟล์ในโหมดปฏิบัติการโดยทำ

chmod +x your_filename.sh

หลังจากนั้นคุณจะรันสคริปต์โดยใช้คำสั่งต่อไปนี้

$ sudo ./your_filename.sh

เหนือ "." แทนไดเร็กทอรีปัจจุบัน บันทึก! หากคุณไม่ได้อยู่ในไดเร็กทอรีที่มีไฟล์ bash script อยู่ให้คุณเปลี่ยนไดเร็กทอรีที่ไฟล์นั้นอยู่โดยใช้

cd Directory_name/write the complete path

คำสั่ง มิฉะนั้นสคริปต์ของคุณจะไม่สามารถทำงานได้


หวังว่าทุกคนจะทำได้อย่างเต็มที่เพราะฉันพูดถึงแนวคิดที่เกี่ยวข้องทั้งหมดเกี่ยวกับปัญหานี้โดยเฉพาะ
Hassan Shamshir

ตามที่อธิบายไว้ในคำตอบอื่น ๆ ที่นี่sudoเป็นที่ไม่ถูกต้องและอาจน่ากลัวผิดถ้าคุณใช้มันในสคริปต์ที่ไม่น่าเชื่อถือซึ่งละเมิดอำนาจที่คุณไม่จำเป็นต้องให้มัน
tripleee

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