![什么是内置命令,什么不是内置命令?](https://linux22.com/image/1527351/%E4%BB%80%E4%B9%88%E6%98%AF%E5%86%85%E7%BD%AE%E5%91%BD%E4%BB%A4%EF%BC%8C%E4%BB%80%E4%B9%88%E4%B8%8D%E6%98%AF%E5%86%85%E7%BD%AE%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
如果我想查看 root 的 bash 历史记录,为什么我不能直接运行sudo history
?当我这样做时,它说未找到命令历史记录,但如果我在不使用 sudo 的情况下运行它,它就可以正常运行。
编辑:这是重复的答案,但不是链接问题的重复问题。提出这两个问题的人都不会知道这是 shell 内置命令,而不是二进制文件。
答案1
history
是 bash shell 内置命令,sudo
不能与 shell 内置命令一起使用。
什么是内置命令,什么不是内置命令?
我使用了命令which
那“返回将在环境中执行的文件(或链接)的路径名”确认这history
不是一个外部(bash)命令。
例如,运行
$ which history
$
不返回任何内容,退出代码为 1(一个或多个指定的命令不存在或不可执行)[仅供参考,echo $?
运行时使用退出代码]
$ which ls
/bin/ls
$
和退出代码 0(所有指定的命令都已找到并可执行)。
另外,在 bash 中,你可以使用以下命令查找内置命令的帮助help
(或搜索页面man bash
)。例如,输入
$ help history
history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps
arg [arg...]
Display or manipulate the history list.
...
显示 bash 的帮助信息。运行help non-bash-command
将返回类似以下内容的内容:
$ help ls
bash: help: no help topics match `ls'. Try `help help' or `man -k ls' or
`info ls'.
退出代码为 1
那么 sudo 在做什么?
您可以使用或类似命令搜索自己的历史记录以查找sudo
用户运行过的命令(并且不会跳过将其保存到历史记录中)。grep '^sudo' .bash_history
history|less
或者,在 Ubuntu 上,该文件/var/log/auth.log
保存了所有用户所做操作的记录sudo
,在其中搜索“sudo”(其他发行版可能使用该文件/var/log/secure
),或者可以使用
sudo grep sudo /var/log/auth.log
sudo journalctl _COMM=sudo
或者如果您有 systemd 则运行。
答案2
history
是 bash 内置命令,而不是常规命令;sudo
不会启动 shell 来执行您给出的命令,它只是尝试直接执行它(作为常规命令),因此不可用。
您可以使用sudo bash
打开 root shell 命令,然后运行history
,但如果您想要一行代码,那么它就有点复杂了。bash 仅在交互模式下运行时启用其历史记录机制,如果您执行类似操作sudo bash -c history
(-c
告诉 bash“这是我希望您执行的命令:”),它会将其视为非交互模式,并且实际上不会显示任何历史记录。-i
当我测试它时,即使添加(用于交互模式)也不起作用。但是这个可以:
sudo bash -i <<<history
请注意,这<<<
是仅限 bash 的功能;在其他 shell 中您可能必须使用echo history | sudo bash -i
它。
答案3
那么如何仅以 sudo 临时身份登录然后执行历史?
第一的
sudo -s
进而
history