เปิดแอปบน OS X ด้วยบรรทัดคำสั่ง


110

ฉันต้องการเปิดแอปบน OSX จากสคริปต์ ฉันต้องการส่งอาร์กิวเมนต์บรรทัดคำสั่ง ขออภัยopenไม่ยอมรับ args บรรทัดคำสั่ง

ตัวเลือกเดียวที่ฉันคิดได้คือใช้nohup myApp > /dev/null &เพื่อเปิดแอปของฉันเพื่อให้สามารถอยู่ได้โดยไม่ขึ้นกับสคริปต์ที่เปิดใช้งาน

ข้อเสนอแนะที่ดีกว่านี้?


ฉันไม่สามารถทำตามคำถามได้ "open" ไม่ยอมรับ args บรรทัดคำสั่ง? "เปิด" คืออะไร? AppleScript เปิดอยู่หรือไม่ วิธีnohup &แก้ปัญหา?
ล็อต

4
man open (1) - คำสั่ง OS X เพื่อเปิดไฟล์หรือแอพ
Ned Deily

3
สิ่งนี้ควรจะเป็นใน superuser.com
Jeff Meatball Yang

คำตอบ:


79

ใน OS X 10.6 openคำสั่งได้รับการปรับปรุงเพื่ออนุญาตให้ส่งอาร์กิวเมนต์ไปยังแอปพลิเคชัน:

open ./AppName.app --args -AppCommandLineArg

แต่สำหรับ Mac OS X เวอร์ชันเก่าและเนื่องจาก App Bundle ไม่ได้ออกแบบมาให้ส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งกลไกทั่วไปคือใช้Apple Eventsสำหรับไฟล์เช่นที่นี่สำหรับแอป Cocoa หรือที่นี่สำหรับแอป Carbon คุณอาจทำบางอย่างโดยการส่งผ่านพารามิเตอร์ในการใช้ตัวแปรสภาพแวดล้อม


วิธีการ kludgey ของฉันคือการเรียกใช้ไฟล์ปฏิบัติการโดยตรงกับ args บรรทัดคำสั่งโดยใช้ nohup - ถ้า environment-vars-kludge less kludgey?
psychotik

2
อาจจะไม่. ถ้ามันเหมาะกับคุณไปกับมัน ประเด็นที่ใหญ่กว่าคือ open (1) คือ cli ที่เทียบเท่ากับสิ่งที่เกิดขึ้นเมื่อผู้ใช้ทำการดับเบิลคลิกหรือ "เปิด" ใน Finder และไม่มีกลไกใดที่รองรับอาร์กิวเมนต์บรรทัดคำสั่งทั่วไป
เน็ดดีลี่

+1: คุณไม่ควรใช้อาร์กิวเมนต์บรรทัดคำสั่งสำหรับแอปพลิเคชัน Mac OS X GUI
S.Lott

2
บอก Google ว่าอย่าใช้ args บรรทัดคำสั่ง Applications / Google Chrome.app/Contents/Versions/6.0.472.53/Google Chrome Helper.app/Contents/MacOS/Google Chrome Helper --type = renderer --lang = en-US - -force-fieldtest
Anurag Uniyal

@Anurag Uniyal. "ทำไม?" คุณอ่านคำตอบแล้วหรือยัง? "กลไกทั่วไปคือใช้ Apple Events สำหรับไฟล์เช่นที่นี่สำหรับแอป Cocoa หรือที่นี่สำหรับแอป Carbon" นั่นคือวิธีการออกแบบ Mac OS X ใช่. Chrome แหกกฎ ยูทิลิตี้บรรทัดคำสั่ง Linux ทุกรายการก็เช่นกัน แต่แอปพลิเคชัน GUI ที่เปิดด้วยopen- ตามที่คำตอบระบุ - ไม่ได้ออกแบบมาให้ทำงานจากบรรทัดคำสั่ง "ทำไม?" เพราะนั่นคือวิธีที่ Mac OS X เป็น
ล็อต

