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

vfc*_*sts 4 shell ssh command

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

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

例如,如果我想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 中执行时,可用环境的存在并不总是可用于由操作系统直接执行的命令。

Eri*_*ouf 5

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

  • @vfclists ; 因为 `cd` 是一个无法通过 `PATH` 找到的 shell 内置命令。(如果您需要 C 库函数,请查看 `chdir()`。) (6认同)
  • 对,`cd` 是 shell 知道如何实现的命令 `ls` 是一个外部可执行文件(通常是 `/bin/ls`,你可以通过执行 `which ls` 找到你的)。`PATH` 变量告诉 shell 在 `/bin` 和其他地方查找,所以当你尝试运行 `ls` 时,它会找到可执行文件并运行它。通常`.` 不在`PATH` 中,所以仅仅与可执行文件位于同一目录中并不能使其“可找到”运行,这就是使用`./some.cmd` 有效的原因,您现在告诉它在哪里可以找到它而不是让它看起来在`PATH` (2认同)
  • @vfclists 你可能也对 `type` 命令感兴趣,它会给你关于如果你尝试运行命令会发生什么的信息。例如,`type cd` 给我`cd is a shell builtin` 和`type ls` 给我`ls 别名为`ls --color=auto'` 并且可以用`which ls` 扩充,它给我`alias ls='ls --color=auto' /bin/ls` (2认同)