Подтвердить что ты не робот

Как написать bash script для установки глобальной переменной окружения?

Недавно я написал script, который задает переменную окружения, посмотрите:

#!/bin/bash

echo "Pass a path:"
read path
echo $path

defaultPath=/home/$(whoami)/Desktop

if [ -n "$path" ]; then
    export my_var=$path
else
    echo "Path is empty! Exporting default path ..."
    export my_var=$defaultPath
fi

echo "Exported path: $my_var"

Он работает просто отлично, но проблема в том, что my_var доступен только локально, я имею в виду в окне консоли, где я запускал script.

Как написать script, который позволяет мне экспортировать переменную окружения global, которую можно увидеть повсюду?

4b9b3361

Ответ 1

Каждая оболочка имеет свою собственную среду. Там нет универсальной среды, которая волшебным образом появится во всех консольных окнах. Среда окружения, созданная в одной оболочке, не может быть доступна в другой оболочке.

Это еще более ограничительный. Если одна оболочка порождает подоболочку, эта подоболочка имеет доступ к родительским переменным среды, но если эта подоболочка создает переменную окружения, она не доступна в родительской оболочке.

Если все ваши оболочки нуждаются в доступе к одному и тому же набору переменных, вы можете создать загрузочный файл, который будет устанавливать их для вас. Это делается в BASH через файлы $HOME/.bash_profile и $HOME/.bashrc и через $HOME/.profile, если $HOME/.bash_profile не существует). Другие оболочки имеют собственный набор файлов запуска. Один используется для логинов, а один используется для оболочек, созданных без логинов. См. Man-страницу, чтобы точно узнать, какие сценарии запуска и какой порядок они выполняются).

Вы можете попробовать использовать общую память, но я считаю, что работает только во время работы процессов, поэтому, даже если вы выяснили способ установки части разделяемой памяти, она исчезнет, ​​как только эта команда будет завершена. (Я редко использовал общую память, кроме именованных каналов). В противном случае не существует способа установить переменную среды в одной оболочке, и другая оболочка автоматически подберет ее. Вы можете попробовать использовать именованные каналы или записать эту переменную среды в файл для других оболочек, чтобы поднять ее.

Представьте себе проблемы, которые могут возникнуть, если кто-то может изменить среду одной оболочки без моего ведома.

Ответ 2

Просто запустите оболочку script, которой предшествует "." (точечное пространство).

Это приводит к тому, что script запускает инструкции в исходной оболочке. Таким образом, переменные все еще существуют после завершения script

Пример:

cat setmyvar.sh
export myvar=exists

. ./setmyvar.sh

echo $myvar
exists

Ответ 3

Вам нужно добавить переменную в ваш .profile, расположенный в /home/ $USER/.profile

Yo может сделать это с помощью этой команды:

echo 'TEST="hi"' >> $HOME/.profile

Или, например, отредактируйте файл с emacs. Если вы хотите установить эту переменную для всех пользователей, вам нужно отредактировать /etc/profile (root)

Ответ 4

В UNIX отсутствует глобальная среда.

Каждый процесс имеет среду, первоначально унаследованную от родителя, но она локальна для процесса после первоначального создания.

Вы можете изменять только свои собственные, если только вы не будете разбираться в процессе с помощью отладчика.

Ответ 5

Переменные среды всегда являются "локальными" для выполнения процесса, которые команда экспорта позволяет устанавливать переменные среды для подпроцессов. Вы можете посмотреть .bashrc, чтобы установить переменные среды в начале оболочки bash. То, что вы пытаетесь сделать, кажется невозможным, поскольку процесс не может изменить (или получить доступ?) К переменным среды другого процесса.

Ответ 6

Вы можете обновить файл ~/.bashrc или ~/.bash_profile, который используется для инициализации среды.

Ответ 7

Взгляните на поведение загрузки вашей оболочки (объяснено в man-странице, обычно ссылаясь на .XXXshrc или .profile). Некоторые файлы конфигурации загружаются во время входа в интерактивную оболочку, некоторые загружаются каждый раз при запуске оболочки. Размещение вашей переменной в последнем может привести к поведению, которое вы хотите, например. всегда имея набор переменных с использованием этой отдельной оболочки (например, bash).

