Mac OSでコマンドライン引数を使用してアプリケーションを実行する方法


60

Macのアプリケーションにコマンドライン引数を追加する簡単な方法はありますか?たとえば、Operaをキオスクモードで実行したり、Firefoxで別のプロファイルを使用したりするには、次のように入力します。

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

Windowsでは、ショートカットプロパティに引数を追加できますが、Macはそれ自体ショートカットを使用せず、アプリケーションを直接実行するため、これは不可能です。

bashまたはApplescriptを使用してアプリケーションを起動すると、部分的に機能することがわかりました。

# 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"

これらの実行可能ファイルを作成してアイコンを割り当てると、これらの擬似プログラムのいずれかを実行すると、アプリケーションが開いている限りターミナルウィンドウまたはApplescriptアイコンが開いたままになることを除いて、すべてがうまく機能します。おそらく、Applescriptコマンドを使用するopenとこれを回避できますが、パッケージ化された(ちょうど/Applications/Firefox)アプリケーションを実行していないため、機能しません。

だから、コマンドライン引数でアプリケーションを実行するより良い方法はありますか?そうでない場合、アプリケーションが開いている間、永続的なターミナルセッションまたはApplescriptアイコンが開いたままになるのを防ぐ方法はありますか?

編集

Mozilla Wikiページによると、引数を使用してアプリケーションを実行するにはスクリプトを使用するのが最善です。&スクリプトの最後にa を追加すると、永続的なターミナルウィンドウが強制終了されます。唯一の厄介な点は、それが死んでログアウトしたターミナルウィンドウを開くことです(これは永続的なウィンドウよりも優れていますが、それでも...)

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

2
私はまだこれに関するより良い答えを望んでいます...
cregox

&まだターミナルに属している状態でジョブを実行する場合、実行disown %/Applications/Firefox.app/Contents/MacOS/firefox 後に行を追加することで修正でき、AppleScriptを使用してターミナルを安全に閉じることができます。
オコド

ダニエルの答えを探してください。これは今日で最も完全で完璧なものです(OSX 10.6.2 +)。
クレゴックス

回答:


17

私の最良の解決策は次のとおりです。

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

そして、アプリケーションとして保存します

最初の部分には、どんな引数でもどんなアプリケーションでも置くことができます。後の部分&は、スクリプト+ .appという名前を付けたものをすべて削除する必要があります。ドックでスクリプトアプリが点滅しますが、その後消えます。

注:スクリプトは、作成したスクリプトアプリケーションから実行する場合にのみ、スクリプトエディターから実行する場合は正しく機能しません。


それはほとんど動作します。killallを実行するまでFirefoxインスタンスの実行を待機しているため、Firefoxを閉じるとデバッガーが呼び出され、スクリプトアプリは終了しません。うーん...-
アンドリュー

それは変だ。アプリとして保存し、アプリをダブルクリックしますか?スクリプトエディタから実行すると機能しません。
Mジェフリーズ2009

また、&の前に改行を入れています。改行がある場合は削除してください
MJeffryes 09

Snow Leopard 10.6.xでは、&killallは必要ありませんが、実行するとすぐにアプリが自己終了するようにする方法も見つかりませんでした。
クレゴックス

1
@Pacerierこの回答の日付を確認してください。
MJeffryes

28

OS X 10.6.2以降では、openコマンドは、-argsフラグを使用して、開くアプリケーションに引数を渡すことができます。使用するAppleScriptは次のようになります。

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

それはあなたが望むすべての動作を提供する必要があります。


「男が開く」とそこにある!魅力のように働いた。--argsフラグ、次に引数。
マイケルディミット

1
--argsChromeで試しましたが、機能しません。最初のインスタンスでのみ機能します。2つを--user-data-dir同時に実行しようとすると、それを行うことはできませんがopen、古い/applications...方法で実行する必要があります。誰も性交が機能し--args ない理由を知っていますか?
パセリエ

1
@Pacerier、「オープン-n」
サイモンライト

これに追加するには、スクリプトエディターでスクリプトを作成し、アプリケーションとして保存します。
ケビンC.

11

Automatorを開き、1つのRun Shell Scriptアクションでアプリケーションを作成します

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

このアプリケーションはFirefoxを起動して即座に終了し、Firefoxのみが実行されます。


または、AppleScript Editorで次のAppleScriptコードを使用してアプリケーションを作成します。

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

どちらも正常に機能し、ターミナルまたはスクリプトアプリケーションを1秒以上実行し続けません。Automatorを使用すると、必要に応じてサービスを作成することもできます。


1
open --argsボブが既に述べたように、これは10.6.2で実装されたことに留意してください。
クレゴックス

用途:open eclipse.app -n2番目のEclipseワークスペースを開く。とても便利な。ありがとう!
jonalv

MacOS 10.14の「シェルスクリプトの実行」アクションでAutomatorで動作させることができませんでした。しかし、AppleScriptで成功しました。
ケビンC.

8

これは古い議論ですが、まだGoogle検索で出てきているので、¢を2つ追加すると思いました。

おそらく、実行可能ファイルへの絶対パスよりも「バンドル識別子」を使用する方が適切です。

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

またはApple Scriptの場合:

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

