这是一个后续问题
如果你想重做相同的命令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 身份运行命令,而您没有机会查看即将执行的命令,这在我看来是一个非常糟糕的主意 - 特别是考虑到这样一个事实:当您拥有适用于所有命令的东西时最常见的情况可能会相当复杂。
因此,总而言之,我建议您不要尝试此类任何事情。