Должен ли я поместить псевдоним в .bashrc или .profile?

Я хочу, чтобы при каждом открытии оболочки был доступен следующий псевдоним:

export ZONE="us-eastern1-c"
export INSTANCE_NAME="myInstance"
alias gc='gcloud compute ssh --zone=$ZONE jupyter@$INSTANCE_NAME -- -L 8080:localhost:8080'

Должен ли я поместить его в .bashrc или .profile? Кроме того, просматривая .bashrc, я обнаружил:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

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

3
задан 5 September 2019 в 22:29

1 ответ

TL; DR: На основе описания Вы дали, оно может все войти ~/.bashrc, даже при том, что Вы обычно не хотели бы помещать переменные среды там. Существуют некоторые другие изменения, которые можно хотеть внести: экспорт переменных является, вероятно, ненужным, и их расширения лучше всего заключаются в кавычки.

Как с Bash искажает в целом, можно поместить Ваш gc псевдоним в ~/.bashrc или в ~/.bash_aliases но это не должно входить .profile. Если переменные только когда-либо необходимы в оболочках, где псевдонимы (которые расширяются до команд, которые используют их) доступны, то хорошо на самом деле класть их на то же место как псевдонимы.

В этом случае я предложил бы вставить псевдонимы и переменные ~/.bashrc, с тех пор, в то время как возможно вставить любые команды ~/.bash_aliases, необычно поместить что-либо кроме определений псевдонима там, и выполнение так может смутить будущих читателей Вашего кода (возможно, включая себя) и заставить их задаваться вопросом, смотрят ли они на ошибку. Конечно, Вы могли вставить псевдонимы ~/.bash_aliases и связанные переменные в ~/.bashrc, но я думаю, что это намного более сбивало бы с толку.

Обычно не нужно вставлять переменные среды ~/.bashrc. Большую часть времени определенная для пользователя переменная среды должна или войти ~/.pam_environment, который использует его собственный специальный синтаксис, или ~/.profile, который содержит команды оболочки как ~/.bashrc делает. (См. также эти комментарии.) Одна из причин этого - то, что те методы заставляют переменную среды быть доступной в большинстве ситуаций, где она может быть необходима, который вставление его ~/.bashrc сбои для достижения; одна из причин этого - это ~/.bashrc только используется bash, и когда Вы входите в систему графически, это не bash. Но когда Вам только нужны Ваши переменные, когда псевдонимы, которые используют их, также доступны, это не применяется.

Тем не менее, я подозреваю, что это - на самом деле не исключение. Но вместо того, чтобы должным быть пойти в другое место, чем .bashrc, похоже, что те переменные не должны быть переменными среды. Это должно сказать, что похоже, что Вы не должны экспортировать их, но могли вместо этого просто записать:

ZONE="us-eastern1-c"
INSTANCE_NAME="myInstance"

Это о различии между переменной оболочки и переменной среды. В оболочках стиля Границы как Bash все переменные среды являются переменными оболочки, но единственные переменные оболочки, которые являются переменными среды, являются теми, которые оболочка, наследованная от среды ее родительского процесса или которые были экспортированы с export встроенный.

Если программы Вы выполняете потребность наследоваться ZONE и INSTANCE_NAME в их среды они необходимо действительно экспортировать их как переменные среды. И если Вам нужно это даже в контекстах где ~/.bashrc не получен (например, запуская скрипты), затем не достаточно вставить те переменные среды ~/.bashrc.

Иначе они могут просто быть переменными оболочки, как показано выше. Оболочка все еще найдет их и выполнит расширение параметра на них в командах, сгенерированных путем расширения gc псевдоним.


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

alias gc='gcloud compute ssh --zone="$ZONE" "jupyter@$INSTANCE_NAME" -- -L 8080:localhost:8080'

Учитывая их начальные значения Вы показали, который только имеет значение когда $IFS имеет необычное значение, так как они не содержат ни пробела, ни любых globbing символов как *. Но это - плохая практика для выполнения закрывшего кавычки расширения параметра, если Вы на самом деле не намереваетесь для разделения слова или globbing произойти.

Что еще более важно, если те переменные повторно присвоены, новые значения используются, когда команда, до которой расширяется псевдоним, выполняется. Псевдоним все еще расширится до той же команды (команда, до которой это расширяется, не зависит от значений тех переменных), но последующие расширения параметра, выполненные на $ZONE и $INSTANCE_NAME развернет их до новых значений. Заключение в кавычки тех расширений с двойными кавычками принимает меры против неправильного поведения, когда переменные сознательно содержат пробел (или что-либо в $IFS) или любой из *, ? и [. Но необходимо сделать это, даже если Вы верите или знаете, что они никогда не должны брать такие значения, поэтому если им дают такое значение случайно, Вы получаете понятные сообщения об ошибках, а не причудливое и неожиданное поведение.

Если Вы на самом деле не хотите, чтобы те переменные существовали вообще, и Вы только используете их для создания определения gc больше самодокументирования, затем можно определить gc как функция (в ~/.bashrc) вместо псевдонима и делают их локальными переменными:

gc() {
    local ZONE="us-eastern1-c"
    local INSTANCE_NAME="myInstance"
    gcloud compute ssh --zone="$ZONE" "jupyter@$INSTANCE_NAME" -- -L 8080:localhost:8080
}
4
ответ дан 1 December 2019 в 15:48

Другие вопросы по тегам:

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