macOS High Sierra, 10.13.3 (17D102)

  • Если я запускаю в терминале sysctl -n hw.memsize он работает нормально, я получаю номер
  • Если я запускаю which sysctl я получаю /usr/sbin/sysctl который кажется правильным

Как запустить ту же команду из сценария оболочки? Ищете кросс-ОС решение. Использую чистый 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.

В то время как 4th работает как epxected, он использует eval, и я стараюсь избегать его. 3-й кажется почти правильным и не уверен, почему 2-й говорит, что такого файла нет, пока он существует.

Файл сценария sh имеет +x chmod.

1 ответ1

3

Буквально одна и та же команда внутри скрипта должна быть точно такой же:

sysctl -n hw.memsize

Ваши попытки больше концентрируются на синтаксисе $(…) и я не знаю, зачем вообще нужен $(…) . Если вам это нужно (например, давайте сохраним результат в переменной), то это должно быть как

memsize=$(sysctl -n hw.memsize)

без кавычек внутри $(…) .


$("sysctl -n hw.memsize")

1 Результат: line 2: sysctl -n hw.memsize: command not found

Это из-за цитирования. Ваша оболочка обрабатывает всю строку как одно слово, одну команду (исполняемую) для запуска; в то время как вы намерены передать команду и два аргумента. Без кавычек вы все равно получите command not found потому что оболочка попытается оценить (выполнить в этом случае) результат внутренней команды (это то, что делает $(…) ), например, результат может быть 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? Это будет то же самое, что и случай "без кавычек", описанный в вашем первом результате.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .