最も単純な形式では、プログラムは端末コマンドを実行するだけですか?


18

たとえば、プログラムで1つのフォルダーを選択して別の場所にコピーできるとしましょう。非常に基本的なレベルでは、アプリケーションは端末で実行できるコマンドを実行していますか、それとも内部OS APIを使用して移動しますか?

悪質な反応をanyしみません。私は好奇心が強いだけでなく、13歳の人が尋ねる質問として認識されることを完全に知っています。


4
Ask Differentへようこそ!一部の質問は他の質問よりも高度であり、それで問題ありません。謝る必要はありません。Appleハードウェア、Appleソフトウェア、他のApple製品またはサービス、Apple製品のサードパーティのハードウェアおよびソフトウェアについて質問があり、FAQで禁止されているトピックに関するものではない場合は、質問するのに適切な場所にいます!したがって、質問がトピックに当てはまる場合、13歳(ただし、利用規約によると若くはない)であっても、ここで歓迎します。
ダニエル

3
すばらしい質問-この質問に対する少なくとも3つの重要な答えがあります。これで基本的な答え、中間の答えが得られ、「John SiracusaがMac OS Xアプリケーションのバイナリ構造の内部構造を分析する」レベルの答えが得られることを願っています。
bmike

回答:


11

概念的には、常にOS APIを使用します-質問はどのような方法でのみです。基本的に3つのオプションがあります。

  1. 低レベルOS API(システムコール)を直接使用します。あなたの例では、タスクは非常に複雑です:フォルダー内のアイテムのリストを取得し、タイプ(フォルダー、ファイル...)を確認し、それぞれについてターゲットフォルダーに対応するアイテムを作成し、ファイルについてはソース、ターゲットファイルへの書き込みなど。タスクは非常に複雑であるため、何か間違いが発生しやすいため、ほとんどのアプリケーションはこれを回避します。

  2. タスクを簡素化するライブラリ(API)を使用します。たとえば、Apple CocoaフレームワークはNSFileManagercopyItemAtPath:toPath:error低レベルのOS APIを使用してすべてのダーティな作業を行うメソッドをクラスに提供します。したがって、アプリケーションは低レベルのAPI自体を使用する必要はありませんが、システムに存在します。また、Appleは正常に動作することを確認する可能性があります。

  3. 外部プロセスを使用してタスクを実行します。この場合、外部プロセスは上記の2つの方法のいずれかを使用して作業を行います。アプリケーションは、そのようなプロセスを開始し、監視し、完了するまで待機する必要があります。そのようなプロセスはコマンドラインツールとして実行できる可能性が高いため、これはおそらくターミナルで実行できるコマンドになります。保証されていませんが、非常に可能です。

ほとんどのアプリケーションは、1よりも単純であり、3よりも安全で効率的であるため、オプション2を使用します。外部プロセスを実行するには、適切にセットアップする必要があります。たとえば、障害が発生した場合に正確に何が悪かったのかを把握することははるかに難しく、何をしているかを知ることは困難です(たとえば、進行状況を表示する)。ほとんどの場合、開発者がオプション2を選択する可能性が高いのはそのためですが、保証はありません。注目すべき例は、インストーラーなどのカスタマイズにシェルスクリプトを使用するアプリケーションです。

上級ユーザー向けメモ:dtraceOS Xの機能を使用して、特定のアプリケーションが何をしているかを調べることができます。たとえば、生成されているプロセスをチェックして、使用しているツールを確認できます(を参照execsnoop)。


4

答えは「それは異なりますが、通常は2番目です」ということです。実際、GUIプログラムが端末コマンドを実行している場合でも、APIを呼び出すことでそれらを実行します。

単にターミナルコマンドのリストであるプログラムは、シェルスクリプトと呼ばれます。このようなプログラムはMac OS Xで実行できますが、出力を表示するには、ターミナルウィンドウで実行するか、GUIを使用するプログラムを起動する必要があります。他のプログラムは、内部APIを介してコマンドラインプログラムを呼び出すことができます。

このサイトでは、開発に関するほとんどの質問はトピックから外れていますが、実際にトピックになっている例の1つは、Automatorの実行です。

