web-dev-qa-db-ja.com

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

編集

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

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

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

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

そしてそれをアプリケーションとして保存してください

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

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

16
MJeffryes

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

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

それはあなたが望むすべての振る舞いをあなたに与えるでしょう。

25
Bob

Automatorを開き、 Application を単一の シェルスクリプトの実行 アクションで作成します。

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

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

11
Daniel Beck

これは古い議論ですが、それでもグーグル検索で出てくるので、私はいくつかの¢を加えたいと思いました。

実行可能ファイルへの絶対パスではなく、「バンドル識別子」を使用することをお勧めします。

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を走らせているならば、そして "Profile 2"で別のものが、そしてChromeはまだ "Profile 1"として別のウィンドウを開くだけである) :(

8
user1722483

このシナリオでは、親のAppleScriptアプリケーションプロセス(「アプレット」)を強制終了するために killall (または同様の方法)を使用する必要はありません(他の回答からもわかるとおり)。 killall に指定された名前/パターンが、親アプレットプロセスだけでなく、他のAppleScriptアプリケーションを同時に実行している場合(パターンとして「アプレット」を使用している場合など)。

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

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

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

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

(機能的な改行は「狭く」するために追加されました。必要に応じて¬\\を削除して1行にまとめてください)

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

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

open inside doシェルスクリプト workを使用する他の答えは、 open (実際にはLaunchServices)は、結果のプログラムをバックグラウンド化し、その標準出力と標準エラーを送信するのと同じこと他の場所で。

7
Chris Johnsen

AppleScript

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

2点あります。

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

しかしそれは10.6.5でもうまくいきます。

4
anonymous

次は、.app自体のコマンドライン引数を指定するのを許可します。

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

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

2
Dav

アプリケーションを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」になります)

    結果:/アプリケーション/ Firefox 3 launcher.app/Firefox 3.app

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

ノート:

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

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

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