我希望在C脚本内部运行在../folder1/folder2中找到的可执行文件。现在我正试图这样做:
char command[50];
strcpy(command, "cd ../folder1/folder2");
system(command);
memset(command,0,sizeof(command));
strcpy(command, "./executable_name");
system(command);
但它没有用。我应该使用chdir(),还是有其他方法可以做到这一点?它甚至可能吗?
答案 0 :(得分:4)
它不起作用,因为当你执行:
system("cd ../folder1/folder2");
它对可执行文件的当前目录没有影响。因此,当你执行:
system("./executable_name");
它找不到它。
您可以使用以下任何一种方法解决它:
更改system
的命令:
system("../folder1/folder2/executable_name");
更改system
的命令:
如果您的默认shell是bash
以及许多UNIX shell,这将会起作用。
system("cd ../folder1/folder2; ./executable_name");
创建一个包含以下内容的shell脚本:
#/bin/bash
cd ../folder1/folder2
./executable_name
然后使用system
system("myscript.sh");
在致电chdir
之前,在C中为system
添加一行:
chdir("../folder1/folder2");
system("./executable_name");
更新,感谢@Jongware
以上所有假设您的程序在../folder1/folder2
是有效路径的目录中执行。如果您的程序是从另一个目录执行的,并且您想要考虑该场景,则必须解析argv[0]
并调整处理执行executable_name
的调用的方式。
答案 1 :(得分:1)
最简单的方法通常是:
system("../folder1/folder2/executable_name");
如果失败,您必须在程序中通过cd
执行chdir()
,或者安排执行cd
并在单个shell中执行命令(单个调用{ {1}}),如:
system()
答案 2 :(得分:1)
问题在于系统执行fork会在子进程中执行cd,该子进程结束并且不会影响程序进程的工作目录。贝壳,需要制作cd& dirs builtins让他们产生影响。
您可以使用getwd
和chdir
来更改目录,然后使用"."
系统更改目标,添加"cd ../folder1/folder2; ./executable_name"
,使用{{ 1}}并更改目录并自己在fork
子项中运行命令,或者只使用相对路径“../ folder1 / folder2 / executable_name”运行程序。
exec
答案 3 :(得分:0)
您需要执行更改目录的脚本,然后运行应用程序。
答案 4 :(得分:0)
您可以使用相对路径或绝对路径执行程序。如果您确实想在另一个工作目录中执行它,请继续阅读。
目前,您的程序在执行子程序之前不会更改其工作目录。
简单解释一下,system
启动一个新程序,它会更改其工作目录然后退出,因此您的程序不会受到影响。
您尝试在实际脚本中使用的是因为解释器不会为您提供的每个命令生成新的shell,而是自己执行它们。
使用chdir()
或其他API来更改当前正在执行的程序的目录。