105

ในฐานะที่ได้รับการกล่าวถึงในคำถามที่นี่ที่openคำสั่งใน 10.6 ตอนนี้มีargsธงเพื่อให้คุณสามารถโทรติดต่อ:

open -n ./AppName.app --args -AppCommandLineArg


ทำงานตรงตามที่ต้องการ ขอบคุณ
DTdev

สิ่งนี้ได้ผลและอนุญาตให้ฉันตั้งชื่อแทน zsh สำหรับ Chromium ขอบคุณ
jamescampbell

คำตอบนี้ดีมาก แค่ต้องการเพิ่มว่าเมื่อคุณเปิด Terminal ครั้งแรกคุณจะอยู่ในโฮมไดเร็กทอรีของคุณดังนั้นพิมพ์แบบนี้เพื่อที่คุณจะได้ไม่ต้องเปลี่ยนไปใช้ไดเรกทอรีแอปพลิเคชัน ฉันต้องการเรียกใช้ Gimp โดยไม่ต้องโหลดแบบอักษรซึ่งใช้เวลาตลอดไปดังนั้นฉันจึงพิมพ์สิ่งนี้โดยใช้สวิตช์ -f เพื่อละเว้นแบบอักษร: open -n /Applications/GIMP.app --args -f
James Toomey

32

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

$ cd /Applications/LittleSnapper.app/
$ ls
Contents
$ cd Contents/MacOS/
$ ./LittleSnapper

นั่นคือไบนารีจริงที่อาจยอมรับข้อโต้แย้ง (หรือไม่ในLittleSnapperกรณีของ)


3
ไบนารียอมรับข้อโต้แย้งฉันแน่ใจ ฉันเขียนมัน การเรียก "เปิด" ไม่อนุญาตให้ส่งผ่านอาร์กิวเมนต์ ฉันค่อนข้างแน่ใจเกี่ยวกับเรื่องนี้ ใช่สคริปต์ของฉันเรียก 'open binary' โดยตรงไม่ได้พยายามเปิดบันเดิล
กายสิทธิ์

@psychotik: เขาไม่ได้บอกว่าจะเรียก "open binary" เขากำลังบอกให้รันไบนารีโดยตรง
ชัค

นั่นใช้ไม่ได้กับฉัน การเรียกใช้ผลลัพธ์ไบนารีโดยตรงเนื่องจากเป็นกระบวนการย่อยของสคริปต์ของฉันซึ่งฉันไม่ต้องการอย่างแน่นอน ดังนั้นจำเป็นต้องใช้ open / nohup
psychotik

1
หากเป็นเชลล์สคริปต์ให้ใช้ 'exec' เพื่อแทนที่กระบวนการสคริปต์ด้วยปฏิบัติการจริง
Jonathan Leffler

2
วิธีการนี้มีอุปสรรคสำคัญ: ถ้ามัดมีห้องสมุดที่กำหนดเองและกรอบคุณจะต้องคุ้นเคยกับ,DYLD_LIBRARY_PATH DYLD_FRAMEWORK_PATH
ulidtko

14

ในกรณีที่แอปของคุณต้องทำงานกับไฟล์ (สิ่งที่คุณคาดว่าจะส่งผ่านโดยปกติ:) ./myApp *.jpgคุณจะทำดังนี้:

open *.jpg -a myApp

อันนี้คือสิ่งที่ฉันกำลังมองหา! ตัวอย่างเช่น: open something.py -a Eclipse.app
Eric

4

ฉันอยากจะแนะนำเทคนิคที่ MathieuK นำเสนอ ในกรณีของฉันฉันต้องลองกับ Chromium:

> Chromium.app/Contents/MacOS/Chromium --enable-remote-fonts

ฉันรู้ว่านี่ไม่ได้ช่วยแก้ปัญหาของ OP แต่หวังว่าจะช่วยประหยัดเวลาของคนอื่นได้ :)


