我怎样才能`alias sudo !!`?

我怎样才能`alias sudo !!`?

sudo !!我正在尝试在 Bash 中设置别名。我尝试过alias sbb='sudo !!',但它将其解释为文字 !!并打印

sudo: !!: command not found

如果我使用双引号,它会替换字符串本身中的双感叹号,因此这是行不通的。

有什么办法可以让这个工作吗?或者另一个别名? `

答案1

!!当您键入它时,它会被 bash 扩展。它不会通过别名替换进行扩展。

您可以使用history内置进行扩展:

alias sbb='sudo $(history -p !!)'

如果命令不仅仅是一个简单的命令(例如它包含重定向或管道),您需要在 sudo 下调用 shell:

alias sbb='sudo "$BASH" -c "$(history -p !!)"'

答案2

尝试:

alias sbb='sudo $(fc -ln -1)'

我实际上更喜欢将其命名为“请”:

alias please='sudo $(fc -ln -1)'

信息:fc是 bash shell 中的内置命令。它列出、编辑和重新执行先前输入到交互式 shell 的命令。

!!Zsh 与和 别名也有类似的问题,并且fc -ln -1也可以在那里工作。尽管有关在 sudo 命令行内获取重定向和其他 shell 语法的注意事项适用,因此您可能希望将命令包装在 shell 调用或中eval,请参阅@rici的回答

答案3

现在 GitHub 上有一个用于此目的的存储库,它神奇地检查它是否需要超级用户权限,还修复了拼写错误:

https://github.com/nvbn/thefuck

答案4

这最初发布于问题,但后来建议在这里发帖。

以下是如何将fcandhistory与别名一起使用来进行!-类似的替换。假设您想使用!-n(其中n是最后使用的第 n 个命令的数字,那么您可以将fcandhistory与别名一起使用,如下所示:

  1. 使用history:

    alias xyz='echo $(history -p "!-<n>") ; sudo $(history -p "!-n")'
    

    注意:这里!-n应该用'或括起来''

  2. 使用fc:

    alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)'
    

    注意:这里的1st2nd用于 -n指定历史列表的范围。

在这里,我在执行命令之前使用了 echo-ing 来感觉像!-<n>.

相关内容