使用 !! 的命令的别名调用最后一个命令

使用 !! 的命令的别名调用最后一个命令

这是一个后续问题

用一个 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 身份运行命令,而您没有机会查看即将执行的命令,这在我看来是一个非常糟糕的主意 - 特别是考虑到这样一个事实:当您拥有适用于所有命令的东西时最常见的情况可能会相当复杂。

因此,总而言之,我建议您不要尝试此类任何事情。

相关内容