@Pacerier เพิ่ม `&` ต่อท้ายคำสั่งนี้ มันจะเปิดในพื้นหลัง จากนั้นคุณสามารถปิดหน้าต่างเทอร์มินัลและแอปพลิเคชันจะยังคงเปิดอยู่
Paul Irish

2

openนอกจากนี้ยังมีแฟล็ก -a ซึ่งคุณสามารถใช้เพื่อเปิดแอปจากภายในโฟลเดอร์ Applications โดยใช้ชื่อ (หรือตามตัวระบุบันเดิลที่มีแฟล็ก -b) คุณสามารถรวมสิ่งนี้เข้ากับตัวเลือก --args เพื่อให้ได้ผลลัพธ์ที่คุณต้องการ:

open -a APP_NAME --args ARGS

หากต้องการเปิดวิดีโอในโปรแกรมเล่น VLC ที่ควรปรับขนาดด้วยปัจจัย 2x และวนซ้ำคุณจะต้องดำเนินการดังนี้

open -a VLC --args -L --fullscreen

โปรดทราบว่าฉันไม่สามารถรับเอาต์พุตของคำสั่งไปยังเทอร์มินัลได้ (แม้ว่าฉันจะไม่ได้พยายามแก้ไขอะไรเลย)


ทำซ้ำopen -aโดยเจตนา ?? ไม่ว่าในกรณีใดก็ตาม open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userllไม่ได้ผลสำหรับฉัน
Pacerier

ขออภัยไวยากรณ์ของฉันถูกปิดโดยสิ้นเชิงด้วยเหตุผลบางประการ ฉันจะอัปเดตทันที
rien333

2

ฉันต้องการให้ Chrome ทำงานสองอินสแตนซ์แยกกันโดยแต่ละอินสแตนซ์ใช้โปรไฟล์ของตัวเอง ฉันต้องการที่จะเริ่มต้นจาก Spotlightเช่นเดียวกับนิสัยของฉันในการเริ่มแอป Mac กล่าวอีกนัยหนึ่งฉันต้องการแอปพลิเคชัน Mac regChromeสองตัวสำหรับการท่องเว็บตามปกติและaltChromeเพื่อใช้โปรไฟล์พิเศษเพื่อเริ่มต้นได้อย่างง่ายดายโดยการกดปุ่ม⌘-space เพื่อเปิด Spotlight จากนั้นเลือก "reg" หรือ "alt" จากนั้นกด Enter

ฉันคิดว่าวิธีที่ดุร้ายในการบรรลุเป้าหมายข้างต้นคือการสร้างชุดแอปพลิเคชัน Google Chrome สองชุดภายใต้ชื่อที่เกี่ยวข้อง แต่ที่น่าเกลียดและซับซ้อนในการอัปเดต

สิ่งที่ฉันลงเอยด้วยแอปพลิเคชันAppleScriptสองรายการที่มีคำสั่งสองคำสั่ง นี่คือหนึ่งสำหรับaltChrome :

do shell script "cd /Applications/Google\\ Chrome.app/Contents/Resources/; rm app.icns; ln /Users/garbuck/local/chromeLaunchers/Chrome-swirl.icns app.icns"
do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir=/Users/garbuck/altChrome >/dev/null 2>&1 &"

บรรทัดที่สองเริ่ม Chrome ด้วยโปรไฟล์อื่น (ไฟล์ --user-data-dirพารามิเตอร์)

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


2

เริ่มต้นด้วยOS X Yosemiteตอนนี้เราสามารถใช้AppleScriptและAutomatorเพื่อทำงานที่ซับซ้อนโดยอัตโนมัติได้แล้ว สามารถใช้ JavaScript สำหรับระบบอัตโนมัติเป็นภาษาสคริปต์ได้แล้ว

