“sudo !!” 在 bash 中的工作原理:
$ touch /bin/1
touch: cannot touch `/bin/1': Permission denied
$ sudo !!
sudo touch /bin/1
答案1
bash 支持历史扩展功能。历史扩展由 '!' 实现。'!!' 引用前一个命令。
在读取命令行之后、execve() 系统调用之前立即执行历史扩展。
$ touch /bin/1
touch: невозможно выполнить touch для «/bin/1»: Отказано в доступе
$ sudo strace !!
sudo strace touch /bin/1
execve("/usr/bin/touch", ["touch", "/bin/1"], [/* 17 vars */]) = 0
bash 将“sudo !!”扩展为“sudo touch /bin/1”,然后运行命令。
答案2
sudo !!
只是告诉终端运行上一个命令,但这次是在 sudo 下。在这种情况下,它与sudo touch /bin/1
第一次输入相同。