使用 !! 的命令的別名呼叫最後一個命令

使用 !! 的命令的別名呼叫最後一個命令

這是一個後續問題

用一個 sudo 執行一行指令

如果你想重做相同的命令sudo !!執行如下命令後:

echo "something">/path/file

您可以使用全域替換語法來呼叫該命令:

!!:gs/>/|sudo tee -a /

在後面使用一個空格-A範圍。

這相當於須藤!但可以幫助您繞過 < 和 > 的 sudo 限制。因為 sudo 不允許使用 [<, >]。

我如何將其放入我的別名中.bashrc以便我可以簡單地使用它?

我試過

alias redo='!!:gs/>/|sudo tee -a /'

但這不起作用,我收到錯誤:

$ echo "sdfdsf">/path/file
bash: /path/file: no permissions

$ redo
bash: /: Is a directory
tee: /: Is a directory

答案1

我認為您正在尋找的是:

sudo sh -c "!!"

這將轉換!!為您的最後一個命令並保持 shell 重定向/管道/變數的功能:

➜  ~  ping 10.0.0.1
--- 10.0.0.1 ping statistics ---
6 packets transmitted, 3 received, 50% packet loss, time 5001ms
rtt min/avg/max/mdev = 1.736/1.951/2.182/0.185 ms
➜  ~  sudo sh -c "!!" ## And becomes like this:
➜  ~  sudo sh -c "ping 10.0.0.1"

答案2

不完全是您問題的答案,但是:不要這樣做。

這個別名背後的想法(假設它有效)是轉換>|tee -a foo是一個好主意。首先,即使在最好的情況下,它們也不等同。 >將覆蓋文件,tee -a將追加。

其次,這不處理常見的構造,例如echo >>foo(將被轉換為echo |sudo tee -a |sudo tee -a foo並失敗)或echo 2>&1(將被轉換為echo 2|sudo tee -a &1並失敗)。

現在,您也許可以編寫一個更複雜的替換來合理地處理所有這些情況,但這引出了我的第三點:

這將以 root 身份運行命令,而您沒有機會查看即將執行的命令,這在我看來是一個非常糟糕的主意 - 特別是考慮到這樣一個事實:當您擁有適用於所有系統的東西時最常見的情況可能相當複雜。

因此,總而言之,我建議您不要嘗試此類任何事情。

相關內容