Я определил bash
функцию в моем ~/.bashrc
файле. Это позволяет мне использовать его в терминалах оболочки. Однако, кажется, что он не существует, когда я вызываю его из скрипта.
Как я могу определить bash
функцию, которая будет использоваться скриптами?
bash
shell-script
function
Onturenio
источник
источник
/bin/sh
в линии Шебанга?Ответы:
~/.bash_profile
и~/.bashrc
не читаются скриптами, а функции не экспортируются по умолчанию. Для этого вы можете использоватьexport -f
так:export -f foo
также может быть вызван,~/.bash_profile
чтобы сделать эту функцию доступной для сценариев после входа в систему. Имейте в виду, чтоexport -f
это не портативно.Лучшим решением было бы использовать файл, содержащий функцию, используя
. file
. Это гораздо более переносимо и не зависит от конкретной настройки вашей среды.источник
function myFunction { ... }
в,~/.bash_profile
и вы готовы пойти?export
решение, кажется, работает правильно. Благодарю.foo
функция изfile
2) Вы можете лучше контролировать содержимое этого,file
чем быть уверенным, что вызывающая оболочка не изменилсяfoo
до вызова вашего сценария.file
Например, вы можете добавить проверку безопасности, чтобы убедиться, что он не нарушен. (не легко, но возможно). (ну, вы могли бы также выполнить эти проверки для определенной функции foo ... но вы поняли мой дрейф ^^ Я думаю, что метод 2 чище.) 3)file
будет содержать только то, что нужно, не больше..bashrc
читается только интерактивными оболочками. (На самом деле, это упрощение: bash в этом отношении причудлив. Bash не читает, является.bashrc
ли он оболочкой входа в систему, интерактивной или нет. И есть исключение даже из исключения: если родительский процесс bash равенrshd
илиsshd
, то bash читает.bashrc
, будь то интерактивный или нет.)Поместите определения вашей функции в файл в известном месте и используйте встроенную
.
(также записаннуюsource
) встроенную функцию для включения этого файла в сценарий.Если хотите, можете воспользоваться функцией автозагрузки в ksh. Поместите каждое определение функции в файл с тем же именем, что и функция. Перечислите каталоги, содержащие определения функций в
FPATH
переменной (список каталогов через двоеточие). Вот грубое приближение ksh,autoload
которое фактически загружает функцию сразу, а не по требованию:источник
Вам нужна функция? Если нет, подумайте о том, чтобы вытянуть логику в отдельный автономный скрипт Bash
$PATH
. Например, у меня было это в моем~/.bashrc
:~/bin
находится в моем$PATH
, поэтому я создал~/bin/wanip
со следующим содержанием:И побежал,
chmod 0755 ~/bin/wanip
чтобы сделать его исполняемым. Теперь я могу выполнитьwanip
из других скриптов.Мне нравится иметь
wanip
в автономном скрипте Bash. Это напоминает мне, что я хочу, чтобы эта логика была общедоступной (кроме только в моей текущей интерактивной сессии Bash). Скрипт красиво инкапсулирует логику и документацию для одного и того же.источник