รันเชลล์สคริปต์บน OS X โดยไม่ต้องมีหน้าต่างเทอร์มินัลปรากฏขึ้นมาใช่หรือไม่


23

ฉันกำลังพยายามตั้งค่าแป้นพิมพ์ลัดที่เปิดเซสชัน iTerm เฉพาะซึ่งฉันสามารถทำได้ด้วย BetterTouchTool และเวทมนต์ AppleScript ปัญหาคือ OS X ยืนยันที่จะเปิดหน้าต่างเทอร์มินัลสำหรับเชลล์สคริปต์ใด ๆ ที่คุณดำเนินการผ่าน GUI (เช่นจาก Finder หรือเป็นแป้นพิมพ์ลัดจาก BetterTouchTool) หน้าต่างเทอร์มินัลไม่ปรากฏขึ้นหากฉันเรียกใช้สคริปต์โดยตรงจากเทอร์มินัลอื่น

วิธีแก้ปัญหาที่ฉันพบคือการตัดสคริปต์ในไดเรกทอรี. app ซึ่งแก้ปัญหาของหน้าต่างเทอร์มินัลที่ฟุ่มเฟือย แต่มีปัญหาอื่น ๆ (ตัวอย่างเช่น OS X ดูเหมือนจะปฏิบัติต่อหน้าต่าง iTerm ที่เกิดขึ้นแต่ละรายการเป็นแอพแยกต่างหาก ) (แก้ไข: พฤติกรรมนี้เกิดจากข้อบกพร่องในสคริปต์ของฉันจริงดูด้านล่าง)

ฉันได้ลองกำหนดแอพ Terminal ให้เดสก์ท็อปเสมือนอื่นในการตั้งค่า Spaces เพื่อพยายามย้ายออกจากสายตา แต่ก็จะสลับไปยังเดสก์ท็อปก่อนก่อนที่จะเรียกใช้สคริปต์

มีวิธีการปิดการใช้งานพฤติกรรมนี้อย่างสมบูรณ์หรือไม่? ฉันพบการตั้งค่าในการตั้งค่าเทอร์มินัลเพื่อปิดหน้าต่างหลังจากสคริปต์เสร็จสิ้นแล้ว แต่ก็ยังน่ารำคาญที่จะให้หน้าต่าง Terminal ปรากฏขึ้นอีกหนึ่งวินาที


ขออภัยฉันไม่เข้าใจ คุณต้องการทำอะไรกับเชลล์สคริปต์เหล่านั้น? คุณต้องการเปิด iTerm ผ่านเชลล์สคริปต์หรือไม่? คุณกำลังพูดถึง Terminal.app หรือผสม iTerm กับ "Terminal" ในคำถามของคุณหรือไม่? คุณอาจจะโพสต์ตัวอย่างของสิ่งที่คุณพยายามเรียกใช้
— slhck

ฉันได้ตั้งค่าเซสชัน iTerm หลายครั้งเพื่อเปิดเปลือกปกติเปิดคอนโซล Rails แสดงบันทึก Rails ฯลฯ ฉันใช้ iTerm โดยเฉพาะและ Terminal จะเปิดโดยอัตโนมัติโดย OS X ด้วยเหตุผลโง่ ๆ แต่อย่างไรก็ตามฉันพบวิธีแก้ปัญหาเพื่อให้วิธีการกลุ่มนี้ทำงานอย่างถูกต้อง (ดูคำถามที่แก้ไขแล้ว)
— toupeira

ฉันเห็น! มันคงจะดีมากถ้าคุณสามารถตอบคำถามของคุณเอง (ใช้ปุ่มด้านล่าง) แล้วบอกเราว่าคุณทำอะไรหรือคุณแก้ไขปัญหาอย่างไร อาจโพสต์ตัวอย่างในคำถามของคุณแล้วเพิ่มคำตอบสั้น ๆ ด้วยวิธีนี้ถ้ามีคนสะดุดโพสต์ของคุณพวกเขาอาจเรียนรู้จากมัน!
— slhck

ฉันยังไม่มีคำตอบสำหรับคำถามจริง (เช่นวิธีหลีกเลี่ยง Terminal โดยสมบูรณ์โดยไม่ต้องใช้. wrapper. app) ดังนั้นฉันควรเปิดทิ้งไว้ในกรณีที่ใครบางคนสามารถสอนฉันได้
— toupeira

1
ฉันยังสับสนอยู่ คุณไม่ต้องการเรียกใช้ผ่านแอป.. ที่สร้างขึ้นโดย Automator ใช่ไหม
— slhck

คำตอบ:


21

เปิดAutomatorเลือกแอปพลิเคชันเพิ่มแอคชั่นRun Shell Scriptและใส่คำสั่ง Shell ของคุณระหว่างเครื่องหมายคำพูด (ถ้าคุณมีไฟล์คุณสามารถลากและวางได้)

