不使用路径执行系统调用

时间:2014-04-05 17:04:11

标签: shell unix exec execvp execv

可以在不知道给定命令的完整路径的情况下使用哪个exec系统调用系列成员。例如

"/bin/ls -t" "/bin/cat -n" "/usr/bin/tr /a-z/ /A-Z/" 

从命令行给出的输入我可以正确使用execv(arg [0],args)这样

(arg[0] -> full path of the command and args -> arguments of the command)  

但是当我有“ls / sbin”“wc -w”“cat”输入时我不能使用execv。

2 个答案:

答案 0 :(得分:3)

通过查看函数名称,我假设这不是shell脚本,而是POSIX上的普通C。

在C中,您可以使用execlp()或execvp()函数。额外的' p' 表示PATH环境变量用于查找给定的可执行文件。

例如:

    execlp("ls", "ls", "-t");

而不是:

    execl("/bin/ls", "ls", "-t");

答案 1 :(得分:0)

如果可执行文件位于PATH环境变量中,则可以对所有“家庭成员”执行此操作。该变量可以保存以冒号分隔的路径列表,这些路径在执行可执行文件时会被搜索。所以你要做的就是正确设置变量。典型设置包括这些路径

  • 〜/ bin(当前用户bin文件夹)
  • 。 (当前目录)
  • / bin中
  • 的/ usr / bin中
  • 的/ usr / local / bin中

请注意,您必须注意哪个用户帐户实际执行了相关命令 - 这可以动态更改。在这种情况下,它可能是一个不同的PATH变量,而不是在调用范围的环境中。但通常环境完全移交给子流程。这再次意味着您可以先设置并“导出”PATH变量,然后进行调用并由被调用范围继承。

如果,为什么,你不能使用那个环境变量,那么你将不得不模仿那种行为:因为某个可执行文件的位置不能被exec调用或shell神奇地猜测,要么该位置必须已知或必须搜索。所以你必须实现这样一个搜索算法,你可以在一些简单的shell(通常称为“包装器”)中进行实际执行最终命令。因此,您调用包装器,将要执行的命令作为参数移交,并在包含搜索命令的位置使用包装器。但是,这又是完全 PATH变量的用途。

另一种选择是依靠PATH变量和shell算法来搜索所需的可执行文件,但是以手动方式执行。这就是whereiswhich命令的用途:看一下他们的手册页,它们都允许搜索PATH变量并返回匹配。因此,您可以先查询所需可执行文件的绝对位置,然后使用该绝对路径调用它。