Експорт функції в оболонці


87

Підкажіть, будь ласка, як експортувати функцію в батьківській оболонці (bash, sh або ksh), щоб функція була доступна для всіх дочірніх процесів, вилучених з батьківського процесу?


Відповіді:


105

export -fФункція специфічна для Bash:

батько

#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21

дитина

#!/bin/bash
echo $(plus1 $(($1 * $2)) )

2
чи функція експорту доступна лише для дочірніх дзвінків? Як застосувати його до поточного сеансу bash? подобається писати .bashrc, але лише для поточного екземпляра bash ...
vp_arth

3
@vp_arth: Якщо вам не потрібна функція у дочірніх викликах, вам не потрібно її експортувати. Він доступний у поточному сеансі в будь-якому випадку (зауважте, що якщо він визначений у файлі, вам потрібно буде створити файл, а не запускати його, щоб зробити його доступним у поточному сеансі).
Призупинено до подальшого повідомлення.


3

Якщо ви використовуєте ksh або zsh:

Ви можете використовувати змінну середовища FPATH, де ви можете розмістити всі свої функції.

Якщо FPATHвстановлено на інтерактивному інтерпретаторі, а команда чи функція не знайдені в поточному середовищі оболонки або в PATH, перелічені там каталоги шукаються на наявність файлу, названого після відсутньої команди. Якщо такий знайдений, він буде отриманий у поточному середовищі оболонки і очікується, що він визначить функцію.

Отже, ви можете розмістити всі свої функції в місці FPATH, і дочірні скрипти також зможуть його знайти.

Ви можете використовувати autoloadкоманду в сценаріях оболонки, щоб завантажити потрібні вам функції:

autoload fun_a fun_b

У zsh, autoloadнеобхідний для FPATHроботи. В kshі його близьких родичів, я вважаю , що це просто викликає функцію , певну в FPATHперевизначати регулярні команди в вашому PATH, як вони будуть , якщо вони визначені безпосередньо.

Деякі деталі щодо FPATHта autoload:


1

Якщо ви створюєте вкладені ( )оболонки, тоді вони успадкують знімок усіх визначень, параметрів та змінних оболонки.

Якщо ви виконуєте їх як програми, ви можете помістити визначення в .bashrc.

Якщо ви намагаєтеся підробити існуючий скрипт для виконання обгортки або заміни команди PATH, це .bashrcбуде працювати залежно від деталей виконання. Якщо ні, замість цього ви можете виконати сценарій-обгортку, який просто виконує файл включення .або sourceвключення, який визначає функції, а потім робить те саме зі сценарієм оболонки з командами, які потрібно замінити.

Сценарій обгортки може виглядати приблизно так:

script=$1
shift
. include.sh
. $script "$@"

Ідея полягає в тому, що перший параметр - це ім’я справжнього сценарію, а решта параметрів - аргументи, тоді замість цього запускається наведений вище сценарій.


2
Не могли б ви пояснити це на прикладі кодування. Я не хочу поміщати свою функцію в .bashrc
Sachin Chourasiya

1
declare -x -f NAME

Більше інформації

-f обмежити дію або показ назви функцій та їх визначення
-x, щоб змусити ІМЯ експортувати

6
Зверніть увагу, що це специфічно дляbash . ( kshАналог «s в declare, typeset, є -xваріант, але це стосується лише змінним , а не функція, піддакувати для zsh).
mklement0

0

За своєю природою функції не експортуються. Однак ви можете експортувати рядки, тому у мене тут є невелика хитрість:

func="$(typeset -f funcname)"
export func

Щоб імпортувати функцію, перевизначте її з експортованого рядка:

# in subshell
eval "$func"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.