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()
プログラムに与えられたすべての引数を読み込みます。変数が設定されている場合-l
。format
したがって、複数回入力すると-lllllllll
変数が複数回設定されますが、これは何も変更しません。
まあ、一つのことが変わりました。複数のフラグがあるため、この巨大なスイッチケースステートメントは複数回実行する必要があります-l
。ls
複数の標識を完了するのに時間がかかります-l
。しかし、今回は言及する価値はありません。 =)
答え3
ls
bash
コマンドではありません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
。
したがって、これらのコマンドは、後のフラグが前のフラグを上書きするようにするためのものです。