Bagaimana saya bisa menjalankan aplikasi dengan argumen baris perintah di Mac OS

60

Apakah ada cara mudah untuk menambahkan argumen baris perintah ke aplikasi di Mac? Misalnya, untuk menjalankan Opera dalam mode kios atau untuk menggunakan profil lain di Firefox, saya bisa mengetik

$ /Applications/Opera.app/Contents/MacOS/Opera -kioskmode
$ /Applications/Firefox.app/Contents/MacOS/firefox -P profilename -no-remote

Di Windows saya dapat menambahkan argumen ke properti pintasan, tetapi karena Mac tidak menggunakan pintasan per se dan menjalankan aplikasi secara langsung, ini tidak mungkin.

Saya telah menemukan bahwa meluncurkan aplikasi melalui bash atau Applescript sebagian berfungsi:

# Bash
#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote

# Applescript    
do shell script "exec /Applications/Opera.app/Contents/MacOS/Opera -kioskmode"

Saya dapat membuat ini dapat dieksekusi dan menetapkan ikon dan semuanya berfungsi dengan baik kecuali bahwa ketika saya menjalankan salah satu dari program semu ini, jendela terminal atau ikon Applescript tetap terbuka selama aplikasi terbuka. Agaknya, menggunakan perintah Applescript openakan menghindari ini, tetapi karena saya tidak menjalankan aplikasi seperti yang dipaket (hanya /Applications/Firefox), itu tidak berfungsi.

Jadi, apakah ada cara yang lebih baik untuk menjalankan aplikasi dengan argumen baris perintah? Jika tidak, apakah ada cara untuk mencegah sesi terminal atau ikon Applescript tetap terbuka saat aplikasi terbuka?

Sunting

Menurut halaman Mozilla Wiki , yang terbaik adalah menggunakan skrip untuk menjalankan aplikasi dengan argumen. Menambahkan a &ke akhir skrip akan membunuh jendela Terminal yang persisten. Satu-satunya gangguan sekarang adalah bahwa ia membuka jendela Terminal mati, keluar (yang lebih baik daripada yang gigih, tapi masih ...)

#!/bin/sh
/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote &
Andrew
sumber
2
Saya masih berharap untuk jawaban yang lebih baik untuk yang ini ...
cregox
Ketika Anda menjalankan pekerjaan dengan &itu masih milik Terminal, Anda dapat memperbaikinya dengan menambahkan baris disown %/Applications/Firefox.app/Contents/MacOS/firefox setelah Anda menjalankannya, maka Anda dapat dengan aman menutup Terminal, menggunakan AppleScript.
ocodo
cari jawaban Daniel - ini yang paling lengkap dan sempurna untuk hari ini (OSX 10.6.2 +).
Cregox

Jawaban:

17

Inilah solusi terbaik saya: Buat Applescript dengan:

do shell script "/Applications/Firefox.app/Contents/MacOS/firefox -P default -no-remote & killall Firefox.app"

Dan simpan sebagai aplikasi .

Anda dapat menempatkan aplikasi apa pun dengan argumen apa pun di bagian pertama. Bagian setelah &kebutuhan untuk membunuh apa pun yang Anda beri nama skrip + .app. Anda akan melihat aplikasi skrip menyala di dok, tetapi kemudian akan menghilang.

Catatan: Skrip tidak akan berfungsi dengan benar ketika dijalankan dari Editor Skrip, hanya ketika dijalankan dari aplikasi skrip yang Anda buat.

MJeffryes
sumber
Hampir berhasil. Itu masih menunggu contoh Firefox dilakukan sampai ia menjalankan killall, jadi ia memanggil debugger ketika saya menutup Firefox, dan aplikasi skrip masih tidak hilang. Hmmm ...
Andrew
Itu aneh. Apakah Anda menyimpannya sebagai Aplikasi lalu mengklik ganda Aplikasi? Ini tidak akan berfungsi ketika dijalankan dari Editor Skrip.
MJeffryes
Juga, saya perhatikan saya meletakkan baris baru sebelum &. Hapus baris baru jika Anda memilikinya
MJeffryes
tidak perlu untuk & killall di sini di Snow Leopard 10.6.x - tetapi juga tidak dapat menemukan cara untuk membuat aplikasi membunuhnya sendiri begitu mengeksekusi.
cregox
1
@Pacerier Periksa tanggal pada jawaban ini.
MJeffryes
28

Mulai di OS X 10.6.2, perintah terbuka dapat meneruskan argumen ke aplikasi yang dibuka melalui flag --args. AppleScript untuk menggunakannya terlihat seperti ini:

do shell script "open -a /Applications/Firefox.app --args -P default -no-remote"

Itu akan memberi Anda semua perilaku yang Anda inginkan.

