วิธีรันเชลล์สคริปต์ใน OS X ด้วยการดับเบิลคลิก


233

ฉันมีเชลล์สคริปต์ที่ได้รับอนุญาตให้ดำเนินการกับผู้ใช้ใน OS X แต่เมื่อฉันคลิกสองครั้งมันจะเปิดขึ้นในโปรแกรมแก้ไขข้อความ ฉันจะทำให้มันทำงานโดยดับเบิลคลิกได้อย่างไร

คำตอบ:


266
  • อันดับแรกในเทอร์มินัลทำให้สคริปต์สามารถดำเนินการได้โดยพิมพ์:

    chmod a+x (yourscriptname)
  • จากนั้นใน Finder ให้คลิกขวาที่ไฟล์ของคุณแล้วเลือก "Open with" จากนั้นเลือก "Other ... "

  • ที่นี่คุณเลือกแอปพลิเคชันที่คุณต้องการให้ไฟล์ดำเนินการในกรณีนี้จะเป็นเทอร์มินัล ในการเลือกเทอร์มินัลคุณต้องเปลี่ยนจาก "แอปพลิเคชันที่แนะนำ" เป็น "แอปพลิเคชันทั้งหมด" (แอปพลิเคชัน Terminal.app สามารถพบได้ในโฟลเดอร์ Utilities)

  • โปรดทราบว่าหากคุณไม่ต้องการเชื่อมโยงไฟล์ทั้งหมดกับส่วนขยายนี้เพื่อให้ทำงานในเทอร์มินัลคุณไม่ควรเลือก "เปิดเสมอกับ"

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

ขอบคุณฉันเข้าใจฉันไม่รู้จะเชื่อมโยงกับเทอร์มินัลฉันคิดว่าจำเป็นต้องเชื่อมโยงกับ / bin / sh
c2h2

22
ฉันหาTerminal.appไม่พบในรายการจนกว่าฉันจะรู้ตัวว่าต้องดูในโฟลเดอร์ "Utilities" หวังว่านี่จะช่วยใครซักคนในบางเวลา
เกล็นลอเรนซ์

27
บน OSX 10.8 ขึ้นไปสคริปต์เรียกทำงานที่มีชื่อไม่มีส่วนต่อท้ายหรือส่วนต่อท้าย.commandคือค่าเริ่มต้นที่สามารถเรียกใช้งานได้จาก Finder โดยไม่จำเป็นต้องสั่งให้ Finder ใช้วิธีเปิด
mklement0

1
"แอปพลิเคชันทั้งหมด" เป็นการตั้งค่าที่ฉันพลาด ... อาจเป็นสิ่งที่ Cheruvim ได้สัมผัสเช่นกัน สำหรับความคิดเห็นของ Glenn คุณสามารถใช้คุณลักษณะการค้นหาในตัวที่มุมบนขวาของหน้าต่าง ตรวจสอบให้แน่ใจว่าคุณพิมพ์ชื่อเต็มของแอพเช่น Terminal.app
ผู้สูงอายุ

3
ไม่ใช่วิธีที่สะอาดที่จะทำ เปลี่ยนชื่อสคริปต์เป็น.commandนามสกุลไฟล์
Bachsau

227

คุณลองใช้.commandส่วนขยายชื่อไฟล์แล้วหรือยัง


3
มันดีกว่า ใน @Lus ตอบโฟลเดอร์ทำงานไม่เหมือนกันกับที่คุณเปิดสคริปต์
Rodrigo

6
มีวิธีการเปิดใช้งาน "พื้นหลัง" โดยไม่มีหน้าต่างคอนโซลหรือไม่?
lapo

6
โปรดทราบว่าไดเรกทอรีปัจจุบันอาจไม่ใช่สคริปท์ของคุณลองดูคำถามนี้เพื่อตั้งค่าให้ถูกต้อง: stackoverflow.com/questions/59895/…
Pavel Alexeev

14
คุณยังต้องมีสิทธิ์ดำเนินการ ( chmod +x) แต่.commandส่วนขยายเชื่อมโยงกับ Terminal แล้ว ทางแก้ปัญหาที่ยอดเยี่ยมขอบคุณ
NorTicUs

เห็นได้ชัดว่าผู้ใช้ไม่สามารถโต้ตอบกับโปรแกรมเทอร์มินัลด้วยวิธีนี้ - เว้นแต่ฉันจะเข้าใจผิด?
Demis

153

