我如何找出linux命令的确切功能?

时间:2015-09-27 05:13:21

标签: linux command-line

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

是否有Linux命令让您找到其他命令的目标?

2 个答案:

答案 0 :(得分:3)

"命令的作用"没有很好的定义,是一个模棱两可的句子。所有这些都有side-effects(至少,燃烧的CPU周期会加热你的处理器)。

我假设您的命令不是恶意或敌意,而您的operating system是某些Linux ......

很多时候,命令都有一些文档。因此,对于命令 foo ,请尝试apropos foo man foo 并经常 foo --help(GNU coding standard要求)或STFW。如果命令打包在您的发行版中,它可能有一个单独的文档包(例如GCC打包为gcc-5g++-5gccgo-5等...在我的Debian上/ Sid,但还有一个gcc-5-doc包等...我建议安装您正在使用的软件的大多数文档包...以及manpages& manpages-dev& {关于Debian相关发行版的{1}}& manpages-posix

每个process正在做一些system calls(这是进行可观察副作用的最常见方式,例如输入和输出)。可能的Linux系统调用列在syscalls(2)中。您可以找到动态执行的命令系统调用的序列,或使用strace(1) 处理(少数"系统调用& #34;与time(2)一样,内核通常不是真正的系统调用,详情请见vdso(7)

尝试一个简单的例子:

manpages-posix-dev

你会发现它正在进行大约70次系统调用,特别是在我的Debian / PC上:

 strace pwd

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

最后,大多数Linux命令都是free software ,因此您可以下载并 学习他们的source code ,甚至改善它。

正如其他人回答的那样,您的shell正在搜索executable 中的$PATH(您可以使用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 查询),而您可以使用echo $PATH which foo whereis foo {{1} 以查找有关 type 的更多信息。当然,shell有一些内置命令,例如foo(这使得shell 本身做一个chdir(2)系统调用,所以不能有任何foo命令的ELF可执行文件,必须是内置文件),大多数shell允许您定义shell functionsaliases

PS。即使是了解恶意命令,cd也非常有用。

答案 1 :(得分:2)

  

是否有Linux命令可以让您找到其他命令的目标?

是的,当我跑步时,它在我的机器中被称为

$ which python
$ /usr/bin/python 

通常在linux中,除非您通过以下方式指定当前目录:

./any_command

bash(或您正在使用的shell)将查看PATH环境变量中列出的目录,尝试查找具有给定名称的命令。

PATH是由"分隔的目录列表:"字符。通常它已经有一些默认位置,你的shell将查找可执行文件,如/ bin,/ usr / bin,/ usr / local / bin(root用户在其$ PATH env变量中有不同的路径)。

如果您想要添加到路径中的某个位置,可以通过运行以下命令来执行此操作:

export PATH=$PATH:/my_new_location

这样,您可以从任何地方开始运行位于my_new_location目录中的程序,而无需指定它们的完整路径。顺序很重要,如果相同的命令出现在两个不同的目录中,则使用列表中第一个目录的命令。因此,如果您希望优先考虑my_new_location,则必须将其放在PATH变量的前面,如下面的声明所示:

export PATH=/my_new_location:$PATH