私がまだ理解していないのは、最初のインスタンス/ウィンドウが既に開いているときに、別のプロファイルで新しいインスタンス/ウィンドウを開く方法です。(上記のAppleScriptを実行してから、「プロファイル2」で別のスクリプトを実行すると、Chromeは「プロファイル1」として別のウィンドウを開きます)。:(


-bは機能的に-aと等しいですか?それらはどう違いますか?
パセリエ

7

このシナリオでは、killall(または同様の)を使用して親AppleScriptアプリケーションプロセス(「アプレット」)を強制終了する必要はありません(他のいくつかの回答が示唆しているように)。killallに指定された名前/パターンが親アプレットプロセス(たとえば、他の並行して実行されるAppleScriptアプリケーション(パターンとして「アプレット」を使用する場合)以外のものと一致する場合、不都合な副作用が生じることさえあります。

以下のような何かがkill $PPIDより合理的かもしれませんが、AppleScriptのアプリケーションのアプレットが常にシェルの直接の親であることを、我々はによって開始されたと仮定したくないかもしれないシェルスクリプトを実行します。幸いなことに、必要なことを行うための完全に合理的な方法があります。

パーTN2065(「私は、バックグラウンド・サーバー・プロセスを開始したい?;私はシェルスクリプトはコマンドが完了するまで待機しません作るのですか」の下で)、適切な方法は、stdoutとstderrをリダイレクトし、シェルがバックグラウンドでプログラムを実行することです。

スクリプトエディタを使用して、次のプログラムをAppleScriptアプリケーションとして保存します。

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

(機能的な改行を追加して「狭い」状態に保ちます。必要に応じて¬and \\を削除し、すべてを1つの長い行に配置します)

これは、Firefoxを起動するのに十分な時間実行され、Firefoxの実行が継続している間は正常に終了します。

リダイレクトは、シェルスクリプトがその直接の子(シェル)が終了するのを待つだけでなく、シェルのstdoutおよびstderrが閉じられるために作成するパイプの(すべてのインスタンス)の書き込み可能な端も待つため、必要です。 。シェルのstdoutおよびstderr(シェルスクリプトのパイプを実行)は、リダイレクトなしで実行されるプログラムに継承されます(バックグラウンドで実行されるプログラムでも&)。リダイレクトにより、シェルがパイプの書き込み可能な端を保持する最後のシェルになります。したがって、do shell scriptは、シェルが終了した直後に戻り、AppleScriptアプリケーション自体が終了できるようにします(do shell scriptはAppleScriptプログラムの最後の式であるため)。

使用する他の回答のオープンは、内部のシェルスクリプトを行うための作業を開いて(実際にLaunchServicesが)結果のプログラムをバックグラウンド化し、他の場所でそのstdoutとstderrを送信するのと同等の作業を行います。


これは非常に興味深いです。それは前に10.6.2に働くのだろうか...私はまだ使用して考えるopen --argsクリーナールックスを。それらのいずれかを使用する上で欠点はありますか?
クレゴックス

1
この方法は10.4で機能することを知っています。私の印象では、do shell scriptは常にこのように機能していました(Mac OS X 10.1に付属のAppleScript 1.7のStandard Additions OSAXに追加されました)。10.6を想定している場合は、おそらく大丈夫です。open --args
クリスジョンセン

@ChrisJohnsen、ダウン........リンク
Pacerier

4

AppleScript

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

そこに2つのポイント。

  1. スペースはバックスラッシュによってエスケープされますが、バックスラッシュによって再びエスケープされます
  2. killallアプレットは、他のアプレットが実行されている可能性があるため、問題を引き起こす可能性があります
  3. プログラムとして保存する

ただし、10.6.5では正常に動作します


appletを指しますか?
パセリエ

3

以下を使用すると、.app自体のコマンドライン引数を指定できます。

.appバンドルを右クリックして[パッケージの内容を表示]を選択し、Info.plistに移動してダブルクリックし、Argsキーを見つけて編集します。

現時点ではOS Xマシンが手元にないので、エイリアスに対してもこれを行うことができるかどうかを確認できません(元の.appを引数なしで保持したい場合など)。


残念ながら、plistにはargsキーはありません。Mozillaによると、スクリプトを使用することになっています-wiki.mozilla.org/MailNews:Logging#Mac
Andrew

また、パッケージの内容(Info.plistなど)を変更すると、コード署名に関する問題が発生する可能性があることに注意してください。bridge.grumpy
troll.org

2

アプリケーションをAppleScriptランチャーにラップします。

手順は次のとおりです。

  1. 次のコンテンツでAppleScriptを作成し、アプリケーションとして保存します(この例では「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. Finderでそのアプリにアクセスし、右クリックしてパッケージの内容を表示します。

  3. アプリケーションをパッケージコンテンツのルートに配置します。(この例では「Firefox 3.app」になります)

    結果: / Applications / Firefox 3 launcher.app/Firefox 3.app

  4. これで、アプリケーションランチャーを開くことができます。

ノート:

  • ラップされたアプリケーションの自動更新は、ほとんどの場合に機能するはずです。
  • ラップされたアプリケーションに自動的にリダイレクトされるランチャーへのドラッグアンドドロップを可能にする必要があります(もう少しスクリプトを使用します)。
  • ラップされたアプリケーションが起動すると、ランチャーは自動的に終了します。
  • この方法の利点は、ラップされたアプリケーションを直接開くリスクがほとんどないことです。

1

なぜ使用しないのですか:

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

シンプルですが、動作します。


2
そうするとターミナルが開きます。
Mジェフリーズ2009

0

openコマンドはオプションがある--args値が引数として開かれたアプリケーションに渡されるの議論を。例えば:

open /Applications/TextEdit.app --args example.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.