อื่น ๆ กว่าการเล่นมันตอนนี้คุณสามารถบันทึกมัน (เป็นได้ทุกแอป) และแม้กระทั่งการตั้งค่าไอคอน


ฉันพยายามเรียกใช้คำสั่งด้วยวิธีนี้จากแอปเต็มหน้าจอ แต่มันเปิดในพื้นหลังเสมอ ฉันต้องแบ็คกราวน์คำสั่งในเชลล์โดยไม่ปิดกั้นโดยต่อท้าย a &แล้วเรียก AppleScript เพื่อนำแอพ (ในกรณีของฉันmplayer) ไปไว้ด้านหน้า: mplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
— Lenar Hoyt

แฮ็คเด็ด @mcb แต่ฉันไม่เข้าใจว่าทำไม โดยปกติเราต้องการซ่อนหน้าต่างเทอร์มินัลเพราะจะเปิดอีกหน้าต่างหนึ่งซึ่งเป็นหน้าต่างหลัก หากคุณต้องการหน้าต่างเทอร์มินัลแรกของ mplayer ฉันคิดว่ามันไม่เปิดอีกหน้าต่างหนึ่งและทำไมคุณต้องการซ่อนมันไว้ตั้งแต่แรก
— cregox

ฉันใช้mplayerเพื่อเล่นวิดีโอจากภายในสไลด์โชว์ (เป็นสกิม) มีข้อผิดพลาดที่ผู้เล่นอยู่ในพื้นหลังหากตั้งค่าเป็นแบบเต็มหน้าจอฉันไม่แน่ใจว่าข้อบกพร่องนี้เกี่ยวข้องกับสกิมหรือแอปแบบเต็มหน้าจอทั้งหมดเท่านั้นดังนั้นฉันจึงคิดว่าฉันจะโพสต์โซลูชันของฉันที่นี่
— Lenar Hoyt

6

นี่เป็นตัวอย่างที่รวดเร็วและสกปรกซึ่งแทบจะไม่ต้องใช้ความพยายามเลย (สำหรับแอปที่ชื่อว่า "myapp"):

  1. สร้างลำดับชั้นของแอปพลิเคชันบางส่วน:

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. ตรวจสอบให้แน่ใจว่าบรรทัดแรกของสคริปต์ของคุณมีเส้นทางแบบเต็มไปยังโปรแกรมที่ต้องการเช่น

    #!/bin/bash
    
  3. ตั้งชื่อเชลล์สคริปต์ของคุณ "myapp" (ไม่มีเครื่องหมายอัญประกาศไม่มีส่วนขยาย) ให้สิทธิ์ดำเนินการจากนั้นวางไว้ในไดเรกทอรีย่อย MacOS หากต้องการให้สิทธิ์ดำเนินการ:

    chmod ugo+x myapp
    
  4. ไปที่ไดเรกทอรีย่อยเนื้อหาและสร้างไฟล์ PkgInfo ที่มีสตริง: APPL ???? [ไม่มีตัวยุติบรรทัดที่ท้ายสตริง!] ใช้ยูทิลิตี cat (1) เพื่อสร้างไฟล์:

    cat > PkgInfo
    APPL????
    

    หลังจากที่คุณพิมพ์สตริง (ห้ามกด return!) ให้ป้อน control-D สองตัวซึ่งจะปิด
    ไฟล์โดยไม่มีตัวยุติบรรทัดและส่งคุณกลับไปที่เชลล์พรอมต์)

  5. คลิกสองครั้งที่ "แอพ" ใหม่ของคุณจากตัวค้นหา มันจะทำงานโดยไม่มีหน้าต่าง


ใช้งานไม่ได้กับ 10.13.6 ข้อความแสดงข้อผิดพลาดแจ้งว่า "คุณไม่สามารถเปิดแอปพลิเคชัน“ LoginSessionTimeLimit.app” เพราะไม่รองรับ Mac ประเภทนี้"
— Douglas Held

1
ทำงานในโมฮาวี (10.14.3) สำหรับฉัน ฉันชอบวิธีนี้มาก ขอบคุณ
— loco.loop

ทำงานให้ฉันใน 10.13.6 @Douglas Held ลองใช้งานสคริปต์ของคุณ "ด้วยตนเอง" เช่นจาก Terminal บางทีมันอาจจะออกจาก w / ข้อผิดพลาดด้วยเหตุนี้มันไม่ทำงานสำหรับคุณ ...
— marekful

ที่ดี! ผ่านการทดสอบการทำงานในโมฮาวี 10.14.6
— Nicola Mingotti

4

คุณอาจต้องการตรวจสอบPlatypusซึ่งสร้างแอปพลิเคชัน Mac OS X จากเชลล์สคริปต์และสคริปต์ที่ตีความอื่น ๆ


3

