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
?这和你第一个结果中解释的“没有引号”的情况相同。