lsが冗長スイッチを許可するのはなぜですか?

lsが冗長スイッチを許可するのはなぜですか?

ls -l気になります。との違いがありますかls -lllllllllllllllllllllllllllll

出力は同じようですが、lsなぜ冗長スイッチが許可されるのか混乱しています。これはほとんどのコマンドで標準的な慣行ですか?

答え1

なぜなら、それが正しいことだからです。次のようなスクリプトがあるとしましょう。

ls $LS_OPTIONS -l "$dir"

$LS_OPTIONSこのコマンドがエラーを生成することは直観に反して迷惑なこと-lであり、これを防ぐためにスクリプトに追加のロジックを追加する必要があります。

-l最良の例ではないかもしれませんが、この概念が一般的にどのように適用されるかについてのアイデアを得ることを願っています。より良い例はコンパイラオプションです。これは、$CFLAGS特定のコンパイラ呼び出しで明示的なオプションを繰り返すことが可能であるためです。

答え2

短い答え:

フラグの複数の使用を無視するようにプログラムされているからです。

長い答え:

あなたのようにソースコードその中には機能と巨大なスイッチボックスが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()プログラムに与えられたすべての引数を読み込みます。変数が設定されている場合-lformatしたがって、複数回入力すると-lllllllll変数が複数回設定されますが、これは何も変更しません。

まあ、一つのことが変わりました。複数のフラグがあるため、この巨大なスイッチケースステートメントは複数回実行する必要があります-lls複数の標識を完了するのに時間がかかります-l。しかし、今回は言及する価値はありません。 =)

答え3

lsbashコマンドではありませんbash。つまり、存在する場合、出力が長いスタイル形式で出力されるように-lするブールフラグだけです。lsほとんどのプログラムはこれらのフラグ(ls -llと同じls -l -l)の複数の使用を単に無視しますが、いくつかの例外があります(たとえば、-v「詳細」を意味する場合、プログラムは複数の使用を「より詳細な」と解釈できます)。

答え4

lsこのようなコマンドが繰り返されるオプションを許可しない場合、シェルエイリアスは非常に迷惑になる可能性があります。

あなたが持っていると仮定

alias ls='ls --color=auto'
alias rm='rm -i'

これにより、競合するフラグが許可されていない場合ls --color=neverなどのls --color=autoコマンドを実行するとエラーになりますrm -i

したがって、これらのコマンドは、後のフラグが前のフラグを上書きするようにするためのものです。

関連情報