Command-Line

命令選項的優先級?

  • August 11, 2015

我知道這將在不提示我的情況下rm -f file1強制刪除。file1

我也知道rm -i file1刪除前會先提示我file1

現在,如果您執行rm -if file1,這也將file1在不提示我的情況下強制刪除。

但是,如果你執行rm -fi file1,它會在刪除之前提示我file1

那麼當組合命令選項時,最後一個將優先是真的嗎?like rm -if, then-f將優先,但 rm -fithen the-i將優先。

例如ls命令,你說ls -latRor都沒關係ls -Rtal

所以我想只有當你有矛盾的命令選項時才重要rm -if,對嗎?

rm同時使用-iand-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() 被重複呼叫,它會從每個選項元素中依次返回每個選項字元。

此函式通常在循環中呼叫,直到處理完所有選項。從這個函式的角度來看,選項是按順序處理的。 然而,實際發生的情況取決於應用程序,因為應用程序邏輯可以選擇檢測衝突選項、覆蓋它們或顯示錯誤。 對於rmandif選項,它們完美地相互覆蓋。來自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文件。

引用自:https://unix.stackexchange.com/questions/222372