我经常忘记使用sudo
运行命令。我正在寻找一种方法来使用sudo
重复最后一个命令的bash函数(或别名)。类似的东西:
S() {
sudo $(history 1)
}
有什么想法吗?
答案 0 :(得分:108)
答案 1 :(得分:23)
还不够吗?
sudo !!
如果您希望简单地放置S
:
alias S=sudo
并使用它
S !!
!!
表示last command
答案 2 :(得分:15)
使用alias redo='sudo $(history -p !!)'
。这是我唯一的事情
发现可以使用别名。由于某些原因,其他答案在别名中不起作用,自己尝试过,即使它们在直接运行时也能正常工作。
答案 3 :(得分:14)
!!
可用于引用最后一个命令。所以:
sudo !!
答案 4 :(得分:2)
根据aaron franke的响应进行添加和扩展(这是正确的,但缺少为什么),因此在配置别名redo
之后只需键入alias redo='sudo $(history -p !!)
;
这是我发现唯一可以使用别名的东西
有一些事情需要解释。
alias redo='sudo !!'
无效,因为它确实解决了sudo
,但它没有执行!!
部分。
要使sudo !!
正确解析,必须执行外壳解析指令并将其与sudo
并置。我们这样做;
alias redo='sudo $(history -p !!)'
通过为$(history -p !!)
指定别名的右侧,这就是对shell的说明;
redo
是别名,请评估=
sudo
保持原样,并连接到... $()
是一个shell指令,用于在当前执行过程中执行内容(与子shell ${}
相对,后者将在其中执行另一个过程)history -p !!
!!
扩展到history -p <lastCommandHere>
。-p
部分告诉history
仅打印结果,不执行sudo
将以提升的特权执行其余的(现在已打印在同一命令行上)这最终意味着命令history -p !!
有效地写出了分辨率,而不是在sudo
之后执行。
注意:'
很重要。如果您使用"
,则!!
会被插值两次,并且要实现我们的目的,我们需要非常小心地控制分辨率的步骤; single/double quotes in bash
PS
如果您使用的是zsh
+ oh-my-zsh
,则会为sudo
设置一个_
别名,以便您可以这样做;
_ !!
这将以sudo
重新运行最后一个命令。但是,如果要在~/.zshrc
中配置别名,则alias redo='sudo $(history -p !!)
将无法从zsh配置中正常使用,因为解析步骤不同。
也就是说,您可以将别名放入~/.bashrc
中而不是~/.zshrc
中,并在zsh中执行别名redo
时得到相同的结果(假设您从bash,尽管公认这有点麻烦-尽管是功能性的)。