Bob
sumber
"man open", dan itu dia! bekerja seperti pesona. --args menandai dan kemudian argumen Anda.
Michael Dimmitt
1
Saya mencoba --argsdengan Chrome dan tidak berhasil. Ini hanya akan berfungsi untuk instance pertama . Jika Anda mencoba menjalankan dua --user-data-dirsecara bersamaan, Anda tidak dapat melakukannya dengan opentetapi harus menjalankannya dengan /applications...metode lama . Adakah yang tahu mengapa keparat itu --args tidak berhasil?
Pacerier
1
@Pacerier, "open -n"
Simon Wright
Untuk menambahkan ini, Anda dapat membuat skrip di Script Editor dan kemudian simpan sebagai aplikasi.
Kevin C.
11

Buka Automator dan buat Aplikasi dengan tindakan Run Shell Script tunggal :

 /Applications/Firefox.app/Contents/MacOS/firefox-bin -here-some-args &

Aplikasi ini akan meluncurkan Firefox dan berhenti secara instan, hanya menyisakan Firefox yang berjalan.


Atau, buat aplikasi menggunakan AppleScript Editor dengan kode AppleScript berikut:

do shell script "open -a '/Users/danielbeck/Applications/Firefox.app' --args -ProfileManager"

Keduanya berfungsi dengan baik dan tidak membuat Terminal atau aplikasi skrip berjalan lebih dari satu detik. Menggunakan Automator, Anda bahkan dapat membuat Layanan jika Anda memilihnya.

Daniel Beck
sumber
1
Hanya perlu diingat bahwa open --argsini diterapkan pada 10.6.2, seperti yang telah disebutkan Bob.
Cregox
Menggunakannya untuk: open eclipse.app -nmembuka ruang kerja Eclipse kedua. Sangat berguna. Terima kasih!
jonalv
Tidak dapat membuatnya berfungsi di Automator dengan tindakan "Run Shell Script" di MacOS 10.14. Saya akhirnya sukses dengan AppleScript.
Kevin C.
8

Ini adalah diskusi lama, tetapi masih muncul di pencarian Google, jadi saya pikir saya akan menambahkan beberapa ¢.

Mungkin lebih baik menggunakan "pengidentifikasi bundel" daripada jalur absolut ke yang dapat dieksekusi:

open -b com.google.Chrome --args --profile-directory="Profile 1"

Atau dalam Skrip Apple:

do shell script "open -b com.google.Chrome --args --profile-directory='Profile 1'"

