Підкажіть, будь ласка, як експортувати функцію в батьківській оболонці (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
).