2009-08-01 09:24:24 +0000 2009-08-01 09:24:24 +0000
60
60

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

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のアイコンが開いたままにならないようにする方法はありますか?

Edit

Mozilla Wikiページ によると、スクリプトを使って引数でアプリケーションを実行するのがベストだそうです。スクリプトの最後に & を追加すると、永続的なターミナルウィンドウが消滅します。今の唯一の厄介な点は、死んでログアウトしたターミナルウィンドウを開くことです (永続的なターミナルウィンドウよりはマシですが、それでも…)

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

回答 (9)

30
30
30
2010-03-04 20:13:16 +0000

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

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

これで望み通りの動作が得られるはずです。

18
18
18
2009-08-01 11:56:26 +0000

これが私の最良の解決策です。でApplescriptを作成します。

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

でApplescriptを作成し、**アプリケーションとして保存する。

0x1&

アプリケーションとして保存する&以降の部分は、スクリプト+.appという名前を付けたものを何でも kill する必要があります。ドックでスクリプトアプリが点滅しているのがわかりますが、その後は消えてしまいます。

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

14
14
14
2011-01-22 13:04:27 +0000

Automator**を開き、Run Shell Scriptアクション1つでApplicationを作成します。

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

このアプリケーションは、Firefox を起動して即座に終了し、Firefox だけが起動したままになります。

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

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

0x1&

どちらも正常に動作し、Terminal やスクリプトアプリケーションを 1 秒以上起動させることはありません。Automator を使えば Service を作成することもできます。

8
8
8
2011-03-13 03:59:54 +0000

このシナリオでは、(他の回答で示唆されているように) killall (または類似の) を使用して親の AppleScript アプリケーションプロセス (“applet”) を終了させる必要はありません。killall_に与えられた名前やパターンが、親アプレットプロセス以外のものと一致する場合(例えば、(パターンとして “applet "を使用している場合)、他のAppleScriptアプリケーションが同時に実行されている場合など)には、望ましくない副作用が生じることもあります。

kill $PPID のようなものがより合理的かもしれませんが、AppleScript アプリケーションのアプレットが常に do shell script で起動したシェルの直接の親であると仮定したくないかもしれません。幸いなことに、あなたが必要としていることを行うための完全に合理的な方法があります。

( TN2065 ( "I want to start a background server process; how do I make do shell script not wait until the command completes? ” の項を参照) によれば、stdout と stderr をリダイレクトして、シェルがバックグラウンドでプログラムを実行するのが適切な方法です。

Script Editorを使って、以下のプログラムをAppleScriptアプリケーションとして保存します。

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

(機能的な改行を追加して「狭く」保つようにしています。¬\ を削除して、お好みですべてを一本の長い行にまとめてください)

Firefox を起動するのに十分な長さで実行され、Firefox が実行し続けている間はきれいに終了します。

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

do shell script の中で open を使用する他の回答は、open (実際には LaunchServices) が結果のプログラムをバックグラウンド化し、標準出力と標準エラーを別の場所に送信するという同等の作業を行うために動作します。

8
8
8
2014-08-22 20:50:57 +0000

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

実行ファイルへの絶対パスではなく、「バンドル識別子」を使った方が良いかもしれません。

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」として別のウィンドウを開くだけです) :(

4
4
4
2011-01-22 12:48:22 +0000

AppleScript

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

そこに2つのポイントがあります。

1.スペースはバックスラッシュでエスケープされ、それがまたバックスラッシュでエスケープされる 2. 3. killall applet は、他のアプレットが動いている可能性があるので、トラブルの原因になります。プログラムとして保存する

ただし、10.6.5では問題なく動作します。

3
3
3
2009-08-01 10:30:41 +0000

以下は、.app自体のコマンドライン引数を指定できるようにするためのものです。

.appバンドルを右クリックし、"Show Package Contents “を選択し、Info.plistに移動し、ダブルクリックし、Argsキーを見つけ、編集します。

私は今のところOS Xのマシンを持っていないので、エイリアスにもできるかどうかは確認できません(オリジナルの.appを引数なしにしたい場合など)。

2
2
2
2011-03-22 19:32:58 +0000

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

手順は以下の通りです。

1.以下の内容のAppleScriptを作成し、アプリケーションとして保存します(この例では “Firefox 3 launcher.app "という名前になっています)。

  1. Finder でそのアプリを右クリックして、パッケージの内容を表示。

  2. あなたのアプリケーションをパッケージコンテンツのルートに置きます。(この例では "Firefox 3.app "となります)

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

注意点。

  • ラップされたアプリケーションの自動アップデートは、ほとんどの場合で動作するはずです。
  • ランチャーへのドラッグ&ドロップが自動的にラップされたアプリケーションにリダイレクトされるようにすることができるようになりました(もう少しスクリプトを書く必要があります)。
  • ラップされたアプリケーションが起動した後、ランチャーは自動的に終了します。
  • この方法の利点は、ラップされたアプリケーションを直接開くリスクが少ないことです。
1
1
1
2019-03-29 23:38:35 +0000

open コマンドにはオプションの --args 引数があり、その値が引数としてオープンしたアプリケーションに渡されます。例:

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