$("/usr/sbin/sysctl -n hw.memsize") 没有此文件或目录

$("/usr/sbin/sysctl -n hw.memsize") 没有此文件或目录

macOS High Sierra,10.13.3 (17D102)

  • 如果我在终端运行sysctl -n hw.memsize它工作正常,我得到一个数字
  • 如果我运行which sysctl我得到/usr/sbin/sysctl似乎正确的结果

如何从 shell 脚本运行相同的命令? 寻找跨操作系统解决方案。到处使用纯 sh。

我努力了:

#!/bin/sh
$("sysctl -n hw.memsize")
exit 1

1 结果:第 2 行:sysctl -n hw.memsize:未找到命令

#!/bin/sh
$("/usr/sbin/sysctl -n hw.memsize")
exit 1

2 结果:第 2 行:/usr/sbin/sysctl -n hw.memsize:没有此文件或目录

#!/bin/sh
echo `sysctl -n hw.memsize`
exit 1

3 结果:第 2 行:17179869184:未找到命令

不确定为什么在正确的输出后找不到命令。

#!/bin/sh
eval "sysctl -n hw.memsize"
exit 1

4 结果:与在终端中运行相同:17179869184但我想避免评估。

虽然第四个方法可以按预期工作,但它使用了 eval,我试图避免使用它。第三个方法似乎几乎正确,并且不确定为什么第二个方法说没有这样的文件,但它确实存在。

sh 脚本文件有 a+x chmod。

答案1

从字面上看,脚本中的相同命令应该是一模一样

sysctl -n hw.memsize

你的尝试更多地集中在$(…)语法上,我不知道为什么$(…)首先需要。如果你需要它(例如让我们将结果存储在变量中),那么它应该是这样的

memsize=$(sysctl -n hw.memsize)

里面没有引号$(…)


$("sysctl -n hw.memsize")

1 结果:line 2: sysctl -n hw.memsize: command not found

这是因为引用。您的 shell 将整个字符串视为一个单词、一个要运行的命令(可执行文件);而您的意图是传递一个命令和两个参数。如果没有引号,您command not found无论如何都会得到结果,因为 shell 会尝试评估(在本例中为运行)结果内部命令(这就是它的$(…)作用),例如结果可能是17179869184。您的系统中没有17179869184命令,是吗?请注意,这command not found将来自与使用引号时不同的级别。

$("/usr/sbin/sysctl -n hw.memsize")

2 结果:line 2: /usr/sbin/sysctl -n hw.memsize: No such file or directory

基本和上面一样,只是“命令”不同,错误信息也不同,/但机制是一样的。

echo `sysctl -n hw.memsize`

3 结果:line 2: 17179869184: command not found

应该工作(这是糟糕的代码不过)。你确定不是`sysctl -n hw.memsize`没有吗echo?这和你第一个结果中解释的“没有引号”的情况相同。

相关内容