Стратегия показывает, что время, потраченное на системные вызовы, намного больше, чем общее истекшее время. Почему?

Я подозреваю, что это та часть эпизода, которая вас зацепила:

The words that are not variable assignments or redirections are expanded (see Shell Expansions). If any words remain after expansion, the first word is taken to be the name of the command and the remaining words are the arguments

Это из справочного руководства по Bash в разделе, посвященном расширению простых команд.

В примере cmd=bashпеременные окружения не установлены, и bash обрабатывает командную строку, расширяя параметры, оставляя bash -c "echo hi".

В примере prefix=hello=hiв первом проходе опять нет назначений переменных, поэтому обработка продолжается до раскрытия параметров, в результате чего получается первое слово hello=hi.

После обработки назначений переменных они не -повторно обрабатываются во время выполнения команды.

См. обработку и ее результаты вset -x:

$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42

Для более безопасного варианта «расширения переменных» -как -«переменных среды», чем eval, рассмотрите предложение wjandrea оenv:

prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi

Это не совсем -назначение переменной строки команды, поскольку мы используем основную функцию утилиты envпо назначению переменных окружения команде, но она выполняет ту же цель. Переменная $prefixрасширяется во время обработки строки команды -, предоставляя имя=значение env, который передает его bash.

3
09.03.2021, 10:16
0 ответов

Теги

Похожие вопросы