題 如何減去一個減號?


當我忘記引號時,我的早晨咖啡還沒有到達我的大腦:

alias grep="grep --color=always"

所以改為我打字:

alias grep=grep --color=always

離開我:

--color=always
grep=grep

在我的別名中。

當我嘗試清理--color =總是使用 unalias --color 我明白了:

bash: unalias: --: invalid option
unalias: usage: unalias [-a] name [name ...]

我試圖逃避,引用和乞討,但我無法弄清楚如何使突擊隊unalias清理混亂。

(我知道重啟將會成功,但肯定會有另一種方式)


83
2018-03-02 10:01


起源


哈哈,現在我也把它卡在我的腦子裡,正在編寫它編輯:看起來choroba的答案對我有用 - asmith
有點讓我想起舊的 echo > \\?\c:\windows\x.或者那個時候我 rm -rf * ~ 意外地。 - Jason C


答案:


您可以通過添加來避免POSIX兼容系統在命令中解釋破折號 -- 在任何爭論之前。

mtak@frisbee:~$ alias grep=grep --color=always
mtak@frisbee:~$ alias | grep color
alias --color='always'

mtak@frisbee:~$ unalias -- --color
mtak@frisbee:~$ alias | grep color
mtak@frisbee:~$

這也適用於其他實用程序,假設您有一個名為的文件 -bla。如果您嘗試將其刪除 rm 您將收到以下錯誤:

mtak@frisbee:~$ ls -- -bla
-bla
mtak@frisbee:~$ rm -bla
rm: invalid option -- 'b'
Try 'rm ./-bla' to remove the file '-bla'.
Try 'rm --help' for more information.

通過使用 -- 在文件名之前,您將刪除該文件:

mtak@frisbee:~$ rm -- -bla
mtak@frisbee:~$ ls -- -bla
ls: cannot access '-bla': No such file or directory

128
2018-03-02 10:07



雖然值得注意的是,對於文件,同樣有效的方法是使用文件的路徑來避免這種情況;所以你可以使用 ls ./-bla 和 rm ./-bla (或指定完整路徑,在您的情況下更容易)。顯然這對於別名不起作用! - Muzer
pubs.opengroup.org/onlinepubs/009695399/basedefs/... 準則10 - DarkHeart


只需使用您用來設置別名的相同技巧

unalias whatever --color

94
2018-03-02 10:03



確實工作,+ 1但另一個解決方案有點清潔:) - Requist
的確,當然:-) - choroba
unalias unalias --color - Cœur


快速解決方案

修理  您可能只是運行錯誤的別名

unalias grep --color


了解發生了什麼

你給錯了命令 alias grep=grep --color=always 無 "..."

  • 你設置了兩個別名  --color 和 grep;實際上你可以在輸出的左側讀取它(全部在左側) = 是一個別名命令):

    --color=always
    grep=grep
    

    所以你需要取消兩者。

  • 為什麼會這樣?
    ... 在別名的概要中意味著可以在一行中進行多個賦值:

    別名:別名[-p] [name [= value] ...]

    在輸出中 help alias 你可以閱讀摘要但來自 man bash 您可以在同一行讀取,甚至可以同時列出和分配:

    提供參數時, 為每個給出其值的名稱定義別名。  當別名展開時,值的尾隨空格會導致檢查下一個單詞的別名替換。 對於沒有提供值的參數列表中的每個名稱,將打印別名的名稱和值... 

  • 你有問題要取消第一個 --color 單獨
    這是因為 它被解釋為選項 對於 alias 你的外殼;要避免這種情況,你需要與你溝通 bash shell後面的內容不是一個選項。

  • 聖杯 Linux: man, 在這種情況下 man bash 這是一個充滿寶藏的保險箱,在這種情況下很有用。
    你可以閱讀 man bash

    - A - 表示選項結束並進一步禁用   期權處理。 - 之後的任何參數都被視為文件名   和論點。 - 的參數相當於 - 。

    正如在其他答案中所報導的那樣,POSIX方式是使用特殊字符組合 --

    unalias -- --color
    
  • 為什麼 unalias grep --color 工作中? 我的意思是沒有使用 --
    因為它的工作原理 alias 即使是 unalias 一次可以給出多個名字(同樣是 [...])。

    unalias: unalias [-a] name [name ...]
    

    我只能給出一個猜測:良好的編程習慣是在同一邏輯下同時編寫讀寫例程。所以它必須是解析例程的選項 alias 和 unalias

    即使從這個命令(從為此目的打開的shell)中你也可以看到它不會刪除所有別名:

    unalias whatever -a
    

最後的評論

在BUGS部分 man bash 在你報導的幾件事中你可能會讀到 :-)

別名在某些用途中令人困惑。


3
2018-03-06 10:55