可以在没有 shell 的情况下执行命令吗?

可以在没有 shell 的情况下执行命令吗?

我正在开发一个二进制可执行程序命令来执行程序并将输出返回到文本字段中。

命令的参数涉及命令本身(因为它将在命令行上键入)和目录。所以执行操作的例程首先切换到目录,然后执行命令。

some.cmd例如,如果我想在目录中执行命令,/home/user参数为command = 'some.cmd'directory = '/home/user'

我发现这some.cmd不起作用,但如果我将命令更改为该/home/user/some.cmd命令则有效。但是该命令ls -l有效。我还注意到该cd命令无法识别。如果我通过ssh设置命令来远程运行它ssh user@localhost 'cd /home/user && ./some.cmd',它就可以工作。

似乎在 shell 中执行命令时存在的一些设置在直接运行时不存在,但是通过执行它ssh似乎创建了它工作的设置。

这有什么解释吗?

更新: 经过一番询问后,我了解到用于执行命令的 API 并未在 shell 中执行,或者未在控制台提供的正常环境中执行。使用选项执行命令后,/bin/sh -c "cd ..."问题就不再存在了。这是给我的环境ssh user@localhost 'command ...'。我不太确定技术细节,但显然,当您在普通 shell 中执行时可用的环境并不总是可用于操作系统直接执行的命令。

答案1

当您尝试执行一个文件时,系统必须知道如何找到该文件。这就是为什么如果您指定它的完整路径它就会起作用。 shell 还有一个PATH环境变量,用于存储要查找可执行文件的目录列表。这就是为什么您不必指定 的完整路径ls

答案2

这完全是由于该命令不在您的PATH.与 Windows 系统不同,当前目录并不隐式位于可执行文件的搜索路径中。要运行诸如ls(例如)之类的命令,ls -l它需要位于您的 中PATH,事实上它是 -type ls将向您显示它位于/bin或中/usr/bin。但是,some.cmd它不在您的系统中PATH,因此不能作为命令透明地执行。我想到了三个选项:

  1. 您可以移动some.cmdPATH.例如,在某些发行版上/usr/local/bin/和默认"$HOME"/bin添加到PATH

  2. 您可以添加"$HOME"到您的PATH

  3. 您可以运行./some.cmd(当前目录的相对路径)而不是尝试使用普通some.cmd

答案3

你好


第一种方式:

您可以使用Libeshell C++ Library来编写类似 Shell 的控制台应用程序

使用此库,您可以创建命令行和 Shell 样式的应用程序


第二种方式:

使用此代码通过 C++ 执行命令:

#include <stdlib.h>

int main(){

system("gnome-terminal -x sh -c 'mkdir /root/Desktop/New-Dir-1 ; mkdir /root/New-Dir-2'");
}

相关内容