6

*nix コマンドラインから (標準入力/標準出力を使用して、ターミナル コンソールから、または ssh 経由などで) 厳密に実行できる単一の Mac OS X アプリを作成することは可能ですか?すべてのユーザー インタラクションに Mac GUI を使用していますか (ターミナルは必要ありません)。もしそうなら、どのように?

パイプ、ソケット、共有メモリ、または通信用の Applescript (その他) を使用して、1 つはもう 1 つの GUI フロントエンドである 2 つの実行可能ファイルを使用して、このようなことを既に実現できます。この質問は、単一の実行可能ファイルと単一のアプリ プロセス スペースを使用してこれを実行できるかどうかです。

コマンドライン実行可能ファイルに新しいコマンドライン引数を渡さずにこれを行う方法はありますか? (コマンドライン アプリの使用に関連する従来の問題があるため)。

4

7 に答える 7

4

あなたが探しているのは、GUI から起動したのか、コマンド ラインから起動したのかを判断する方法だと思います。簡単な方法は、親プロセスの識別子を取得することです。GUI プロセスの場合は、launchd (ユーザー セッション launchd) によって開始されます。あなたがコマンドラインである場合、シェルまたはスクリプトがあなたを開始しました (とにかく、launchd ではありません)。

さて、その方法 - 簡単な方法は proc_info システム コール (#336) を使用することです。これは libproc (check によって便利にラップされ<libproc.h>ます。具体的には<sys/proc_info.h>、親を指定する pbi_ppid フィールドを持つ proc_bsdinfo (を参照)が必要です。 (そして、親の pbi_comm がその名前を教えてくれます - それが launchd かどうかを確認します。) に入る直前に親をチェックすることで、コマンド ライン機能を実装できますNSApplicationMain

(他の回答と同様に、バイナリは最終.app/Contents/MacOS/<binary>的に .

于 2012-08-31T01:16:53.847 に答える
3

これが機能するかどうかは100%わかりませんが、LSEnvironmentキー入力のドキュメントにInfo.plistは、指定された環境変数は、アプリケーションがFinderによって起動されたときにのみ定義されることが示されているようです。

で変数を定義しLSEnvironment(それを呼び出しましょうMYAPP_GUI)、起動時にその値を確認する場合、ターミナルを使用するときではなく、Finderを使用するときに存在する必要があります。GUIを表示するかstdioを使用するかがわかります

于 2012-08-30T19:34:43.487 に答える
0

これは私が .Net アプリで行うことなので、大まかに考えてください。このアイデアは、他のプラットフォームの他の言語でも実現できると思います。

すべての GUI クラスを引き続き使用するコンソール アプリケーションを作成します。プログラムが起動すると、それがコマンド ライン インスタンスではなく GUI インスタンスであるかどうかを判断する基準に基づいて、それに応じて GUI を起動するか、コマンド ライン インターフェイスを起動します。

重要なことは、コマンド ラインの代わりに GUI をいつ表示するかを決定する条件があることです。おそらく、セッションに関するシステム変数を介して(sshセッション、コマンドライン、それ以外の場合はGUI)。

于 2012-08-30T18:52:06.797 に答える
0

あなたが期待する方法では不可能だと思います。GUI OSX アプリは、実際にはアプリケーション バンドルです。つまり、実際には、実際の実行可能ファイル以外に多くのリソースを含むディレクトリです。これらのバンドルをコマンドライン実行可能ファイルであるかのようにシェルで実行することはできません (たとえばシェル./MyApplication.app --some-optionはディレクトリの実行方法を知らないため、シェル プロンプトでは実行できません)。経由でGUIとしてそれらをopen MyApplication.app。これで、バンドル内の実際の実行可能ファイルにアクセスできるようになり、それ取得できる可能があります。Xcodeツールとそのビルドシステムを実際に使用した経験がないため、ここで私のお尻を言いますが、実際の実行可能ファイルをCLIとGUIの両方の呼び出しで動作させることは可能かもしれません.

それでも、これらの実行可能ファイルはアプリケーション バンドル内に埋め込まれており、通常はシェルで直接アクセスできないため、あまり役に立ちません (つまり、それらは $PATH に含まれていないため、次のように呼び出す必要があります)。./MyApplication.app/Contents/MacOS/actualbinaryname)。私が実際に見た通常のアプローチは、アプリケーションにバンドルされた別の CLI 実行可能ファイルを提供することです。これは通常、インストーラーによって、またはアプリのボタンをクリックすることによって適切な場所 (/usr/local/bin など) にインストールされます。環境設定。これらの CLI 実行可能ファイルは、GUI アプリとのインターフェイスを処理します (それが意図されている場合) (質問からは明確ではありません)。

于 2012-08-30T19:00:39.043 に答える
0

--command-lineはい、プログラムにスイッチを追加するだけです。--command-line実行時に引数として渡されない限り、通常の GUI を開始します。

./myprog --command-line

それだけです。

于 2012-08-30T18:43:46.270 に答える
0

ポイントを逃した場合はお詫びしますが、objective-C を使用している場合は、objective-C で NSProcessInfo クラスを使用し、「arguments」変数を調べて、引数が渡されたかどうかを判断するための答えの一部ではありません。次に何をすべきかをコードで決めますか?

于 2012-10-21T02:33:46.280 に答える