lsが重複したスイッチを受け入れるのはなぜですか?


16

私は好奇心が強い-との間に違いはls -lありls -lllllllllllllllllllllllllllllますか?

出力は同じように見え、lsスイッチの重複を許可する理由がわかりません。これはほとんどのコマンドの中で標準的な習慣ですか?

回答:


17

短い答え

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

長い答え:

ソースコードを見るとわかるように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フラグを使用して完了するには、より長い時間が必要です。しかし、今回は言及する価値はありません。=)


11
別の言い方をすれば、それらを拒否することは、プログラマーにとっては無視するよりも多くの作業になるでしょう。
マーク14

1
私が言いたいことを言って+0.5、ソースに行って+0.5。
CVn 14

21

それは正しいことだからです。次のようなスクリプトを実行したとします。

ls $LS_OPTIONS -l "$dir"

$LS_OPTIONS既に含まれている可能性があります-l。このコマンドがエラーを生成するのは直感に反し、迷惑であり、それを回避するにはスクリプトに追加のロジックが必要です。

-lこれが最良の例ではないかもしれませんが、願わくば、概念がどのように一般的に適用されるかを見ることができます。より良い例は$CFLAGS、コンパイラの特定の呼び出しで明示的なオプションを複製する可能性のあるコンパイラオプションです。


4
同じことがls、オプションのセットで呼び出すエイリアスを定義した場合にも発生する可能性があります。
カスペルド14

1
@kasperd:はい。パットが-lあなたにlsエイリアスが悪いアイデアだと思い、同じ問題は対話での素敵なオプションで発生すると思われるlsような別名-p--color=auto
R .. GitHub ICEのヘルプの停止ICE

1
エイリアスを呼び出す必要はありませんlsllはのエイリアスである可能性があり、そのエイリアスをls -l持つシステムでは、と入力する場合がありll -lartます。
カスペルド14

11

lsbashコマンドではなく、から起動する別の実行可能ファイルですbash。と-lは言っても、これは単なるブールフラグの一種であり、存在する場合lsは出力に長い形式の形式を使用します。ほとんどのプログラムは、このようなフラグの複数の使用(ls -llと同じls -l -l)を単に無視しますが、いくつかの例外があります(例として、-v「詳細」を意味する場合、プログラムは複数の使用を「さらに冗長」と解釈する場合があります)。


2
の例は-vvvですssh
ベルンハルト14

それともaptitude moo
ルスラン

8

のようなコマンドが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 -lls -llの問題ではありません、それは重大な方法で実行には影響しません。コンピューターは心を落ち着かせる繰り返しが得意です。
CVn 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.