我经常忘记用sudo
运行命令。我正在寻找一种方法来创建一个bash函数(或别名),以便重复上一个带有sudo
的命令。类似于:
S() {
sudo $(history 1)
}
有什么想法吗?
我经常忘记用sudo
运行命令。我正在寻找一种方法来创建一个bash函数(或别名),以便重复上一个带有sudo
的命令。类似于:
S() {
sudo $(history 1)
}
有什么想法吗?
还不够?
sudo !!
如果您想要 S
,只需简单地执行以下操作:
alias S=sudo
并使用它
S !!
!!
表示上一个命令
echo !! > script.sh
- FractalSpacealias S='sudo $(history -p !!)'
,然后只需输入 S
。 - Aaron Franke使用 alias redo='sudo $(history -p !!)'
。这是我找到的唯一适用于别名的方法。其他答案在别名中不起作用,尽管它们在直接运行时起作用。
alias r='eval sudo $(history -p !!)'
。 - alchemy!!
可用于引用最近一条命令,例如:
sudo !!
在Aaron Franke的回答基础上添加和扩展(回答是正确的,但缺乏一个为什么),这样只需输入redo
就可以在配置别名alias redo='sudo $(history -p !!)
后正常工作;
这是我发现与别名一起使用的唯一可行方法。
有几件事情需要解释。
alias redo='sudo !!'
由于它不执行sudo
部分,因此它无法正常工作,尽管它可以解决!!
。
为了使sudo !!
正确解析,必须执行一个shell解析指令并与sudo
连接。所以我们这样做:
alias redo='sudo $(history -p !!)'
$(history -p !!)
,这样做的目的是告诉shell:
redo
是一个别名,评估=
的右侧sudo
保持不变,并连接到...$()
是一个shell指令,用于在当前执行过程中执行内容(与子shell ${}
相反,后者会生成不同的进程来执行)history -p !!
!!
被扩展为history -p <lastCommandHere>
。-p
部分表示只打印结果,而不执行history
sudo
使用提升的特权执行剩余部分(现在在同一命令行上打印出来),假设密码已正确输入history -p !!
有效地写出了解决方案,而不是在sudo
之后执行。
注意:单引号'
是有意义的。如果使用双引号"
,!!
会被解析两次,为了达到我们的目的,我们需要非常小心地控制解析步骤;bash中的单引号和双引号
附言
如果您正在使用zsh
+oh-my-zsh
,则设置了一个sudo
别名,以便您可以执行以下操作:
_ !!
这将以sudo
重新运行上一个命令。然而,如果您正在~/.zshrc
中配置别名,则alias redo='sudo $(history -p !!)
将无法像从zsh配置中那样工作,因为解析步骤不同。
话虽如此,您可以将别名放入~/.bashrc
而不是~/.zshrc
,并在从zsh执行别名redo
时获得相同的结果(假设您从bash子shell zsh,尽管这有点笨拙-但是功能性的)。
thefuck
的软件包:https://github.com/nvbn/thefuck。它会尝试找出之前命令无法工作的任何原因并让其运行(例如使用sudo)。只需输入fuck
即可。 - slebetman