Yang belum saya ketahui adalah bagaimana membuka instance / window baru dengan profil yang berbeda begitu yang pertama sudah terbuka. (Jika saya menjalankan AppleScript di atas, lalu yang lain dengan "Profil 2", maka Chrome masih akan membuka jendela lain sebagai "Profil 1"). :(

pengguna1722483
sumber
Apakah -b secara fungsional sama dengan -a? Bagaimana mereka berbeda?
Pacerier
7

Tidak perlu (karena beberapa jawaban lain telah menyarankan) untuk menggunakan killall (atau serupa) untuk membunuh proses aplikasi AppleScript induk ("applet") dalam skenario ini. Ia bahkan dapat memiliki efek samping yang tidak diinginkan jika nama / pola yang diberikan untuk membunuh semuanya lebih dari sekadar proses applet induk (mis. Lainnya, secara bersamaan menjalankan aplikasi AppleScript (jika menggunakan "applet" sebagai polanya)).

Sesuatu seperti kill $PPIDmungkin lebih masuk akal, tetapi kami mungkin tidak ingin berasumsi bahwa applet dari aplikasi AppleScript selalu merupakan induk langsung dari shell yang dimulai dengan script shell . Untungnya, ada cara yang masuk akal untuk melakukan apa yang Anda butuhkan.

Per TN2065 (di bawah "Saya ingin memulai proses server latar belakang; bagaimana saya membuat skrip shell jangan menunggu sampai perintah selesai?"), Metode yang tepat adalah untuk mengarahkan ulang stdout dan stderr dan membiarkan shell menjalankan program di latar belakang .

Gunakan Editor Skrip untuk menyimpan program berikut sebagai aplikasi AppleScript:

do shell script ¬
    "/Applications/Firefox.app/Contents/MacOS/firefox-bin \\
        -P default -no-remote \\
        >/dev/null 2>&1 &"

(jeda baris fungsional ditambahkan agar tetap "sempit"; hapus ¬dan \\dan letakkan semuanya pada satu garis panjang jika Anda mau)

Ini akan berjalan cukup lama untuk memulai Firefox dan akan keluar dengan bersih sementara Firefox terus berjalan.

Pengalihan diperlukan karena script shell tidak hanya menunggu anak langsung (shell) untuk keluar, tetapi juga menunggu (semua contoh) ujung pipa yang dapat ditulisi yang dibuatnya agar stdout dan stderr shell ditutup. . Stdout dan stderr shell ( melakukan pipa script shell ) diwarisi oleh program yang dijalankan tanpa pengalihan (bahkan yang berjalan di latar belakang dengan &); pengalihan memastikan bahwa shell adalah yang terakhir untuk memegang ujung pipa yang dapat ditulisi. Jadi, script shell akan kembali segera setelah shell keluar, memungkinkan aplikasi AppleScript sendiri untuk keluar (karena script shell adalah ekspresi terakhir dalam program AppleScript).

Jawaban lain yang menggunakan buka di dalam melakukan skrip shell berfungsi karena terbuka (sebenarnya LaunchServices) melakukan pekerjaan yang setara dengan latar belakang program yang dihasilkan dan mengirimkan stdout dan stderr di tempat lain.

Chris Johnsen
sumber
ini sangat menarik. Saya ingin tahu apakah ini berfungsi sebelum 10.6.2 ... tapi saya masih berpikir menggunakan open --argsterlihat lebih bersih. apakah ada kelemahan dalam menggunakan salah satunya?
cregox
1
Saya tahu metode ini bekerja di 10.4. Kesan saya adalah bahwa script shell selalu berfungsi seperti ini (ditambahkan ke OSA Penambahan Standar di AppleScript 1.7 , yang datang dengan Mac OS X 10.1). Jika Anda mau berasumsi 10.6, maka open --argsmungkin baik-baik saja.
Chris Johnsen
@ChrisJohnsen, Tautkan ke bawah ........
Pacerier
4

AppleScript

do shell script "/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --incognito & killall applet"

Dua poin di sana.

  1. Ruang diloloskan oleh backslash yang lolos oleh backslash lagi
  2. applet killall dapat menyebabkan masalah, karena mungkin ada applet lain yang berjalan
  3. Simpan sebagai program

Namun itu bekerja dengan baik pada 10.6.5

anonim, tanpa nama
sumber
appletmengacu pada?
Pacerier
3

Berikut ini harus membiarkan Anda menentukan argumen baris perintah untuk .app itu sendiri:

Klik kanan bundel .app, pilih "Tampilkan Isi Paket", navigasikan ke Info.plist, klik dua kali, temukan kunci Args, edit.

Saya tidak memiliki mesin OS X yang berguna saat ini, jadi saya tidak dapat memeriksa apakah Anda juga bisa melakukan ini pada alias (jika Anda ingin menjaga .app bebas argumen asli, dan lain-lain).

Dav
sumber
Sayangnya, tidak ada kunci args dalam daftar itu. Menurut Mozilla, Anda seharusnya menggunakan skrip - wiki.mozilla.org/MailNews:Logging#Mac
Andrew
Perhatikan juga bahwa mengubah isi paket (seperti Info.plist) dapat menyebabkan masalah dengan penandatanganan kode: bridge.grumpy-troll.org/2011/01/…
drevicko
2

Bungkus aplikasi Anda di dalam peluncur AppleScript.

Inilah langkah-langkahnya.

  1. Buat AppleScript dengan konten berikut, dan simpan sebagai aplikasi (dalam contoh ini diberi nama "Firefox 3 launcher.app").

    set pathToApp to (POSIX path of (path to me)) & "Firefox 3.app"
    do shell script "open -a \"" & pathToApp & "\" --args -P default -no-remote"
    
  2. Dapatkan aplikasi itu di Finder, klik kanan, tampilkan konten paket.

  3. Tempatkan aplikasi Anda di root dari isi paket. (Dalam contoh ini akan menjadi "Firefox 3.app")

    Hasil: / Aplikasi / Firefox 3 launcher.app/Firefox 3.app

  4. Anda sekarang dapat membuka peluncur aplikasi Anda.

Catatan:

  • Pembaruan otomatis dari aplikasi yang dibungkus akan berfungsi dalam banyak kasus.
  • Seharusnya dimungkinkan untuk melakukan seret dan lepas ke peluncur secara otomatis dialihkan ke aplikasi yang dibungkus (dengan skrip yang lebih sedikit).
  • Peluncur keluar secara otomatis setelah aplikasi yang dibungkus diluncurkan.
  • Keuntungan dari metode ini adalah ada sedikit risiko membuka aplikasi yang dibungkus secara langsung.
terima kasih
sumber
1

Mengapa Anda tidak menggunakan:

#!/bin/sh
open /Applications/Firefox.app

Sederhana tetapi berhasil.


sumber
2
Terminal akan terbuka jika Anda melakukannya.
MJeffryes
0

The openperintah memiliki opsional --argsargumen bahwa nilai akan diteruskan ke aplikasi dibuka sebagai argumen. Sebagai contoh:

open /Applications/TextEdit.app --args example.txt
ecnepsnai
sumber