プロンプトなしで強制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
文書に準拠しています。