如何查明 Linux 命令的具体功能?

XYZ*_*YZT 6 linux command-line

当我运行类似的东西时python file.py,系统(我认为)正在执行一些文件作为file.py参数。我如何准确地找出它正在执行哪个文件或至少是目录?

有没有一个 Linux 命令可以让你找到其他命令的目标?

Bas*_*tch 5

“命令的作用”没有明确定义,是一个含糊不清的句子。所有这些都有副作用(至少,燃烧 CPU 周期会加热您的处理器)。

我假设你的命令不是恶意或敌对的,并且你的操作系统是 Linux...

很多时候,一个命令有一些文档。因此,对于命令foo尝试aproposfoomanfoo经常(GNU编码标准要求),否则是STFW。如果该命令打包在您的发行版中,它可能有一个单独的文档包(例如,GCC 在我的 Debian/Sid 上打包为 、... ,但还有一个包等...我建议安装大多数文档包您正在使用的软件的...以及Debian 相关发行版上的& & & )。foo--helpgcc-5g++-5gccgo-5gcc-5-docmanpagesmanpages-devmanpages-posixmanpages-posix-dev

每个进程都在执行一些系统调用(这是执行可观察副作用的最常见方法,例如输入和输出)。syscalls(2)中列出了可能的 Linux 系统调用。您可以使用 strace(1)找到命令或进程动态执行的系统调用的序列(一些像time(2)这样的“系统调用”通常不是内核完成的真正系统调用,有关详细信息,请参阅vdso(7)) 。

尝试举一个简单的例子:

 strace pwd
Run Code Online (Sandbox Code Playgroud)

你会看到它正在执行大约 70 个系统调用,特别是在我的 Debian/PC 上:

getcwd("/home/basile", 4096)            = 13
fstat(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
                                        = 0x7f61aac5a000
write(1, "/home/basile\n", 13)          = 13
Run Code Online (Sandbox Code Playgroud)

另请参见ltrace(1),它跟踪对共享库内函数的调用。

最后,大多数Linux命令都是免费软件,因此您可以下载和研究它们的源代码,甚至改进它。

正如其他人回答的那样,您的shell正在搜索您的可执行文件$PATH(您可以使用 进行查询echo $PATH),并且您可以使用whichfoowhereisfootypefoo 查找有关 的更多信息foo。当然,shell 有一些内置命令,例如cd(这使得 shell本身执行chdir(2)系统调用,因此该命令不能有任何ELF可执行cd文件,它必须是内置命令),并且大多数 shell 使您能够定义 shell函数别名

附言。即使对于理解恶意命令也strace非常有用。