根据StackOverflow中的答案,我在C程序中使用系统命令通过以下可能的方式调用matrix.sh:
1) 系统("./matrix.sh")
2) int ret=system("./matrix.sh")
3) 系统("cd/path/to/matrix.sh; ./matrix.sh &")
4) 系统("./matrix.sh>> 输出文件名")
5)系统(“路径/to/matrisx.sh”)
6) 系统("bash/Path/to/matrix.sh")
还有其他一些。但所有这些都会给出相同的错误。 sh:1:Matrix.sh 未找到,另一个错误(第二种情况除外)为 警告:忽略使用属性 warn_unused_result [-Wunused-result] 声明的“system”的返回值
调用C程序和[输入.sh脚本,预期输出文件]的路径不同。在这种情况下如何编写system()命令?出现这个错误的原因是什么?
最佳答案
假设您要执行的脚本的绝对路径名是 /path/to/matrix.sh
,并且可以通过命令行按名称执行,则可以使用的变体是
system("/path/to/matrix.sh");
为了避免第二次警告,您还应该捕获返回值,并验证它是否未指示错误(通过为 -1)。
至于你的尝试:
1) system("./matrix.sh")
这取决于当前工作目录中是否存在matrix.sh
(该目录可能是也可能不是包含 C 程序的目录)。这就是“./”部分的含义。
2) int ret=system("./matrix.sh")
与之前相同,只是在这里捕获错误代码。 shell 可能会发出错误消息,但程序无法观察到这一点。程序可以使用 ret 的值来确定脚本是否已成功启动,如果成功,其退出代码是什么。
3) system("cd /path/to/matrix.sh; ./matrix.sh &")
“cd/path/to/matrix.sh”部分是错误的,因为 matrix.sh
不是目录。此外,还不清楚为什么使用 &
运算符在后台执行脚本。然而,这种变化应该有效:
system("cd /path/to && ./matrix.sh");
如果脚本(不明智地)依赖于使用相对路径来定位安装在其附近的其他文件,那么这样做可能是有意义的,并且如果没有成功更改脚本,则在不尝试执行(可能是错误的)脚本的情况下,它将失败工作目录。
4) system("./matrix.sh>> outputfilename")
这与 (1) 和 (2) 具有相同的问题。重定向标准输出并不能解决这个问题。您可以通过重定向标准错误而不是标准输出(“./matrix.sh 2>/dev/null”)来抑制错误消息,但这本身并不能解决主要问题。
5) system("Path/to/matrisx.sh")
差不多就是这样了,但是 (1) 文件和目录名对于 bash
是区分大小写的,并且 Path
与 path
不一样>,但更重要的是,(2) 如果没有前导 /
字符,“Path/to/matrisx.sh”仍然相对于当前工作目录进行解释。
6) system("bash/Path/to/matrix.sh")
如果路径正确的话,这几乎也可以工作,但是在“bash”和脚本路径之间至少需要一个空格字符。
system("bash /path/to/matrix.sh");
这种变体确实引入了额外的 shell 级别,但是,除非您命名的脚本不能直接执行,否则这是不必要的低效率。
关于sh : 1 file not found error with system() command? 的原因在 StackOverflow 中尝试了可能的解决方案(如下所列)但失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55149692/