私はこれを見回しましたが、それについて何も見つかりません。
いつも気になりました。他のほとんどの組み込みbashコマンドに-flag arg1 arg2コマンド形式(cp -r dir1 / dir2 /など)があるのはなぜですか?ただし、ここで find コマンドは、何らかの方法で 2 つの引数の間にフラグを入れます。 ?
find path/ -name pattern
これは私にとって一貫性がなく、覚えにくいです。妥当な理由はありますか?私が知らないどんなコンベンションがありますか?
答え1
コマンドが最初に表示され、一貫性が後で追加されます。
最初に見つけることができるマンページは次のとおりです。
find
パス名式
find
1970年代から、順序と構文(オプションにダッシュが必要かどうか)に関する仮定がさまざまなコマンドに追加されました。〜の後(例:1980年代後半および1990年代初め)ユーザーはさまざまなコマンドの構文を覚えておくのに役立ちます。たとえば、 の場合、find
開発者はいくつかの不一致を認識するようになりました。
間違い
デバイスの種類を確認できません。
構文は次のとおりです。もし。
したがって、正解は、コマンドが元の開発者にとって意味があり、主な変更が適用されなかったことです。
答え2
いくつかのことを混同しているようです。 Shellも組み込み関数ではfind
ありません。cp
コマンドの唯一のパラメータはパスでfind
あり、残りはオプションとその値ですが、これは単なる意味であり、ここでは違いはそれほど重要ではありません。さらに重要なのは、オプションフラグには2つのカテゴリがあることです。主張を受け入れる者と受け入れない者。最も一般的な形式は次のとおりです。
command -flag flagValue
多くのプログラムは単一文字フラグ(command -f
)を使用しますが、多くのプログラムは単一文字と長いオプションの両方を使用します(たとえば、ほとんどすべてのGNUツール)。cp
これが有効なコマンドだと言われましたcp
。
cp -dR --preserve=all -i --dereference foo bar baz/
通常、最も一般的な「標準」形式は実際には次のとおりです。
command -flag1 -flag2 value1 -flag3 value2 ARGUMENTS
つまり、多くのフラグは単純なブール値ではなく、値を持つこともできます。検索も例外ではありません。cp
引用したフラグの場合も同様です。
cp -t /foo -u file1 file2 fileN
したがって、ほとんどのコマンドは正しく構成されておらず、command -flag arg1 arg2
実際には正反対です。それは単に使用されたフラグに依存します。開発者がなぜこの特定の形式を選択したのかについては、find
開発者に尋ねる必要があるようです。
答え3
find
cpio
ほとんどの元のUnixユーティリティの作成者ではなく、Dick Haightが作成しました。当時、ライブラリにリンクできるコマンドライン引数の解析ライブラリがなかったため、一貫性を強制/インセンティブ化できました(80年代半ばにはgetopt
複数のシステムにソースコードがありました)。
人々がスクリプトでコマンドとその引数を使用すると、既存の関数の構文を変更することは困難です。
答え4
find
オプションによって制御される単純なコマンドではなく、独自の制御言語を実装したコマンドです。
CLIはfind
次のとおりです。
find [options] path1..pathn [expression]
-H
ここで、-L
と同じオプションが使用-P
されます。expression
find control language
:のような引数は基本演算子であり、完全な式はそのようなフィルタと演算の数学的説明と考えることができるため-name
呼び出されます。primaries
-print
-exec
find command language
非常に強力ですが、まだ学習しやすい言語です。ディレクトリツリーをナビゲートし、従来のUNIXコマンドラインオプションのみを使用して動作を達成しようとするプログラムは、一般的に弱く学習するのが難しいです。例えばGNU tar
対。 star
(後者はfind command language
。