Answers:
!!
运行您之前的命令history
。此外,执行!-1
,!-2
等等将执行您的最后一个命令,第二个最后一个命令,依此类推。便利!
!<command>
~/.bash_history
<command>
!
从那里复制的这种愚蠢的bash东西使tcsh
我搞砸了很多次,比以往任何时候都有用。双引号不能避免对的解释!
。 $ foo "!bar"
-> !bar: event not found
。
答案:您sudo !!
随后直接输入即可以提升的权限重复上一个命令。
您可以尝试使用向上箭头键滚动浏览您的旧命令,然后重写/更改它们并sudo
在其前面添加。(箭头键上方的主页按钮会将位置设置为开头。)
我不喜欢这个sudo !!
主意,因为有时您在两者之间添加了另一个命令,并且不再记得了。
sudo !!
,shell将会展开,!!
以便您可以看到它正在尝试运行的命令。因此,按Ctrl-C并找到正确的命令可能会很烦人,但至少不会让您无所适从。
!!
sudo !!<TAB>
自动完成!!
。Bash可以扩展历史记录M-^
(对于我来说,是alt + shift + 6),但这不太流畅(不过,您可以重新绑定它)。也有shopt -s histverify
,它使您在使用历史记录扩展并按Enter键时,它会为您提供另一条提示行,其中包含执行的扩展以让您查看/编辑它。
shopt -s histverify
。大多数人会习惯于Enter
两次击打。到那时,他们仍然来不及检查发生了什么。
我将添加一个替代方法:键入短sudo !!
而灵活:
Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A (place cursor at beginning of line)
"sudo "
Enter
它的击键次数完全相同(我将“ ctrl + A”算作一个键...),但是添加“向上箭头”后,您就可以使用历史记录中的任何命令来执行此操作。
set -o vi
)。然后您可以转义(进入命令模式),然后是“ I”(大写的“ i”,在行首插入)。
这个问题本来可以概括为“ 运行相同的命令,但要进行一些修改 ”,因为Unix中一项出色的设计决策是,在shell中实现一次的内容可以被从shell调用的任何命令所利用。
换句话说,这一招并不适用刚刚 于sudo
:
sudo !!
)重复上一个命令time !!
)env A=b B=z !!
)中重复上一个命令!!
)历史记录扩展(也称为历史记录替换)只是一个shell功能,可以使重复以前的命令更加容易(击键次数更少)。检查您的Shell手册页中的history expansion
。它描述了您可以使用历史记录进行操作的更多技巧和捷径,例如:
您可以按编号参考以前的命令:
!55 # repeat command number 55
!-1 # repeat the previous command, alias for !!
!-2 # repeat the command before the previous command
您可以在先前的命令中引用单个单词:
some-command !$ # run some-command on the last arg of previous command
您还可以在重复之前进行搜索:
!?awk # repeat the last command including the string 'awk'
您可以搜索历史记录,并用其他内容代替:
!?awk?:s/str1/str2/ # repeat previous command matching 'awk' replacing str1 by str2
还有更多功能,因为您可以将命令选择,arg选择,搜索和替换独立组合在一起。
您的shell手册页(在本例中为man bash
)是您的朋友。
我使用zsh而不是bash并将其放在我的~/.zshrc
,因此在命令行开头按Alt+ S插入sudo
:
insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo
不幸的是,我无法找到在bash中执行相同操作的方法。
如果要使用别名,则alias redo='sudo $(history -p !!)'
出于某种原因必须使用。
我喜欢的方式:
但是只执行“ sudo !!”可能会更容易,这取决于您。