Luncurkan aplikasi di OS X dengan baris perintah

109

Saya ingin meluncurkan aplikasi di OSX dari skrip. Saya perlu menyampaikan argumen baris perintah. Sayangnya, opentidak menerima argumen baris perintah.

Satu-satunya pilihan yang dapat saya pikirkan adalah menggunakan nohup myApp > /dev/null &untuk meluncurkan aplikasi saya sehingga bisa ada secara independen dari skrip yang meluncurkannya.

Ada saran yang lebih baik?

psychotik
sumber
Saya tidak bisa mengikuti pertanyaan itu. "open" tidak menerima argumen baris perintah? Apa itu "terbuka"? Apakah ini AppleScript terbuka? Bagaimana cara nohup &memecahkan masalah?
S. Lott
4
man open (1) - OS X perintah untuk meluncurkan file atau aplikasi
Ned Deily
3
Ini seharusnya ada di superuser.com
Jeff Meatball Yang

Jawaban:

78

Di OS X 10.6, openperintah telah ditingkatkan untuk memungkinkan penerusan argumen ke aplikasi:

open ./AppName.app --args -AppCommandLineArg

Tetapi untuk versi Mac OS X yang lebih lama, dan karena bundel aplikasi tidak dirancang untuk melewati argumen baris perintah, mekanisme konvensionalnya adalah menggunakan Acara Apple untuk file seperti di sini untuk aplikasi Cocoa atau di sini untuk aplikasi Karbon. Anda juga mungkin bisa melakukan sesuatu kludgey dengan melewatkan parameter dalam menggunakan variabel lingkungan.

Ned Deily
sumber
Pendekatan kludgey saya adalah menjalankan eksekusi langsung dengan baris perintah args menggunakan nohup - jika lingkungan-vars-kludge kurang kludgey?
psikotik
2
Mungkin tidak. Jika itu berhasil untuk Anda, lakukanlah. Poin yang lebih besar adalah bahwa open (1) setara dengan cli dari apa yang terjadi ketika pengguna melakukan klik dua kali atau "Buka" di Finder dan tidak ada mekanisme tersebut yang mendukung argumen baris perintah konvensional.
Ned Deily
+1: Anda tidak boleh menggunakan argumen baris perintah untuk aplikasi GUI Mac OS X.
S. Lott
2
beri tahu google untuk tidak menggunakan argumen baris perintah, 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 Uni. "Mengapa?" Apakah kamu sudah membaca jawabannya? "Mekanisme konvensionalnya adalah menggunakan Acara Apple untuk file seperti di sini untuk aplikasi Cocoa atau di sini untuk aplikasi Karbon." Begitulah desain Mac OS X. Iya. Chrome melanggar aturan. Begitu juga setiap utilitas baris perintah Linux. Tetapi aplikasi GUI yang dibuka dengan open- seperti yang dikatakan jawabannya - tidak dirancang untuk bekerja dari baris perintah. "Mengapa?" Karena begitulah cara Mac OS X.
S. Lott
105

Seperti yang disebutkan dalam pertanyaan di sini , openperintah di 10.6 sekarang memiliki sebuah argsbendera, jadi Anda dapat memanggil:

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

John McDonnell
sumber
Bekerja persis seperti yang diminta. Terima kasih
DTdev
Ini berfungsi dan memungkinkan saya menyetel alias zsh untuk Chromium. Terima kasih
jamescampbell
Jawaban ini bagus. Hanya ingin menambahkan bahwa ketika Anda pertama kali membuka Terminal Anda akan berada di direktori home Anda, jadi ketikkan dengan cara ini sehingga Anda tidak perlu berpindah ke direktori Aplikasi. Saya ingin menjalankan Gimp tanpa memuat font, yang membutuhkan waktu lama, jadi saya mengetik ini dengan tombol -f untuk menghilangkan font: open -n /Applications/GIMP.app --args -f
James Toomey
32

