這是一個後續問題
如果你想重做相同的命令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 身份運行命令,而您沒有機會查看即將執行的命令,這在我看來是一個非常糟糕的主意 - 特別是考慮到這樣一個事實:當您擁有適用於所有系統的東西時最常見的情況可能相當複雜。
因此,總而言之,我建議您不要嘗試此類任何事情。