Automatorで作成されたプログラムが呼び出すことができる内部コマンドのリスト内のオプションの1つは、シェルスクリプトまたはターミナルコマンドのリストを呼び出す機能です。ただし、これは内部APIで使用できる多くのオプションのほんの一部です。

ここに画像の説明を入力してください


しかし、時々APIは、ターミナルからアクセスできるコマンドを呼び出すことになります。/sbin/shutdown破損したり削除されたりすると、アップルメニューの[シャットダウン]コマンドが機能しなくなるというレポートを読みました(自分のコンピューターで複製することを気にしません。ありがとうございました)。
ダニエル

1
シェルスクリプトは、ターミナルウィンドウまたはその他のウィンドウソフトで実行する必要はありません。ただし、ファイルにリダイレクトされない出力が生成される場合は、ウィンドウで実行することを選択できます。シェルスクリプトは、ウィンドウを持つ他のプログラムも実行できます。
ctrl-alt-delor

@richard絶対に正しい。編集済み。
ダニエル

2

Unixの背後にある素晴らしいアイデアの1つは、プログラムのアイデアを得た場合、最初にシェルスクリプトとして書くことです(基本的に一連のコマンドを呼び出します)。

次に、プログラムが有用であることが判明した場合、インターフェイスを改善し、ユーザーにテストしてもらい、最後にそれが価値があると確信したら、「本物の」プログラムを作成します。

もちろん、これはグラフィカルユーザーインターフェイスが引き継ぐ前のことなので、ここでの「プログラム」はそれ自体がCLIコマンドです。

特にシステム情報を表示する場合は、いくつかの最新のプログラムでこのアプローチがまだ見られます。フォルダー内のすべてのファイルを一覧表示するシンプルなアプリを構築したいですか?実行してls -al、結果を解析し、テーブルを表示します。さまざまなパラメーターをお楽しみください。バージョン2.0の資料があります


1

端末コマンドを実行するプログラムのクラスの1つは(すべてがAPI呼び出しで始まる場合でも)、EclipseやXcodeなどの統合されたプログラム開発環境です。プログラム開発に必要なツールのコレクションは、IDEに含まれて維持されるために非常に大きいです。代わりに、makefile(スクリプトの一種)をビルドし、unix 'make'(または同等のもの)で実行して、コンパイル、リンク、ロード、およびデバッグプロセスをステップスルーします。Makeは、コマンドラインインターフェイスを使用して、コンパイラ、リンカーなどを順に実行します。これにより、IDEはプログラマーが選択したツールセットから比較的独立し、ツールの更新に影響されません。


1

アプリケーションは、CLIコマンドを実行して特定のタスクを実行できますが、実際に実行するタスクもあります。しかし、効率の問題により、プロのアプリケーション開発者はコマンドの実行を避け、コマンドが必要なタスクを実行するために使用するAPIを使用します


私はプロのソフトウェアエンジニアです。プログラムからコマンドを呼び出します。それらの一部または全部を自分で書いてから、別の言語でguiを作成します。ただし、コピー(または名前の変更)するAPIは単純なので、cp(コピー)またはmv(移動/名前変更)コマンドは使用しません。一部のフリーソフトウェアプロジェクトでは、この手法を使用しています。GUIの専門家は、基本的にユーザーがツールを構成できるように、これらのツールを使用するGUIを作成します。 、それらを設定し、進行状況を監視します。
ctrl-alt-delor

私が使用APIを問題だけが使用した簡単な言葉として。実際、毎回何度も答えを書き直しました。下層のコードや、API vs libs vs Frameworksなどの命名規則に慣れていない聴衆のためにそれを作りました。他のプロのソフトウェアエンジニア。問題をさらに明確にする投稿で編集したいものがある場合は、先に進んでください。
ismail

違反はありません。明確にしています。優れたプログラマーは、コマンドラインプログラムを呼び出すか、または呼び出さないかを決定します。決定は複雑さに基づき、場合によっては(速度を測定した後)効率に基づいて行われます。市場に販売する専門家の小さなグループの場合、プログラムを複雑にする必要があるかもしれません。コマンドラインプログラムを呼び出すことは、単純に思えます。したがって、書き換えが必要です。手数料またはフリーソフトウェアを行う場合、最も簡単に機能します。
ctrl-alt-delor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.