プロンプトなしで強制rm -f file1
的に削除されることを知っています。file1
rm -i file1
また、削除する前にメッセージが表示されることもわかります。file1
今すぐ実行すると、メッセージも表示されず、強制rm -if file1
的に削除されます。file1
ただし、を実行すると、rm -fi file1
削除する前にメッセージが表示されますfile1
。
それでは、コマンドオプションを結合するときに最後のオプションが優先されますか? likeは優先権を持ちますが、rmはrm -if
優先権を持ちます。-f
-fi
-i
たとえば、コマンドを話すとか、でもかまいませんls
。ls -latR
ls -Rtal
したがって、このように競合するコマンドオプションがある場合にのみ重要だと思いますrm -if
。これは正しいですか?
答え1
オプションと一緒に使用すると、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.
そして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.
後ろで何が起こるのか見てみましょう:
rm
getopt(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
文書に準拠しています。
答え2
はい、rm
これがうまくいくからです。ただし、最後のオプションが前のオプションより優先されるかどうかは、個々のプログラム自体によって異なります。 「情報室」から
'-f' '--force' 存在しないファイルと不足しているオペランドを無視し、ユーザーにメッセージを表示しません。以前のすべての "--interactive"("-i") オプションは無視されます。
'-i' は、各ファイルを削除するかどうかを尋ねるメッセージを表示します。応答が肯定的でない場合は、ファイルをスキップします。以前のすべての "--force"("-f") オプションは無視されます。 "--interactive=always" と同じです。
一般的なヒント:info
通常よりも冗長でありman
、それ自体は通常--help
optionsよりも冗長です。
答え3
フラグには「優先順位」がなく、各プログラムは必要な方法でフラグを処理します。ほとんどの人は、すべてのフラグを収集し、衝突を確認するために少しの努力をrm(1)
払うでしょう。特にテストされていません)。
プログラマがプログラムを書く最も簡単な方法は、パラメータ(フラグなど)を厳密に左から右の順序で考慮し、障害物に遭遇したときにそれを無視することです。フラグを処理するためにライブラリを使用している場合(たとえば、複数のバージョンを保持getopt(3)
)、プログラマーはおそらく最も簡単で自然な操作を実行します。プログラマーも人間であり、人間は怠惰です(または少なくとも組み合わせ爆発について考えるのは好きではありません)。