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

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

プロンプトなしで強制rm -f file1的に削除されることを知っています。file1

rm -i file1また、削除する前にメッセージが表示されることもわかります。file1

今すぐ実行すると、メッセージも表示されず、強制rm -if file1的に削除されます。file1

ただし、を実行すると、rm -fi file1削除する前にメッセージが表示されますfile1

それでは、コマンドオプションを結合するときに最後のオプションが優先されますか? likeは優先権を持ちますが、rmはrm -if優先権を持ちます。-f-fi-i

たとえば、コマンドを話すとか、でもかまいませんlsls -latRls -Rtal

したがって、このように競合するコマンドオプションがある場合にのみ重要だと思いますrm -if。これは正しいですか?

答え1

オプションと一緒に使用すると、rm最初のオプションは無視されます。この内容は次のように記録されます。-i-fPOSIX基準:

    -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.

そしてGNUinfoページ:

‘-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() が繰り返し呼び出されると、各オプション要素の各オプション文字が連続して返されます。

この関数は通常、すべてのオプションが処理されるまでループで呼び出されます。この機能の観点から、オプションは順次処理されます。 ただし、実際に発生する状況はアプリケーションによって異なります。アプリケーションロジックは、競合するオプションを検出するか、それを上書きするか、エラーを表示するかを選択できるためです。rmiとオプションの場合は、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文書に準拠しています。

答え2

はい、rmこれがうまくいくからです。ただし、最後のオプションが前のオプションより優先されるかどうかは、個々のプログラム自体によって異なります。 「情報室」から

'-f' '--force' 存在しないファイルと不足しているオペランドを無視し、ユーザーにメッセージを表示しません。以前のすべての "--interactive"("-i") オプションは無視されます。

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

一般的なヒント:info通常よりも冗長でありman、それ自体は通常--helpoptionsよりも冗長です。

答え3

フラグには「優先順位」がなく、各プログラムは必要な方法でフラグを処理します。ほとんどの人は、すべてのフラグを収集し、衝突を確認するために少しの努力をrm(1)払うでしょう。特にテストされていません)。

プログラマがプログラムを書く最も簡単な方法は、パラメータ(フラグなど)を厳密に左から右の順序で考慮し、障害物に遭遇したときにそれを無視することです。フラグを処理するためにライブラリを使用している場合(たとえば、複数のバージョンを保持getopt(3))、プログラマーはおそらく最も簡単で自然な操作を実行します。プログラマーも人間であり、人間は怠惰です(または少なくとも組み合わせ爆発について考えるのは好きではありません)。

関連情報