Ответ 8

~/.bin/SOURCED/lazy script для сохранения и загрузки данных в виде плоских файлов для системы.

[ ! -d ~/.megadata ] && mkdir ~/.megadata

function save_data {
[ -z "$1" -o -z "$2" ] && echo 'save_data [:id:] [:data:]' && return
local overwrite=${3-false}
[ "$overwrite" = 'true' ] && echo "$2" > ~/.megadata/$1 && return
[ ! -f ~/.megadata/$1 ]   && echo "$2" > ~/.megadata/$1 || echo ID TAKEN set third param to true to overwrite
}

save_data computer engine
cat ~/.megadata/computer
save_data computer engine
save_data computer megaengine true

function get_data {
[ -z "$1" -o -f $1 ] && echo 'get_data [:id:]' && return


[ -f ~/.megadata/$1 ]   && cat ~/.megadata/$1 || echo ID NOT FOUND
:
}

get_data computer
get_data computer

Ответ 9

Если вам нужно динамически устанавливать и ссылаться на переменные среды в сценариях оболочки, есть работа. Судите сами, стоит ли делать, но вот оно.

Стратегия предполагает наличие "набора" script, который динамически записывает "load" script, который имеет код для установки и экспорта переменной окружения. Затем "load" script выполняется периодически другими скриптами, которые должны ссылаться на переменную. BTW, та же стратегия может быть выполнена путем записи и чтения файла вместо переменной.

Вот быстрый пример...

Set_Load_PROCESSING_SIGNAL.sh

#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
echo "#!/bin/bash" > $PROCESSING_SIGNAL_SCRIPT
echo "export PROCESSING_SIGNAL=$1" >> $PROCESSING_SIGNAL_SCRIPT
chmod ug+rwx $PROCESSING_SIGNAL_SCRIPT

Load_PROCESSING_SIGNAL.sh(это динамически создается при выполнении вышеописанного)

#!/bin/bash
export PROCESSING_SIGNAL=1

Вы можете проверить это с помощью Test_PROCESSING_SIGNAL.sh

#!/bin/bash
PROCESSING_SIGNAL_SCRIPT=./Load_PROCESSING_SIGNAL.sh
N=1
LIM=100
while [ $N -le $LIM ]
do
# DO WHATEVER LOOP PROCESSING IS NEEDED
echo "N = $N"
sleep 5
N=$(( $N + 1 ))

# CHECK PROCESSING_SIGNAL
source $PROCESSING_SIGNAL_SCRIPT
if [[ $PROCESSING_SIGNAL -eq 0 ]]; then
# Write log info indicating that the signal to stop processing was detected
# Write out all relevent info
# Send an alert email of this too
# Then exit
echo "Detected PROCESSING_SIGNAL for all stop. Exiting..."
exit 1
fi
done

Ответ 10

Из 2-го абзаца из David W. были получены следующие ответы: "Если одна оболочка порождает подоболочку, эта подоболочка имеет доступ к родительским переменным среды, но если эта подоболочка создает переменную среды, она не доступна в родительской оболочке."

Если пользователь должен позволить родительской оболочке обращаться к вашим новым переменным среды, просто выполните следующую команду в родительской оболочке:

source <your_subshell_script>

или с помощью ярлыка

. <your_subshell_script>

Ответ 11

записать его во временный файл, скажем ~/.myglobalvar и прочитать его откуда угодно

echo "$myglobal" > ~/.myglobalvar

Ответ 12

На самом деле я нашел способ добиться этого (что в моем случае было использовать bash script для установки нескольких учетных данных безопасности)

Я просто вызываю bash изнутри script, а порожденная оболочка теперь имеет значения экспорта

export API_USERNAME=abc
export API_PASSWORD=bbbb
bash

теперь вызов файла с помощью ~/.app-x-setup.sh даст мне интерактивную оболочку с настройками значений среды