可以在不知道给定命令的完整路径的情况下使用哪个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。
答案 0 :(得分:3)
通过查看函数名称,我假设这不是shell脚本,而是POSIX上的普通C。
在C中,您可以使用execlp()或execvp()函数。额外的' p' 表示PATH环境变量用于查找给定的可执行文件。
例如:
execlp("ls", "ls", "-t");
而不是:
execl("/bin/ls", "ls", "-t");
答案 1 :(得分:0)
如果可执行文件位于PATH
环境变量中,则可以对所有“家庭成员”执行此操作。该变量可以保存以冒号分隔的路径列表,这些路径在执行可执行文件时会被搜索。所以你要做的就是正确设置变量。典型设置包括这些路径
请注意,您必须注意哪个用户帐户实际执行了相关命令 - 这可以动态更改。在这种情况下,它可能是一个不同的PATH变量,而不是在调用范围的环境中。但通常环境完全移交给子流程。这再次意味着您可以先设置并“导出”PATH变量,然后进行调用并由被调用范围继承。
如果,为什么,你不能使用那个环境变量,那么你将不得不模仿那种行为:因为某个可执行文件的位置不能被exec调用或shell神奇地猜测,要么该位置必须已知或必须搜索。所以你必须实现这样一个搜索算法,你可以在一些简单的shell(通常称为“包装器”)中进行实际执行最终命令。因此,您调用包装器,将要执行的命令作为参数移交,并在包含搜索命令的位置使用包装器。但是,这又是完全 PATH变量的用途。
另一种选择是依靠PATH变量和shell算法来搜索所需的可执行文件,但是以手动方式执行。这就是whereis
和which
命令的用途:看一下他们的手册页,它们都允许搜索PATH变量并返回匹配。因此,您可以先查询所需可执行文件的绝对位置,然后使用该绝对路径调用它。