Если вы используете set -a
либо в своем .bashrc
, либо в самом файле функций, он пометит все функции для экспорта.
-a
Each variable or function that is created or modified is given the export attribute and marked for export to the environment of subsequent commands.
Это может привести к нежелательным результатам, если вы устанавливаете переменные, которые не хотите экспортировать, но вы можете добавить что-то подобное в.bashrc
:
set -a
source ~/my_funcs
set +a
Lo que realmente debe hacer es obtener el archivo que contiene las funciones dentro del script mismo, de esa manera no será dependiente -del contexto (o, mejor dicho, será menos dependiente -del contexto ).
Podrías intentar algo como:
declare -fx $(bash -c 'source /path/to/my-file &> /dev/null; compgen -A function')
Dado que desea exportar solo funciones del archivo, obtenerlo en una nueva instancia de bash y luego usar compgen -A function
enumerará los nombres de todas las funciones definidas en ese archivo (y las funciones exportadas previamente también, pero eso no debería ser un problema aquí ). Luego puede usar la salida de eso con export -f
o declare -fx
para exportar esas funciones.
Como está obteniendo el archivo en su bashrc, -volver a obtenerlo probablemente no será un problema.
Взгляните на BASH _ENV
INVOCATION
When bash is started non-interactively, to run a shell script, for
example, it looks for the variable BASH_ENV in the environment, expands
its value if it appears there, and uses the expanded value as the name
of a file to read and execute. Bash behaves as if the following com‐
mand were executed:
if [ -n "$BASH_ENV" ]; then. "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file‐
name.
BASH_ENV
If this parameter is set when bash is executing a shell script,
its value is interpreted as a filename containing commands to
initialize the shell, as in ~/.bashrc. The value of BASH_ENV is
subjected to parameter expansion, command substitution, and
arithmetic expansion before being interpreted as a filename.
PATH is not used to search for the resultant filename.
Когда bash выполняет сценарий оболочки не -в интерактивном режиме,.bashrc не читается, а файл функции не загружается.
Если для BASH _ENV задано имя файла функции, этот файл читается и выполняется, как указано в INVOCATION.
Поэтому нет необходимости создавать файл функции в каждом сценарии оболочки, который использует эту функцию.
Пример для иллюстрации:
Не Ubuntu, а Debian -linux 4.14.0 -3 -amd64 #1 SMP Debian 4.14.17 -1 (2018 -02 -14 )x86 _64 GNU/Linux с Xfce 4.12
Создайте файл функций в своем$HOME
cat mesfuncbash
piste ()
{
echo $0 >> ~/lapiste
date >> ~/lapiste
}
Создайте скрипт, использующий эту функцию
cat lescript
#!/bin/bash
echo $0
. ~/mesfuncbash
piste
echo fin
здесь скрипт исходит из файла функции
Создать лаучер для lescript
наDesktop
Терминал не нужен
выполнить его.
Файл ~/lapiste
обновлен.
Теперь удалите . ~/mesfuncbash
из lescript
выполнить его
Файл ~/lapiste
не обновлен.
Если вы запускаете lescript
на терминале
Баш тебе скажет:
line 3: piste: command not found
Теперь вы должны установить BASH_ENV
на имя файла функции.
В debian с xfce .profile
не читается при запуске, поэтому вы не можете использовать его для установки BASH_ENV
.
Вы должны создать файл .xsessionrc
в своем $HOME
.
cat.xsessionrc
export BASH_ENV="$HOME/mesfuncbash"
выход из системы и вход в систему, таким образом .xsessionrc
читается при запуске
Теперь вы можете запускать лаучер на рабочем столе. и файл ~/lapiste
обновляется.
Вывод set
выглядит благоприятным для извлечения всех определенных функций. Он начинается с переменных, а затем показывает функции, поэтому:
set |awk '/^[^=()]*\(\)/ {functions=1} functions' > functions.sh
Это ищет первое не -присвоение (вхождение ()
перед первым =
), а затем говорит, что это нормально для печати. Вторая строфа awk использует действие печати по умолчанию, когда переменная functions
имеет значение true. Выходные данные сохраняются в functions.sh
, откуда их можно затем получить в другом месте.