Как экспортировать все функции Bash в файл в одну строку?

Попробуйте следующее:

rm $HOME/.dbus/session-bus/*
4
15.03.2018, 09:30
6 ответов

Если вы используете set -aлибо в своем .bashrc, либо в самом файле функций, он пометит все функции для экспорта.

4.3.1 The Set Builtin

-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
12
27.01.2020, 20:45

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 ).

8
27.01.2020, 20:45

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 functionenumerará 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 -fo declare -fxpara exportar esas funciones.

Como está obteniendo el archivo en su bashrc, -volver a obtenerlo probablemente no será un problema.

7
27.01.2020, 20:45

Просто используйте команду env:

env > /path/to/file
-2
27.01.2020, 20:45

Взгляните на 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обновляется.

3
27.01.2020, 20:45

Вывод setвыглядит благоприятным для извлечения всех определенных функций. Он начинается с переменных, а затем показывает функции, поэтому:

set |awk '/^[^=()]*\(\)/ {functions=1} functions' > functions.sh

Это ищет первое не -присвоение (вхождение ()перед первым =), а затем говорит, что это нормально для печати. Вторая строфа awk использует действие печати по умолчанию, когда переменная functionsимеет значение true. Выходные данные сохраняются в functions.sh, откуда их можно затем получить в другом месте.

0
27.01.2020, 20:45

Теги

Похожие вопросы