Bundel aplikasi ( .appfile) sebenarnya adalah sekumpulan direktori. Alih-alih menggunakan opendan .appnamanya, Anda benar-benar dapat masuk ke dalamnya dan memulai biner sebenarnya. Misalnya:

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

Itu adalah biner aktual yang mungkin menerima argumen (atau tidak, dalam LittleSnapperkasus ini).

NSSec
sumber
3
Biner menerima argumen, saya yakin. Saya menulisnya. Memanggil 'open' tidak mengizinkan argumen yang lewat. Saya cukup yakin tentang ini. Dan ya, skrip saya memanggil 'open binary' secara langsung, bukan mencoba membuka bundel.
psikotik
@psychotik: Dia tidak mengatakan untuk memanggil "biner terbuka." Dia mengatakan untuk langsung mengeksekusi biner.
Chuck
Itu tidak akan berhasil untukku. Eksekusi langsung hasil biner di dalamnya menjadi proses anak skrip saya, yang pasti tidak saya inginkan. Oleh karena itu, kebutuhan untuk menggunakan open / nohup
psychotik
1
Jika ini adalah skrip shell, gunakan 'exec' untuk mengganti proses skrip dengan file yang dapat dieksekusi.
Jonathan Leffler
2
Pendekatan ini memiliki kelemahan utama: jika bungkusan itu berisi perpustakaan kustom dan kerangka kerja, Anda akan perlu mengutak-atik DYLD_LIBRARY_PATH, DYLD_FRAMEWORK_PATH.
ulidtko
14

Jika aplikasi Anda perlu bekerja pada file (yang biasanya Anda harapkan untuk diteruskan sebagai:) ./myApp *.jpg, Anda akan melakukannya seperti ini:

open *.jpg -a myApp
eshedg
sumber
Yang ini persis seperti yang saya cari! Instansiasi saya, misalnya: open something.py -a Eclipse.app
Eric
4

Saya akan merekomendasikan teknik yang ditawarkan MathieuK. Dalam kasus saya, saya perlu mencobanya dengan Chromium:

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

Saya menyadari ini tidak menyelesaikan masalah OP, tapi mudah-mudahan bisa menghemat waktu orang lain. :)

Paul Irish
sumber
@Pacerier Tambahkan `&` ke akhir perintah ini. Ini akan diluncurkan di latar belakang. Anda kemudian dapat menutup jendela terminal Anda dan aplikasi kemungkinan besar akan tetap terbuka.
Paul Irish
2

openjuga memiliki tanda -a, yang dapat Anda gunakan untuk membuka aplikasi dari dalam folder Aplikasi dengan namanya (atau dengan pengenal bundel dengan tanda -b). Anda dapat menggabungkan ini dengan opsi --args untuk mencapai hasil yang Anda inginkan:

open -a APP_NAME --args ARGS

Untuk membuka video di pemutar VLC yang harus diskalakan dengan faktor 2x dan loop Anda akan misalnya exectute:

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

Perhatikan bahwa saya tidak bisa mendapatkan output dari perintah ke terminal. (meskipun saya tidak mencoba apa pun untuk menyelesaikannya)

rien333
sumber
Apakah Anda mengulanginya dengan open -asengaja ?? Bagaimanapun, open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir=/Users/an/userlltidak berhasil untuk saya.
Pacerier
Maaf, sintaks saya benar-benar mati karena beberapa alasan. Saya akan memperbarui sekarang.
rien333
2

Saya ingin menjalankan dua contoh Chrome yang terpisah, masing-masing menggunakan profilnya sendiri. Saya ingin dapat memulainya dari Spotlight , seperti kebiasaan saya memulai aplikasi Mac. Dengan kata lain, saya memerlukan dua aplikasi Mac biasa, regChromeuntuk penjelajahan normal dan altChromeuntuk menggunakan profil khusus, agar mudah dimulai dengan menekan ⌘-space untuk memunculkan Spotlight, lalu 'reg' atau 'alt', lalu Enter.

