您不能仅仅停留sudo
在shell命令的前面,还必须调用shell来再次评估该命令(执行诸如扩展变量,为重定向操作符打开文件等操作)。所以那是
sudo bash -c !!
但这不是很有效,因为它会!!
插入上一个命令的文本,特殊字符以及所有字符。您需要以字符串形式检索命令文本,并将其作为参数传递给sh
。幸运的是,bash的fc
内置功能使您可以做到这一点¹。
sudo bash -c "$(fc -ln -1)"
甚至,要确保调用当前正在运行的相同版本的bash:
sudo "$BASH" -c "$(fc -ln -1)"
请注意,由于该命令是在单独的Shell进程中执行的,因此它继承了环境变量(请注意,仅继承sudo
保留的变量),而不继承Shell内部变量。Shell选项(例如kshglob
)和其他设置将从默认值开始。
尽管ATT ksh93要求将first
和和last
数字都传递给fc
³(在bash,zsh和pdksh / mksh中也适用),但相同的命令²在zsh和ksh 中也可以使用:
sudo zsh -c "$(fc -ln -1)"
sudo ksh -c "$(fc -ln -1 -1)"
sudo "$0" -c "$(fc -ln -1 -1)"
$0
仅当通过$ PATH调用外壳且$ PATH不变或通过绝对路径调用外壳时,使用来指定正在运行的外壳的可执行文件。
这是zsh中的另一种方法,它稍微清晰一些但更长一些:
sudo zsh -c $history[$[HISTCMD-1]]
最后的警告sudo
是:用于潜在危险的命令。不要太容易使用!
¹ 开头有一些额外的空格,命令替换在结尾处去除了换行符,但是shell的语法对此并不在乎。
² 我认为zsh或ksh没有bash的东西$BASH
;$0
仅当它是绝对路径或不包含斜杠且命令搜索路径未更改时才起作用。
³ 是ATT ksh中的别名,但同样好。 fc
hist