Я видел много подробных объяснений того, как .bashrc
, .bash_profile
и различные другие файлы профиля взаимодействуют, поэтому мне не нужно объяснять, как они сочетаются друг с другом (я читал много таких объяснений, но ни один из них не отвечает, как подойти к приведенному ниже). Я был бы очень признателен, если бы знал, что лучший способ или передовая практика, или наиболее рациональный, или наиболее эффективный способ (на мой взгляд, ясность, логика и эффективность) для достижения следующих сценариев:
Если мне нужна строка кода bash, которая запускается только при открытии любого нового графические терминалы, в какой файл я должен поместить этот код?
Если мне нужна строка кода bash, которая запускается только при входе в систему fo В любых новых интерактивных оболочках, где мне разместить этот код?
Если мне нужна строка кода bash, которая открывается в обоих графических терминалах и интерактивных оболочках входа в систему, какой файл должен Я поместил этот код в?
• Важный момент: хочу подчеркнуть, что я хотел бы, чтобы эти строки кода только запускались при открытии оболочки или терминала, а не ] для запуска во время вызова любого старого однострочного эха «Hello World!»
скрипта, который я запускаю. т.е. я хочу, чтобы они применялись только тогда, когда я выбираю , чтобы открыть оболочку / терминал, а затем начинаю вводить текст, а для других сценариев не включать это. Должно быть просто, не так ли?
Меня это действительно смущает, потому что на них действительно должно быть невероятно просто ответить, и тем не менее, я никогда не видел ответа. Я видел множество непостижимых ответов о том, как нам нужно использовать источник .profile
из .bashrc
, или, может быть, все наоборот (в зависимости от погоды) и "вы должны прочитать документ x, и документ y, и , тогда все будет ясно!" - ответы становятся все более запутанными, и на три вышеприведенных сценария сложно получить ответ: просто / ясно / однозначно. Было бы очень приятно знать, в какой файл нужно поместить каждый фрагмент кода, чтобы он работал в этом сценарии? Я не возражаю, если для этого также потребуется минимальная структура. ie "Для сценария 3 добавьте код в file-x
, но для облегчения этого вы также должны поместить следующий блок if-then-fi
в file-y
] ", но было бы огромным бонусом, если бы ответ для трех сценариев мог быть кроссплатформенным (то есть универсальным решением, применимым к debian / ubuntu, centos / red hat, MacOS, suse и т. д., а также в Gnome / KDE / MacOS и т. д. для графического терминала). Если нет рационального / логического способа добиться этого, то это, мягко говоря, досадно, но, надеюсь, я ошибаюсь!Надеюсь, кто-то покажет мне ясный, эффективный, , надеюсь, кроссплатформенный (но я знаю, что это может быть слишком много, чтобы требовать), повторяемый, простой и однозначный способ достижения вышеуказанного.
Я использую:
~ / .profile
для установки переменных среды
~ / .bashrc
для
Обратите внимание, что ~ / .profile не является специфичным для bash, поэтому не используйте специфичные для bash команды. Это означает
# export FOO=bar # bad
FOO=bar; export FOO # good
Поскольку все мои терминальные приложения с графическим интерфейсом пользователя настроены на использование оболочки входа в систему, в моем ~ / .profile я помещаю это:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Кроме того, мне нравится сохранять мой PATH аккуратным, без дубликатов, поэтому вместо использования
PATH="$PATH:/some/path/1"
PATH="/some/path/2:$PATH"
У меня
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
[ ! -d "$1" ] && return
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
# then
pathmunge "/some/path/1" after
pathmunge "/some/path/2" before
pathmunge "/some/path/1" before # already in PATH, no changes made
bash
распознает три состояния оболочки :
ssh host.domain ls -l / etc
), то вы неявно вызываете неинтерактивную оболочку на удаленном компьютере и эта оболочка, в свою очередь, выполняет команду, а затем завершает работу. Как работают файлы запуска:
/ etc / profile
(это глобальный файл для всех пользователей), а затем ищет файлы .bash_profile
, .bash_login
или .profile
- в этом порядке - в домашнем каталоге отдельного пользователя и выполняет команды из того файла, который будет найден первым. В Ubuntu по умолчанию существует только файл .profile
, и по умолчанию он также включает команды для выполнения содержимого файла .bashrc
. Однако вы можете удалить код для запуска .bashrc
из файла .profile
или создать любой из двух других файлов с помощью нужных вам команд, а затем . профиль
не будет запущен. /etc/bash.bashrc
(это global для всех пользователей), а затем из файла .bashrc
в домашнем каталоге отдельного пользователя bash
в окне терминала) не запускайте ни один из этих файлов .bashrc
только в домашнем каталоге пользователя. Однако по умолчанию файл Ubuntu .bashrc
содержит в начале фрагмент кода, который останавливает дальнейшее выполнение, если оболочка не интерактивна. В некоторых случаях есть еще несколько тонкостей, но в основном он работает как указано выше.
Таким образом, решение зависит от того, хотите ли вы сохранить текущее содержимое по умолчанию файлов .profile
и .bashrc
или нет.
Если вы хотите сохранить их:
bash
в сеансе терминала. Если вы хотите избежать этого, вам следует немного изменить решение:
[["$ TERM" == "xterm" *]] && ["$ SHLVL" = "1"] && run-command
.profile
.bashrc
(не забудьте вставить его под исходным кодом, который завершается в случае, если оболочка не интерактивна). Однако помните, что, как и в случае 1), ваш код будет запускаться всякий раз, когда вы запускаете другой экземпляр оболочки, поэтому, чтобы избежать этого, он должен быть похож на ["$ SHLVL" = "1"] && run-command
Если вы хотите сделать это для всех пользователей, а не только для себя, используйте файлы /etc/bash.bashrc
и / etc / profile
вместо ~ / .bashrc
и ~ / .profile
.
Если вы хотите удалить значения по умолчанию:
.bashrc
во что-нибудь другое (чтобы иметь возможность восстановить его позже, если вы передумали) .bash_profile
или .bash_login
а затем: .bash_profile
или .bash_login
(какой бы файл вы ни создали) .bashrc
в ваш файл .bash_profile
или .bash_login
(в зависимости от того, что вы создали), поскольку он нет там по умолчанию. Затем используйте решение Артура - однако, как и в случае 1) выше,при необходимости измените его на форму [[$ - == * "i" *]] && ["$ SHLVL" = "1"] && run-command
Я не рекомендую удалять значения по умолчанию в случае общесистемные файлы ( /etc/bash.bashrc
и / etc / profile
):)
Мое предложение.
Сценарий 1:
Поместите свою команду в ~ / .bashrc
следующим образом: [["$ TERM" == "xterm" *]] && run-command
(проверьте, является ли терминал xterm)
Сценарий 2:
Поместите свою команду в ~ / .bash_login
(не забудьте указать исходный код ~ / .bashrc
, если вы все еще хотите его запустить)
Сценарий 3:
Поместите свою команду в ~ / .bashrc
следующим образом: [[$ - == * "i" *]] && run-command
(проверьте, является ли оболочка интерактивной)
Я использую эти параметры в моем .bashrc
более или менее для тех же целей, что и вы, насколько я понимаю.