什么是内置命令,什么不是内置命令?

什么是内置命令,什么不是内置命令?

如果我想查看 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_historyhistory|less

或者,在 Ubuntu 上,该文件/var/log/auth.log保存了所有用户所做操作的记录sudo,在其中搜索“sudo”(其他发行版可能使用该文件/var/log/secure),或者可以使用

sudo grep sudo /var/log/auth.log

sudo journalctl _COMM=sudo或者如果您有 systemd 则运行。

查看问题Unix 和 Linux 上“有关所有用户执行的 sudo 命令的详细信息”更多细节

答案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

相关内容