Підкажіть, будь ласка, як експортувати функцію в батьківській оболонці (bash, sh або ksh), щоб функція була доступна для всіх дочірніх процесів, вилучених з батьківського процесу?
Підкажіть, будь ласка, як експортувати функцію в батьківській оболонці (bash, sh або ksh), щоб функція була доступна для всіх дочірніх процесів, вилучених з батьківського процесу?
Відповіді:
export -fФункція специфічна для Bash:
батько
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
дитина
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
В sh, це НЕ можливо експортувати функцію, як і зазначив Чарльз Даффі .
Якщо ви використовуєте ksh або zsh:
Ви можете використовувати змінну середовища FPATH, де ви можете розмістити всі свої функції.
Якщо FPATHвстановлено на інтерактивному інтерпретаторі, а команда чи функція не знайдені в поточному середовищі оболонки або в PATH, перелічені там каталоги шукаються на наявність файлу, названого після відсутньої команди. Якщо такий знайдений, він буде отриманий у поточному середовищі оболонки і очікується, що він визначить функцію.
Отже, ви можете розмістити всі свої функції в місці FPATH, і дочірні скрипти також зможуть його знайти.
Ви можете використовувати autoloadкоманду в сценаріях оболонки, щоб завантажити потрібні вам функції:
autoload fun_a fun_b
У zsh, autoloadнеобхідний для FPATHроботи. В kshі його близьких родичів, я вважаю , що це просто викликає функцію , певну в FPATHперевизначати регулярні команди в вашому PATH, як вони будуть , якщо вони визначені безпосередньо.
Деякі деталі щодо FPATHта autoload:
Якщо ви створюєте вкладені ( )оболонки, тоді вони успадкують знімок усіх визначень, параметрів та змінних оболонки.
Якщо ви виконуєте їх як програми, ви можете помістити визначення в .bashrc.
Якщо ви намагаєтеся підробити існуючий скрипт для виконання обгортки або заміни команди PATH, це .bashrcбуде працювати залежно від деталей виконання. Якщо ні, замість цього ви можете виконати сценарій-обгортку, який просто виконує файл включення .або sourceвключення, який визначає функції, а потім робить те саме зі сценарієм оболонки з командами, які потрібно замінити.
Сценарій обгортки може виглядати приблизно так:
script=$1
shift
. include.sh
. $script "$@"
Ідея полягає в тому, що перший параметр - це ім’я справжнього сценарію, а решта параметрів - аргументи, тоді замість цього запускається наведений вище сценарій.
declare -x -f NAME
Більше інформації
-f обмежити дію або показ назви функцій та їх визначення -x, щоб змусити ІМЯ експортувати
bash . ( kshАналог «s в declare, typeset, є -xваріант, але це стосується лише змінним , а не функція, піддакувати для zsh).