
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
スクリプトで使用したいものと非常によく似ています(1、2)、必要なときだけ見積もりをしてくださいまたはストリームを横切って(ほぼ文字通り、stdinを使用して完全に直交する2つの項目を処理します)。これは悪い考えです。
このアプローチにはいくつかの問題があります。
- あなたのツールはすべてを処理する必要があります拡大するシェルはすでにこれを処理しています:
- 支柱の拡張
- チルダ拡張
- パラメータと変数の拡張
- コマンドの置き換え
- 算術拡張
- 噴射
- ワイルドカード文字を含むファイル名の拡張@StephenHarrisが指摘したように
- ツールが拡張機能を処理できない場合(あなたが提案したように単一のパラメータとして扱われないように明確にトークン化する必要があるあなたが提供した例とは異なり、開発者はその理由を詳細に説明し、期待どおりに実行する必要があります
-l fetch.png
。-l "$path"
-l ~/Downloads
-l 'my files'
- あなたのツールが処理するときシェル以外の拡張(シェルは拡張を異なる方法で処理し、実行中のシェルを誰も検出して永久にサポートできないためです。)ツールを使用するたびに学び、覚えておく必要がある新しい構文を追加しました。
- 標準入力はもはや単純なツール入力ではありません。に基づいてUnixの哲学、他のツールは入力をツールに渡すために特別なタスクを実行する必要があるため、他のツールと連携しなくなります。
- すでに合意されていますすべての主要なツール。この根本的な方法で習慣を破ることは、次の点で非常に悪い考えです。妥当性。
- ミキシングオプションと入力できないこれはすべての入力に対して安全に実行できます。そのうちの1つをエンコードまたはエスケープするためにかなりの追加の努力をしない限り。
答え2
多くのコマンドは通常標準入力からデータを取得するため、コマンドはこれを実行しません。標準入力がオプションとデータの混合である場合、状況は複雑になり危険になります。
答え3
これは非常にUnixプログラムが標準入力でコマンドラインオプションを受け入れることは一般的ではありません。
Unixの世界では、ファイル名拡張子(「globbing」)はアプリケーションではなく呼び出しシェルによって実行されるため、実際に動作が変わります。
たとえば、次のようls *.c
にするとシェル*.c
に拡張されるfile1.c
file2.c
ので実際に実行されるのはですls file1.c file2.c
。
標準入力に値があると、プログラムはそれを拡張します。
だから...一般的ではないだけでなく、一般的に良い考えではありません。
プログラムがデータ損失を引き起こすことは珍しいことではありません。
例えば
#!/bin/bash
filename=$1
if [ -z "$filename" ]
then
read -p Filename: filename
fi
ただし、これは標準入力からコマンドラインオプションを取得するのとは異なります。