Вот вариант ответа Уилла . Он включает в себя дополнительный cat
процесс, но предлагает удобство heredoc. Вкратце это выглядит так:
f ()
{
echo ok;
}
cat <
Если вы хотите больше пищи для размышлений, попробуйте это:
#!/bin/bash
f ()
{
x="a b";
menu "$x";
y="difficult thing";
echo "a $y to parse";
}
menu ()
{
[ "$1" == "a b" ] &&
echo "here's the menu";
}
cat <
Выход::
here's the menu
a difficult thing to pass
Здесь у нас есть функция menu
, соответствующая функции в вопросе, которая «определена в другом месте основного скрипта». Если "в другом месте" означает, что его определение уже было прочитано на этом этапе, когда функция, требующая sudo
, выполняется, то ситуация аналогична. Но, возможно, его еще не читали. Может быть другая функция, которая вызовет его определение. В этом случае declare -f menu
нужно заменить на что-то более сложное или весь скрипт подправить таким образом, что функция menu
уже объявлена.
Я помню, что мне пришлось исправить ошибку дампа ядра ядра в Solaris в 2006 году, которая была вызвана файловой системой ISO -9660 + Rock Ridge, созданной чем-то другим, а не mkisofs
.
Это программное обеспечение для форматирования ISO включало имя файла Rock Ridge не в середине записи каталога ISO -9660 (, как это сделано mkisofs
), а в конце записи каталога ISO -9660. Теперь вам нужно знать, что имена файлов Rock Ridge не заканчиваются нулевым байтом...
Случилось так, что (в то время слишком сильно оптимизированные )строковые подпрограммы в ядре Solaris могли в некоторых случаях перегружаться на единицу, и если имя файла Rock Ridge заканчивалось точно в конце 2-килобайтного сектора и этот сектор заканчивался как раз в конце страницы памяти ядра размером 4 КБ, это превышение доступа вызвало панику ядра из-за нелегального доступа к памяти.
Нам нужно было переписать код доступа, чтобы он был очень консервативным, чтобы предотвратить эту панику ядра в будущем.
Как видите, иногда гораздо сложнее написать безопасный код для ядра, и такой код иногда немного медленнее просто для того, чтобы избежать паники ядра.
Кстати, :проблему с потенциально непредсказуемой предварительной выборкой из ЦП в программах пользовательского пространства можно решить, позволив компоновщику добавить несколько байтов после сегментов, если существует вероятность достижения конца страницы MMU. Это не работает в ядре, которое зависит от области отображения.