コマンドオプションの優先順位は?


21

私はそれを促さずにrm -f file1強制的に削除するfile1ことを知っています。

また、rm -i file1削除する前に最初にプロンプ​​トが表示されることも知っていますfile1

ここでを実行するとrm -if file1、これもfile1私に確認せずに強制的に削除されます。

ただし、実行するとrm -fi file1、を削除する前にプロンプ​​トが表示されますfile1

コマンドオプションを組み合わせるとき、最後のオプションが優先されるのは本当ですか?以下のようにrm -if、その後、-f優先されますが、RM -fi、その後-i優先されます。

lsあなたが言った場合例えばコマンドが、それは問題ではありませんls -latRls -Rtal

だからrm -if、のような矛盾したコマンドオプションがある場合にのみ問題になると思います、それは正しいですか?


回答:


23

使用している場合rmの両方で-i-f オプション、最初のものが無視されます。これはPOSIX標準に文書化されています。

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

また、GNU infoページ:

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

内部で何が起こるか見てみましょう:

rmgetopt(3)、特にでオプションを処理しますgetopt_long。この関数は、コマンドライン(**argv)のオプション引数を出現順に処理します:

getopt()が繰り返し呼び出されると、各オプション要素から各オプション文字が連続して返されます。

この関数は通常、すべてのオプションが処理されるまでループで呼び出されます。この機能の観点から、オプションは順番に処理されます。 ただし、アプリケーションロジックは競合するオプションの検出、オーバーライド、またはエラーの表示を選択できるため、実際に起こることはアプリケーションに依存します。 以下の場合にはrm及びi及びfオプション、彼ら完全に上書きお互い。からrm.c

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

両方のオプションは同じ変数を設定し、これらの変数の状態はコマンドラインの最後のオプションになります。これの効果は、POSIX標準とrmドキュメントに沿っています。


3
ほとんどのコマンドは引数を順番に処理し、競合時にエラーを発生させるか、最後の設定(などrm)を使用します。コマンドがオプションの最初の設定を取得し、すでに設定されているオプションを変更する引数を無視することはまれだと思います。
ピーターコーデス

7

はい、rmこれは有効です。ただし、最後のオプションが以前のオプションをオーバーライドする場合は、個々のプログラム自体に依存します。「info rm」から

'-f' '--force'存在しないファイルと欠落しているオペランドを無視し、ユーザーにプロンプ​​トを表示しません。以前の '--interactive'( '-i')オプションを無視します。

'-i'各ファイルを削除するかどうかを尋ねます。応答が肯定的でない場合、ファイルはスキップされます。以前の「--force」(「-f」)オプションを無視します。「--interactive = always」と同等です。

一般的なヒントとして:info通常man、それ自体は--helpオプションよりも詳細です。


7

フラグには「優先順位」はなく、各プログラムはフラグを希望どおりに処理します。ほとんどの場合、すべてのフラグを収集して競合をチェックするための努力を行います。標準ツール(参照先などrm(1))の場合、関連する標準が何かを命じる可能性があります(ただし、特定のバージョンは、標準のコーナーケースの解釈が粗雑であるか、特にテストされていない可能性があります)彼らのために)。

プログラムを作成するプログラマーにとって、左から右への厳密な順序で引数(フラグなど)を検討するのが最も簡単です。ライブラリを使用してフラグを処理する場合(などgetopt(3)、いくつかのバージョンがあります)、プログラマはおそらく最も簡単/自然なことをします。プログラマーは人間であり、人々は怠け者です(または、少なくとも組み合わせの爆発を通して考えるのが好きではありません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.