Возникли проблемы с Ubuntu .profile и .bashrc

Я новичок в линуксе. В настоящее время я прохожу онлайн-учебник по настройке Kafka. В нем говорится добавить путь к моему каталогу bin kafka следующим образом в мой файл .profile, который я сделал, как показано ниже:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi

# set PATH so it includes user's private bin directories
DOCKER="/usr/local/bin/docker-compose"
PATH="$HOME/bin:$HOME/.local/bin:$PATH:$DOCKER"
# Ubuntu make installation of Ubuntu Make binary symlink
PATH=/home/username/.local/share/umake/bin:$PATH
cat ~/.ssh/config.d/* > ~/.ssh/config
PATH="$PATH:/home/username/softwares/kafka/kafka_2.11-1.0.0/bin"

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

Затем в учебнике предлагается отредактировать файл .bashrc. Это уже было. Это был довольно большой файл. Я добавил в конец файла следующую строку (согласно руководству):

. ~/.profile

После этого я открыл другой терминал в соответствии с руководством, чтобы увидеть, что я все еще получаю все параметры, связанные с kafka, после kafka и tab. Я видел это на терминале, я не получал свое имя пользователя, и это было пустое окно терминала. Затем я отредактировал .bashrc, чтобы удалить добавленную строку, а затем попытался открыть новый терминал, и я мог видеть свое имя пользователя на терминале. Затем я закрыл все терминалы. Открыл новый и набрал kafka и tab, и у меня не было никаких вариантов, как раньше. Затем я открыл файл .profile и увидел, что путь kafka все еще добавлен. Затем я попытался повторить $PATH, и на этот раз пути kafka не было.

Я действительно смущен тем, что здесь происходит. Не могли бы вы немного объяснить и дать мне знать, как загружать .profile каждый раз, когда я открываю терминал, и почему я больше не вижу путь кафки, когда я делаю эхо в PATH.


person T Anna    schedule 13.10.2018    source источник
comment
После того, как вы добавите что-либо в .bashrc, вы должны использовать свой .bashrc, чтобы изменения были видны. Поэтому внесите изменения, а затем в командной строке введите . ~/.bashrc (это точечный пробел ~/.bashrc)   -  person David C. Rankin    schedule 13.10.2018
comment
Когда я это делаю, команда не заканчивается, и мне пришлось нажать ctrl+C, чтобы выйти. Затем я попытался открыть новый терминал и снова получил пустой терминал.   -  person T Anna    schedule 13.10.2018
comment
Это означает, что вы что-то испортили в своем .bashrc, из-за чего он не был чистым. Войдите как root (или другой пользователь и su), затем перейдите в свой пользовательский каталог, отредактируйте свой ~/.bashrc и удалите проблемную проблему.   -  person David C. Rankin    schedule 13.10.2018


Ответы (1)


Что происходит:

Источник:

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

Некоторые файлы загружаются автоматически при определенных условиях.

Типы оболочки:

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

  1. Войти с помощью оболочки bash
  2. Запустить bash из терминала

Оболочка входа: оболочка, которая создается при первом входе в систему. т.е. shell, который вы получаете, когда впервые подключаетесь по ssh к серверу или входите в систему без графического интерфейса.

Интерактивная оболочка без входа в систему: интерактивная оболочка, которая не является оболочкой входа в систему. т.е. Оболочка, которая создается, когда вы открываете терминальное приложение для рабочего стола, или оболочка, которую вы получаете при запуске bash после входа в систему через ssh

~/.profile и ~/.bash_profile, и ~/.bash_login могут быть автоматически получены оболочками входа в систему. Поэтому, вероятно, вы получаете этот путь при первом входе в систему или вручную создаете (.) .profile

Обратите внимание, что если .bash_profile существует и доступен для чтения, то Bash не будет читать .bash_login или .profile. https://askubuntu.com/questions/98433/run-a-script-on-login-using-bash-login

Оболочка входа в систему ищет … «~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке, а также читает и выполняет команды из первой существующей и доступной для чтения» man bash (кредит: cdarke)

Вероятно, после этого вы пытаетесь открыть bash внутри настольного терминала или вторичной оболочки bash, и вы не получаете новый путь, потому что только ~/.bashrc, а не ~/.profile находится в интерактивных оболочках без входа в систему, и вы делаете не иметь этой директивы PATH в вашем ~/.bashrc

Решение:

Добавьте PATH="$PATH:/home/username/softwares/kafka/kafka_2.11-1.0.0/bin" к ~/.bashrc вместо ~/.profile

Ссылка:

https://serverfault.com/questions/261802/what-are-the-functional-differences-between-profile-bash-profile-and-bashrc

Примечание.

Не беспокойтесь о том, что он не отображается в оболочках входа, потому что, как вы видите, .profile вызывает .bashrc

# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi

Спасибо cdarke за поправки в терминологии и примечание о том, как работают конфигурации входа в систему.

person yosefrow    schedule 13.10.2018
comment
Спасибо, ваше решение сработало, но я его не понимаю. Когда вы говорите подоболочку входа в систему, знаете ли вы, что я вошел в свою систему как конкретный пользователь и для определенных пользователей читается только .bashrc, а не .profile? Но потом вы говорите, что .profile вызывает .bashrc. Извините, я в замешательстве. Не могли бы вы объяснить это по-простому. - person T Anna; 13.10.2018
comment
Ссылка, которой вы поделились, говорит, что .profile предназначен для вещей, которые конкретно не связаны с Bash, таких как переменные среды PATH и друзья, и должен быть доступен в любое время. Тогда зачем мы добавляем путь kafka в .bashrc? - person T Anna; 13.10.2018
comment
Я переписал, пожалуйста, скажите, понятно ли теперь. Существуют разные виды ракушек. Bash используется по умолчанию в большинстве современных систем. Я знаю, что в системах Ubuntu .profile вызывается только в оболочках входа. Поэтому он не вызывается по умолчанию в настольном терминале. - person yosefrow; 13.10.2018
comment
независимо от того, является ли оболочка типом входа в систему или нет, сама оболочка может быть bash, dash или другими типами оболочек. - person yosefrow; 13.10.2018
comment
@TAnna, кстати, если мой ответ был полезен, отметьте его как принятый, чтобы следующий человек, который увидит этот вопрос, знал, какой ответ сработал. Спасибо! - person yosefrow; 13.10.2018
comment
только ~/.bashrc -- не ~/.profile находится в подоболочках Подоболочка ничего не является источником, подоболочка представляет собой список команд в круглых скобках , вы, вероятно, думаете об интерактивной оболочке без входа в систему. - person cdarke; 14.10.2018
comment
Если у вас есть .bash_profile (даже если он пустой), то .profile не запустится. От man bash: После чтения этого файла он ищет ~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке, а также читает и выполняет команды из первого существующего и доступного для чтения файла.< /я> - person cdarke; 14.10.2018
comment
@cdarke Привет, большое спасибо за ваши исправления. Я добавил их в ответ. Пожалуйста, дайте мне знать, если вы видите что-то еще, что нуждается в исправлении. - person yosefrow; 14.10.2018