ตั้งแต่ OSX 10.10 (โยเซมิตี) และตั้งแต่OS X 10.8 (Mountain Lion) อย่างน้อยพฤติกรรมจะเป็นดังนี้เมื่อคุณเปิดสคริปต์ปฏิบัติการ (ดับเบิลคลิก) จาก Finder :

  • ปฏิบัติการสคริปต์[1] มีทั้งคำต่อท้าย NOหรือต่อท้าย.command :
    • ถูกดำเนินการตามค่าเริ่มต้น - ไม่จำเป็นต้องติดตั้ง :
      • ใหม่หน้าต่าง terminal เปิดซึ่งในสคริปต์วิ่ง
      • โดยค่าเริ่มต้นหน้าต่างจะยังคงเปิดอยู่หลังจากสคริปต์สิ้นสุดเพื่อให้คุณสามารถตรวจสอบผลลัพธ์ (ถึง ณ จุดนั้นเชลล์ที่รันสคริปต์ได้ออกแล้วและคุณไม่สามารถโต้ตอบกับมันได้อีกต่อไป )
        อย่างไรก็ตามผ่านเทอร์มินัลPreferences... > Profilesคุณสามารถเลือกที่จะปิดหน้าต่างโดยอัตโนมัติเมื่อสคริปต์ออก
    • Caveat : โฟลเดอร์ที่ใช้งานจะเป็นโฟลเดอร์หลักของผู้ใช้ปัจจุบันเสมอไม่ใช่โฟลเดอร์ที่สคริปต์ตั้งอยู่
      • ในการเปลี่ยนเชลล์สคริปต์ให้เป็นโฟลเดอร์ที่อยู่ให้วาง
        • cd -- "$(dirname "$BASH_SOURCE")" หลังจากแถว shebang
        • หรือถ้าคุณยังคงต้อง POSIX cd -- "$(dirname "$0")"สอดคล้อง
        • สำหรับกรณีขอบเช่นการค้นหาไดเรกทอรีแหล่งที่แท้จริงของสคริปต์symlinkedดูคำตอบของฉันนี้
    • หากสคริปต์นั้นไม่สามารถเรียกใช้งานได้โดยไม่คาดหมาย :
      • ทำให้สามารถเรียกทำงานได้ด้วยการรันchmod +x <script>ใน Terminal มิฉะนั้นคุณจะเห็นอาการต่อไปนี้:
      • .command: Finder แสดงข้อความแสดงข้อผิดพลาดที่ทำให้เข้าใจผิดซึ่งแสดงให้เห็นว่าปัญหาสามารถแก้ไขได้ผ่านFile > Get Infoซึ่งไม่เป็นความจริง - ใช้chmod +xวิธีการที่แนะนำข้างต้น
      • ไม่มีคำต่อท้าย:
        • ด้วยเส้น Shebang (เช่น, #!/bin/bash): พฤติกรรมเป็นเหมือนคำต่อท้าย.sh- ดูด้านล่าง
        • กับไม่มีเส้น shebang: เปิดในโปรแกรมแก้ไขข้อความเริ่มต้นของคุณ (ซึ่งเป็น TextEdit ค่าเริ่มต้น)
  • สคริปต์ที่มีคำต่อท้าย.shไม่ว่าจะปฏิบัติการหรือไม่:
    • จะเปิดกว้างสำหรับการแก้ไขในหรือหากมีการติดตั้งด้วยTextEdit.appXcode.app
  • สคริปต์ที่มีคำต่อท้าย.scptหรือ.applescript(แม้ว่าพวกเขาจะถูกทำเครื่องหมายว่าสามารถเรียกใช้งานได้ซึ่งไม่ใช่กรณี):
    • เปิดสำหรับการแก้ไขใน[Apple]Script Editor
    • โปรดทราบว่าไฟล์ซอร์สโค้ดJXA นั้นดูเหมือนจะไม่มีคำต่อท้ายที่แตกต่างกัน (ยัง)
  • สคริปกับกำหนดเองต่อท้าย (ต่อท้ายยังไม่เป็นที่รู้จักกับระบบ) ไม่ว่าปฏิบัติการหรือไม่ (ในความเป็นจริงนำไปใช้กับชนิดของไฟล์ใด ๆ ):
    • แจ้งให้คุณแอปเปิดด้วยเมื่อคุณเปิดครั้งแรกและจดจำตัวเลือกนั้น

[1] หมายถึงปฏิบัติการ : สคริปต์ที่มีชุดบิตสิทธิ์อนุญาตใช้งานและผู้ใช้ที่โทร - ซึ่งสัมพันธ์กับความเป็นเจ้าของไฟล์ - ดังนั้นอาจได้รับอนุญาตให้เรียกใช้งาน
หากคุณใช้chmod a+xเพื่อตั้งค่าบิตการอนุญาตทั้งหมด (ซึ่งเป็นเรื่องปกติ) ทุกคนสามารถเรียกใช้ได้ (สมมติว่าพวกเขายังได้รับอนุญาตให้อ่านไฟล์ตามบิตสิทธิ์การอ่านและความเป็นเจ้าของไฟล์)


1
มีความเป็นไปได้ที่จะปิดหน้าต่างเทอร์มินัลที่เปิดอยู่เมื่อสคริปต์ออกจากแบบง่าย ๆ ที่osascriptคุณสามารถรวมไว้ใน.commandไฟล์แทนการทำโปรไฟล์ด้วยตนเอง
l'L'l

@ I'L'I: คุณหมายถึงการเพิ่มosascript -e '...'คำสั่งในส่วนท้ายของสคริปต์หรือไม่? คำสั่งเฉพาะคืออะไรและให้แน่ใจว่าแท็บด้านขวาถูกปิดแม้ว่าสคริปต์จะไม่ทำงานในแท็บหน้าสุด
mklement0

5
@ mklement0: ใช่ฉันยังไม่ได้ทดสอบนานกว่าสองสามนาที แต่แนวคิดพื้นฐานคือการรวมไว้ในบรรทัดสุดท้ายของสคริปต์คำสั่ง. : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... มันอาจไม่ทำงานในทุกสถานการณ์แม้ว่าการเปลี่ยนเส้นทางที่ end เป็นกุญแจสำคัญจริงๆ - osascript สามารถปรับเปลี่ยนได้อย่างง่ายดาย (เช่นหน้าต่างอาจต้องเปลี่ยนเป็นแท็บหากนั่นเป็นพฤติกรรมเริ่มต้นของเทอร์มินัลเป็นต้น)
l'L'l

เป็นไปได้ไหมที่จะไม่ปล่อยให้หน้าต่าง / แท็บ Terminal ปิดหลังจาก.commandรันสคริปต์ไฟล์แม้จะมีการตั้งค่าโปรไฟล์หรือไม่
CyberMew

@CyberMew: หากคุณสามารถแก้ไขสคริปต์ให้เพิ่มคำสั่งที่รอการกดแป้นพิมพ์ที่ส่วนท้าย; เช่นถ้าเป็นbashสคริปต์ให้เพิ่มread -p 'Press Return to close this window.'เป็นคำสั่งสุดท้าย
mklement0

38

หรือคุณสามารถสร้างแอปพลิเคชัน Mac OS X ปกติจากสคริปต์ของคุณโดยใช้Platypus


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

1
มันไม่ใช่เทอร์มินัลโต้ตอบ ตุ่นปากเป็ดเพียงนำเสนอสคริปต์ออก ไม่มีการสื่อสารสองทิศทาง
svth

4
หรือสร้างแอปพลิเคชัน OS X ด้วย Automator โดยใช้แอคชัน Run Shell Script
Rangi Keen

15

วิธีที่ง่ายคือเปลี่ยนส่วนขยายเป็น.commandหรือไม่มีส่วนขยาย

แต่นั่นจะเปิด Terminal และคุณจะต้องปิดมัน หากคุณไม่ต้องการเห็นผลลัพธ์ใด ๆ คุณสามารถใช้ Automator เพื่อสร้างแอปพลิเคชัน Mac ที่คุณสามารถดับเบิลคลิกเพิ่มไปยังแท่นวาง ฯลฯ

  1. เปิดAutomatorแอปพลิเคชัน
  2. เลือกประเภท "แอปพลิเคชัน"
  3. พิมพ์ "เรียกใช้" ในช่องค้นหาคำสั่ง
  4. ดับเบิลคลิกที่ "Run Shell Script"
  5. คลิกRunปุ่มที่มุมบนขวาเพื่อทดสอบ
  6. File > Save เพื่อสร้างแอปพลิเคชัน

ป้อนคำอธิบายรูปภาพที่นี่


เยี่ยมมาก! เราจะทำให้เวิร์กโฟลว์นี้ทำงานโดยอัตโนมัติทุกวันเวลา 13.00 น. ได้อย่างไร
iAkshay

9

ไม่จำเป็นต้องใช้แอพของบุคคลที่สามเช่นตุ่นปากเป็ด

เพียงสร้าง Apple Script ด้วย Script Editor และใช้คำสั่งdo shell script "shell commands"สำหรับการเรียกคำสั่งโดยตรงหรือไฟล์เชลล์สคริปต์ที่ปฏิบัติการได้เก็บไฟล์สคริปต์ที่สามารถแก้ไขได้อย่างปลอดภัยจากที่ไหนสักแห่งแล้วส่งออกเพื่อสร้างแอปพลิเคชันสคริปต์ สคริปต์ของแอปสามารถเรียกใช้งานได้โดยดับเบิลคลิกหรือเลือกในโฟลเดอร์แถบ


3
ยิ่งไปกว่านั้นใช้ Automator และใช้แอคชั่น Run Shell Script โดยตรงแทนที่จะไปที่ Apple Script
Rangi Keen

0

คุณยังสามารถตั้งค่าเริ่มต้นตามนามสกุลไฟล์โดยใช้ RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

อาจเป็นไปได้ว่าคุณสามารถตั้งค่า. sh ให้เปิดใน iTerm / Terminal เป็นต้นซึ่งจะต้องมีการอนุญาตจากผู้ใช้เช่น

chmod u+x filename.sh

บานหน้าต่าง pref RPCefaultApp


0

chmod 774 filename

หมายเหตุ : ไฟล์ที่มีชื่อ 'ชื่อไฟล์' ที่มีสคริปต์ทุบตีไม่มีส่วนขยาย

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