stdin入力には同様のオプションがありますが、なぜコマンドライン引数は一般的ではありませんか?

stdin入力には同様のオプションがありますが、なぜコマンドライン引数は一般的ではありませんか?

POSIXとGNUには、そのオプションの構文スタイルがあります。私が見たすべてのコマンドに対して、コマンドライン引数としてオプションに似た入力を許可します。

getoptプログラムがstdinからオプションのような入力を受け入れるのはまれですか(したがって、オプションなどのstdin入力を解析するために使用されますか?)。それは次のとおりです。

$ ls -l 
-rw-rw-r-- 1 t t 31232 Jan  7 13:38 fetch.png
-rw-rw-r-- 1 t t 69401 Feb  6 14:35 proxy.png
$ myls
> -l  
-rw-rw-r-- 1 t t 31232 Jan  7 13:38 fetch.png
-rw-rw-r-- 1 t t 69401 Feb  6 14:35 proxy.png
> -l fetch.png
-rw-rw-r-- 1 t t 31232 Jan  7 13:38 fetch.png

stdin入力には同様のオプションがありますが、なぜコマンドライン引数は一般的ではありませんか?

表現力の観点から、入力のような非オプションと入力のようなオプションは同じですか(一般言語と文脈のない言語に似ています)

シェル拡張のようなことが標準入力入力(オプションでない場合)で発生することを期待したり必要としないため、シェル拡張を強調しません。

ありがとうございます。

非オプション(入力など)に関する同様の質問:https://stackoverflow.com/questions/54584124/how-to-parse-non-option-command-line-arguments-and-stdin-inputs(この記事はコメントと反対表の不足で削除されました。ただし、評判が良ければ、ご覧になれます。)

ベストアンサー1

tl;drこれはlsスクリプトで使用したいものと非常によく似ています(12)、必要なときだけ見積もりをしてくださいまたはストリームを横切って(ほぼ文字通り、stdinを使用して完全に直交する2つの項目を処理します)。これは悪い考えです。

このアプローチにはいくつかの問題があります。

  1. あなたのツールはすべてを処理する必要があります拡大するシェルはすでにこれを処理しています:
    • 支柱の拡張
    • チルダ拡張
    • パラメータと変数の拡張
    • コマンドの置き換え
    • 算術拡張
    • 噴射
    • ワイルドカード文字を含むファイル名の拡張@StephenHarrisが指摘したように
  2. ツールが拡張機能を処理できない場合あなたが提案したように単一のパラメータとして扱われないように明確にトークン化する必要があるあなたが提供した例とは異なり、開発者はその理由を詳細に説明し、期待どおりに実行する必要があります-l fetch.png-l "$path"-l ~/Downloads-l 'my files'
  3. あなたのツールが処理するときシェル以外の拡張(シェルは拡張を異なる方法で処理し、実行中のシェルを誰も検出して永久にサポートできないためです。)ツールを使用するたびに学び、覚えておく必要がある新しい構文を追加しました。
  4. 標準入力はもはや単純なツール入力ではありません。に基づいてUnixの哲学他のツールは入力をツールに渡すために特別なタスクを実行する必要があるため、他のツールと連携しなくなります。
  5. すでに合意されていますすべての主要なツール。この根本的な方法で習慣を破ることは、次の点で非常に悪い考えです。妥当性。
  6. ミキシングオプションと入力できないこれはすべての入力に対して安全に実行できます。そのうちの1つをエンコードまたはエスケープするためにかなりの追加の努力をしない限り。

おすすめ記事