นี่เป็นวิธีแก้ปัญหาเล็ก ๆ ในกรณีที่คุณอยากเรียกโปรแกรมเช่นอัลเฟรด ฉันใช้มันทุกวันและฉันซื้อPowerpackซึ่งให้คุณเรียกใช้สคริปต์เชลล์แบบไม่มีการโต้ตอบ

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

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

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

ฉันใช้มันสำหรับตัวอย่างเล็ก ๆ และมีความยืดหยุ่นมาก


นี้จะไม่อยู่ภายใต้อัลเฟรด 2. แต่สร้าง "เรียกใช้สคริปต์" ตามที่ปรากฏในภาพ
— Dave Newton

1

หากคุณเพิ่มคีย์LSUIElementและตั้งเป็น1ในInfo.plistแอพของคุณมันจะไม่สร้างไอคอนใน Dock

นี่คือInfo.plistแอปเชลล์สคริปต์ขนาดเล็กของฉัน:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleExecutable</key>
    <string>launch</string>
    <key>CFBundleIconFile</key>
    <string>launch</string>
    <key>LSUIElement</key>
    <string>1</string>
</dict>
</plist>

ขอบคุณ แต่นี่ดูเหมือนจะไม่มีผล ฉันยังลองtouchอิงบันเดิลเพื่อให้แน่ใจว่าใช้เวอร์ชันใหม่ล่าสุด แต่อย่างไรก็ตามฉันไม่ชอบวิธีการแบบกลุ่มเพราะดูเหมือนว่ามันจะสร้างอินสแตนซ์แอปแยกต่างหากเสมอ
— toupeira

สำหรับฉันสัมผัสไม่ได้ช่วยด้วย (ฉันพยายามที่จะปิด LSUIElement) มีแคชบางประเภท แต่การบีบอัดและแยกแอปพลิเคชันช่วย ทำไมคุณไม่ชอบวิธีการมัด นอกจากนี้คุณสามารถใช้ applescript และเรียกใช้เพียงแค่do shell script "say 'arsti'"นี้จะไม่เปิดหน้าต่างเทอร์มินัล
— tig

โอเคปรากฎว่าฉันเป็นเพียงคนงี่เง่า ;-) ฉันไม่สามารถหาวิธีที่เชื่อถือได้ในการตรวจสอบว่าแอปทำงานกับ AppleScript อยู่หรือไม่ดังนั้นฉันจึงใช้สคริปต์ทุบตีปกติที่โทรpgrepมาแล้วส่งรหัสที่เกี่ยวข้องโดยตรงไปที่osascript(ล่าม AppleScript) ปัญหาคือว่าpgrepมาจาก Homebrew $PATHและไม่ได้อยู่ในการเริ่มต้น ดังนั้นสคริปต์ของฉันจึงเปิดตัวอินสแตนซ์ iTerm ใหม่แม้ว่ามันจะทำงานอยู่ หลังจากเพิ่มเส้นทางแบบเต็มไปpgrepยังสคริปต์วิธีการมัดดูเหมือนจะทำงานได้ดีดังนั้นฉันคิดว่าฉันมีความสุขในตอนนี้ ;-)
— toupeira

การรวมคำตอบนี้เข้ากับคำตอบจาก @JeffB ด้านบนและกับ Info.plist ของ @ tig รุ่นที่เรียบง่าย (ฉันลบปุ่มCFBundleExecutableและCFBundleIconFileคีย์) ฉันได้รับการทำงานอย่างสมบูรณ์แบบ
— Dave Land

0

นี่เป็นวิธีแก้ปัญหาเล็กน้อย:

รวบรวม applescript ที่เรียก shell script :)

osacompile -e 'do shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

ความosacompileประสงค์จะรวบรวม'do shell script "XXX"'ตัวอย่างข้อมูล applescript เชลล์สคริปต์ของคุณคือ XXX

ระวังคำพูดเชลล์สคริปต์จะต้องมีการยกมาอย่างถูกต้องเพื่อให้ผ่านเชลล์ที่คุณใช้เพื่อรวบรวมมันยังคงเหมือนเดิม

แต่สิ่งนี้สามารถเรียกใช้จาก BetterTouchTool โดยไม่ต้อง whacky-ness


0

มีการออกกำลังกายอื่น ๆ ที่เป็นไปได้ เซฟเชลล์สคริปต์ของคุณในเวิร์กโฟลว์อัตโนมัติ เรียกใช้เวิร์กโฟลว์ด้วย launchd รหัสคือ:

/usr/bin/automator /path/to/the/file.workflow

สิ่งนี้จะไม่เปิดโปรแกรมใด ๆ หรือไม่แสดงในแถบเมนูและมันจะเงียบกว่าแอพ Platypus

วิธีที่ดีกว่าในการเรียกใช้งานเชลล์สคริปต์โดยตรงใน launchd

/bin/bash /path/to/shellScript.command

จะดำเนินการคำสั่งพิเศษเงียบ ๆ ในพื้นหลัง

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