Saya kira cara brute force untuk mencapai tujuan di atas adalah membuat dua salinan dari bundel aplikasi Google Chrome dengan nama masing-masing. Tapi itu jelek dan memperumit pembaruan.

Apa yang saya dapatkan adalah dua aplikasi AppleScript yang masing-masing berisi dua perintah. Ini yang untuk 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 &"

Baris kedua memulai Chrome dengan profil alternatif ( --user-data-dirparameter).

Baris pertama adalah upaya yang gagal untuk memberikan dua ikon aplikasi yang berbeda. Awalnya, tampaknya berfungsi dengan baik. Namun, cepat atau lambat, Chrome membaca ulang file ikonnya dan mendapatkan yang sesuai dengan salah satu dari kedua aplikasi tersebut yang terakhir kali dijalankan, menghasilkan dua aplikasi yang berjalan dengan ikon yang sama. Tetapi saya tidak repot-repot untuk mencoba memperbaikinya - saya menyimpan kedua browser di desktop yang terpisah, dan menavigasi di antara keduanya tidak menjadi masalah.

George
sumber
2

Dimulai dengan OS X Yosemite , sekarang kita dapat menggunakan AppleScript dan Automator untuk mengotomatiskan tugas-tugas kompleks. JavaScript untuk otomatisasi sekarang dapat digunakan sebagai bahasa skrip.

Halaman ini memberikan contoh skrip yang bagus yang dapat ditulis pada baris perintah menggunakan mode interaktif bash dan osascript . Ini membuka tab Safari dan menavigasi ke 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;
Mowzer
sumber
periksa Editor Skrip / Jendela / Perpustakaan untuk daftar aplikasi yang memiliki otomatisasi applescript. Saya mencari Vysor, berdasarkan Chrome, dan saya rasa saya membutuhkan cara yang berbeda.
AnneTheAgile
Lebih kompleksitas ftw!
Pacerier
1

Dengan applescript:

tell application "Firefox" to activate
Keith
sumber
Bagaimana Anda menyampaikan argumen ke Firefox? Misalnya, -tidak jauh -P "Profil Lain". Saat mengembangkan add-on dan semacamnya, akan lebih mudah untuk memiliki dua proses Firefox terpisah menggunakan dua profil terpisah. Profil normal Anda dan kotak pasir untuk men-debug ekstensi Anda.
George
Saya yakin Anda mengacu pada arahan AppleScript, tetapi pertanyaannya adalah tentang membuka dari baris perintah ...
conny
0

Mengapa tidak mengatur tambahkan jalur ke tempat sampah aplikasi. Untuk MacVim, saya melakukan hal berikut.

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

Alias, adalah opsi lain yang saya coba.

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

Dengan PATH ekspor saya dapat memanggil semua perintah di aplikasi. Argumen berhasil dengan baik untuk pengujian saya dengan MacVim. Sedangkan aliasnya, saya harus membuat alias setiap perintah di tempat sampah.

mvim README.txt
gvim Anotherfile.txt

Nikmati kekuatan alias dan PATH. Namun, Anda tetap perlu memantau perubahan saat OS ditingkatkan.

nol
sumber
"Ingat MacOS berbasis linux". Tidak, tidak, macOS dan Linux tidak berbagi satu baris kode pun. MacOS adalah UNIX dengan kernel berbasis FreeBSD.
Thomas
Akan berubah. Saya tidak ingin membuat perang agama. Tujuannya adalah untuk memberi tahu komunitas bahwa ada beberapa opsi hebat yang dapat dimanfaatkan pengguna MacOS.
zerocog
Tentu tidak masalah! :)
Thomas
0

Sederhana, di sini ganti "APP" dengan nama aplikasi yang ingin Anda luncurkan.

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

Terima kasih saya nanti.

Kiran Sk
sumber
0

Anda dapat meluncurkan aplikasi menggunakan open:

open -a APP_YOU_WANT

Ini harus membuka aplikasi yang Anda inginkan.

pengguna13549667
sumber