หน้านี้ให้ตัวอย่างสคริปต์ตัวอย่างที่ดีที่สามารถเขียนที่บรรทัดคำสั่งโดยใช้โหมดโต้ตอบbash และosascript จะเปิดแท็บ Safari และไปที่example.comมันเปิดซาฟารีแท็บและนำทางไปยัง

http://developer.telerik.com/featured/javascript-os-x-automation-example/
osascript -l JavaScript -i
Safari = Application("Safari");
window = Safari.windows[0];
window.name();
tab = Safari.Tab({url:"http://www.example.com"});
window.tabs.push(tab); 
window.currentTab = tab;

ตรวจสอบ Script Editor / Window / Library เพื่อดูรายการแอพที่มีการทำงานอัตโนมัติของแอพพลิเคชั่น ฉันกำลังมองหา Vysor โดยใช้ Chrome และฉันคิดว่าฉันต้องการวิธีอื่น
AnneTheAgile

ความซับซ้อนมากขึ้น ftw!
Pacerier

1

ด้วย applescript:

tell application "Firefox" to activate

คุณส่งข้อโต้แย้งไปยัง Firefox ได้อย่างไร? เช่น -no-remote -P "Another Profile". เมื่อพัฒนาส่วนเสริมและสิ่งนี้จะสะดวกที่จะมีกระบวนการ Firefox สองขั้นตอนแยกกันโดยใช้สองโปรไฟล์แยกกัน โปรไฟล์ปกติของคุณและแซนด์บ็อกซ์สำหรับแก้ไขข้อบกพร่องส่วนขยายของคุณ
George

ฉันเชื่อว่าคุณกำลังอ้างถึงคำสั่ง AppleScript แต่คำถามเกี่ยวกับการเปิดจากบรรทัดคำสั่ง ...
conny

0

ทำไมไม่ตั้งค่าเส้นทางเพิ่มไปยังถังขยะของแอป สำหรับ MacVim ฉันทำสิ่งต่อไปนี้

export PATH=/Applications/MacVim.app/Contents/bin:$PATH

นามแฝงเป็นอีกทางเลือกหนึ่งที่ฉันลองแล้ว

alias mvim='/Applications/MacVim.app/Contents/bin/mvim'
alias gvim=mvim 

ด้วยเส้นทางการส่งออกฉันสามารถเรียกคำสั่งทั้งหมดในแอปได้ ข้อโต้แย้งผ่านไปได้ด้วยดีสำหรับการทดสอบของฉันกับ MacVim ในขณะที่นามแฝงฉันต้องใช้นามแฝงแต่ละคำสั่งใน bin

mvim README.txt
gvim Anotherfile.txt

เพลิดเพลินไปกับพลังของนามแฝงและเส้นทาง อย่างไรก็ตามคุณต้องเฝ้าติดตามการเปลี่ยนแปลงเมื่ออัพเกรดระบบปฏิบัติการ


"จำไว้ว่า MacOS ใช้ linux" ไม่ไม่เป็นเช่นนั้น macOS และ Linux จะไม่แชร์โค้ดเพียงบรรทัดเดียว MacOS เป็น UNIX ที่มีเคอร์เนลที่ใช้ FreeBSD
Thomas

จะเปลี่ยน. ฉันไม่ต้องการสร้างสงครามศาสนา เป้าหมายคือเพื่อให้ชุมชนรู้ว่ามีตัวเลือกที่มีประสิทธิภาพบางอย่างที่ผู้ใช้ MacOS สามารถใช้ได้
zerocog

แน่นอนไม่มีปัญหา! :)
โธมัส

0

ง่ายๆที่นี่แทนที่ "APP" ด้วยชื่อแอปที่คุณต้องการเปิด

export APP_HOME=/Applications/APP.app/Contents/MacOS
export PATH=$PATH:$APP_HOME

ขอบคุณฉันในภายหลัง


0

คุณสามารถเปิดแอพโดยใช้open:

open -a APP_YOU_WANT

ควรเปิดแอปพลิเคชันที่คุณต้องการ

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