1

在不知道给定命令的完整路径的情况下,可以使用哪些 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。

4

2 回答 2

4

By looking at the function names I'm assuming that this is not shell scripting but instead normal C on POSIX.

In C you may use the execlp() or execvp() functions. Whele the extra 'p' means that PATH environment variable is used for finding the given executable.

For example:

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

instead of:

    execl("/bin/ls", "ls", "-t");
于 2014-09-30T22:30:56.417 回答
0

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

  • ~/bin(当前用户的 bin 文件夹)
  • . (当前目录)
  • /垃圾桶
  • /usr/bin
  • /usr/local/bin

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

如果,无论如何,您不能使用该环境变量,那么您将不得不以某种方式模拟该行为:由于 exec 调用或 shell 无法神奇地猜测某些可执行文件的位置,因此该位置必须是已知的,或者必须是搜索。因此,您必须实现这样的搜索算法,您可以在一些用于实际执行最终命令的简约外壳(通常称为“包装器”)中执行此操作。因此,您调用包装器,交出要作为参数执行的命令,并且包装器知道在什么地方搜索命令。但话又说回来,这正是PATH 变量的用途。

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

于 2014-04-05T17:09:10.133 回答