Как мне сохранить функции/переменные локальными для моего zshrc?

Любая переменная, которую я объявляю в своем zshrc, доступна в оболочке как переменная среды. Я не хочу, чтобы это произошло.

Я попытался поместить переменные в функцию и установить их как локальные, но тогда функция доступна за пределами zshrc.

Как мне сделать так, чтобы все, что происходит в моем zshrc, оставалось в моем zshrc?


person Dean    schedule 02.12.2012    source источник
comment
Осторожно, в этой истории есть нечто большее, чем кажется на первый взгляд. Я приглашаю вас проверить мой ответ.   -  person jasonleonhard    schedule 07.02.2017


Ответы (4)


Они доступны, но не экспортируются, поэтому скрипты, запускаемые из командной строки, не получают эти переменные. Если ваш .zshrc выглядит как

function zshrc()
{
    local VAR=1
    # Do stuff
}
zshrc

и вы больше никогда не захотите запускать функцию zshrc, вы можете просто сделать

unfunction zshrc

после.

person ZyX    schedule 02.12.2012
comment
Предпочтительно использовать анонимную функцию, как в ответе qqx. Тогда вам не нужен unfunction. - person paulmelnikow; 08.03.2017

Если вы используете последнюю версию zsh, вы можете использовать анонимную функцию:

function () {
  local xyz=abc
  # whatever
}

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

Это работает для любого исходного файла, а не только для zshrc.

person qqx    schedule 02.12.2012

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

  1. Откройте новое окно терминала.
  2. Запустите exec zsh или exec bash в зависимости от вашей оболочки. Это просто очищает ваши локальные переменные, которым не было присвоено слово local.

Избегайте этого

method_name(){
  a=11
  echo $a
}

Правильный пример

method_name(){
  local a=11
  echo $a
}

Эта переменная привязана к имени функции method_name и доступна только внутри функции при вызове (а не после).

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

local z=11

И назовите это так

echo $z

Кроме того, переменные среды отличаются от локальных переменных.

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

Посмотрите этот справочник, чтобы узнать больше о переменных среды и соответствующих оболочках

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

Вы можете быстро просмотреть переменные среды с помощью env или printenv

Соглашение состоит в том, чтобы использовать ПРОПИСНЫЕ РЕГИСТРЫ

Чтобы временно установить переменную среды (сохраняется до тех пор, пока вы не закроете терминал)

export A=11 or export B="11 is part of this string"

Предполагая, что вы открыли новое окно терминала или получили исходный файл .zshrc или .bashrc или что бы вы ни использовали, теперь вы можете использовать эту переменную среды, пока не закроете сеанс терминала. Примечание: не используйте $ при настройке, но используйте $ при ссылке на переменную.

Примеры

echo "A is equal to: $A and that is pretty nice"

echo "$A"

Как получить файл

source ~/path/to/file/filename

Пример

source ~/.bash_profile

Чтобы установить переменную среды (пока вы не удалите ее или не установите снова)

Используйте приведенный выше код, но поместите его в свой ~/.bash_profile или ~/.zshrc или другой соответствующий файл. Сохраните файл и укажите источник.

Пример

export B="11 is part of this string"

Теперь вы можете просмотреть его с помощью

env

Чтобы удалить эту переменную среды, удалите ее из файла и снова создайте файл.

Чтобы временно удалить переменную окружения, используйте unset

Пример

unset B

Обратите внимание, что при снятии с охраны нет $.

Чтобы установить переменные среды из командной строки

export BLABLA="environment variable set from the command line, saved in file for later use"

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

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

person jasonleonhard    schedule 07.02.2017
comment
Хотя это правильно, это не помогает ответить на вопрос ОП. - person paulmelnikow; 08.03.2017

По-видимому, в bash существует соглашение о том, чтобы называть «частные» функции двойным подчеркиванием. Конечно, на самом деле они не являются частными. Я использую это соглашение в своем .zshrc.

function __comment()
{
  curr=`pwd`
  echo "$curr $*"
}

__comment 'Here is a Comment'
person zzapper    schedule 01.05.2021