回答:
短い答え:
フラグの複数の使用を無視するようにプログラムされているためです。
長い答え:
のソースコードを見るとわかるようにls
、機能getopt_long()
と大きなスイッチケースを備えた部分があります。
1648 int c = getopt_long (argc, argv,
1649 "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650 long_options, &oi);
....
1654 switch (c)
1655 {
....
1707 case 'l':
1708 format = long_format;
1709 break;
....
1964 }
この関数getopt_long()
は、プログラムに指定されたすべてのパラメーターを読み取ります。-l
変数format
が設定されている場合。したがって、複数入力する-lllllllll
と、その変数は複数回設定されますが、何も変更されません。
まあ、それは一つのことを変えます。複数の-l
フラグがあるため、この巨大なswitch caseステートメントは複数回実行する必要があります。ls
複数の-l
フラグを使用して完了するには、より長い時間が必要です。しかし、今回は言及する価値はありません。=)
それは正しいことだからです。次のようなスクリプトを実行したとします。
ls $LS_OPTIONS -l "$dir"
が$LS_OPTIONS
既に含まれている可能性があります-l
。このコマンドがエラーを生成するのは直感に反し、迷惑であり、それを回避するにはスクリプトに追加のロジックが必要です。
-l
これが最良の例ではないかもしれませんが、願わくば、概念がどのように一般的に適用されるかを見ることができます。より良い例は$CFLAGS
、コンパイラの特定の呼び出しで明示的なオプションを複製する可能性のあるコンパイラオプションです。
ls
、オプションのセットで呼び出すエイリアスを定義した場合にも発生する可能性があります。
-l
あなたにls
エイリアスが悪いアイデアだと思い、同じ問題は対話での素敵なオプションで発生すると思われるls
ような別名-p
か--color=auto
。
ls
。ll
はのエイリアスである可能性があり、そのエイリアスをls -l
持つシステムでは、と入力する場合がありll -lart
ます。
のようなコマンドがls
オプションの繰り返しを許可しない場合、シェルエイリアスはかなり面倒です。
あなたが持っていたと仮定します
alias ls='ls --color=auto'
alias rm='rm -i'
矛盾フラグが許されなかった場合はその後、のようなコマンドを発行するとエラーになるls --color=never
か、ls --color=auto
またはrm -i
。
したがって、これらのコマンドは、後のフラグが前のフラグをオーバーライドできるように設計されています。
--inplace
でrsyncを試してください--delay-updates
。)一部のツールは、最後に来るものをすべて取得します。rm -if
おそらく良い例です。しかし、そこのlsの-lオプションには競合が故に、ではないls -l
とls -ll
の問題ではありません、それは重大な方法で実行には影響しません。コンピューターは心を落ち着かせる繰り返しが得意です。