รันเชลล์สคริปต์บน 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.