Переменные профиля bash

Я заранее прошу прощения, но не настолько разбираюсь в файлах bash, как хотелось бы.

Я использую Cygwin. У меня есть bash_profile, в который я сохраняю свои переменные, чтобы потом их можно было выполнить. У меня также есть ссылка на мой файл bash_rc. Вот мой код.

if [ -f "${HOME}/.bashrc" ] ; then
    source "${HOME}/.bashrc"
fi

export TOSROOT="X/Y/Z"

Теперь, когда я сохраняю файл и закрываю его, я возвращаюсь в Cygwin и делаю

echo $TOSROOT #nothing

Пусто. Любая помощь в том, почему не работают bash_profile / rc и т. д.? Почему я не могу использовать переменные.

Примечание. Я могу вводить текст в командной строке.

export TOSROOT="/X/Y/Z"

echo $TOSROOT #X/Y/Z

И это работает.

PS4=':$BASH_SOURCE:$LINENO+' bash -x -i #this returns

::3+PS4=':$BASH_SOURCE:$LINENO+'
::3+bash -x -i
:/etc/bash.bashrc:21+[[ -z '' ]]
:/etc/bash.bashrc:21+CYG_SYS_BASHRC=1
:/etc/bash.bashrc:24+[[ himBH !- *i* ]]
:/etc/bash.bashrc:27+PS1='\[\e]0;\w\a]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '
:/home/tdyuser/.bashrc:27+[[ himxBH != *i* ]]

В вашем посте есть несколько опечаток. Надеюсь, их тоже нет в реальном коде? "${HOME/.bashrc" должен быть "$HOME/.bashrc" или "${HOME}/.bashrc"; sourch должен быть source; строка с именем файла, который нужно получить, требует закрывающих кавычек.

Charles Duffy 10.08.2018 17:15

В любом случае, чтобы отследить, что на самом деле выполняется во время запуска оболочки, запустите PS4=':$BASH_SOURCE:$LINENO+' bash -x -l -i (все в одной строке, без перевода строки между назначением PS4 и вызовом bash), и вы увидите, какие точечные файлы запускаются и что они делают.

Charles Duffy 10.08.2018 17:17

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

impression7vx 10.08.2018 17:20

На самом деле это не вопрос программирования. Вы должны попробовать спросить на Суперпользователь.

Sneftel 10.08.2018 17:21

Пожалуйста, редактировать вопрос, чтобы включить журнал xtrace, собранный, как описано выше.

Charles Duffy 10.08.2018 17:24

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

impression7vx 10.08.2018 17:25

Создайте минимальный воспроизводимый пример - то есть сделайте резервную копию ваших исходных точечных файлов, воссоздайте проблему с максимально коротким кодом и включите как (1) подмножество кода, которое вы считаете абсолютно необходимым для воссоздания проблемы, и (2) журналы xtrace из тот. Если вы не можете создать проблему только с кодом, включенным в сам вопрос, включенным в путь выполнения, то как мы можем ожидать, что ответим на нее только с тем же содержанием?

Charles Duffy 10.08.2018 17:26

См. Также раздел «Уловки для обрезки» на sscce.org для получения общих рекомендаций по выбору самого короткого воспроизводящего устройства для решения проблемы.

Charles Duffy 10.08.2018 17:28

... при этом, если вы используете PS4, которую я предоставил выше, журналы сообщат вам, какие (если есть) строки ваших .bashrc и .bash_profile выполняются, поэтому, если вы ищете места для начала ... Что ж, это было бы хорошо, чтобы убедиться, что TOSROOT действительно настраивается.

Charles Duffy 10.08.2018 17:30

Кстати, имейте в виду, что .bash_profile работает в оболочках входа в систему, а в интерактивных оболочках без входа в систему нет. В зависимости от вашей ОС (и того, как она решает, какие оболочки вызывать в качестве оболочек входа - MacOS, например, создает оболочку входа в систему при открытии нового терминала внутри существующего сеанса; многие традиционные UNIXen этого не делали / не делали), это может означать, что вам нужно полностью войти и снова войти в систему, а не просто запускать новое окно терминала. (Напротив, .bashrc должен работать для каждой интерактивной оболочки).

Charles Duffy 10.08.2018 17:31

Я использую Cygwin, поэтому я могу полностью выйти из Cygwin и снова войти в систему, и он не будет ассоциироваться.

impression7vx 10.08.2018 17:33

... чтобы имитировать поток вызова для интерактивной оболочки без входа в систему, просто оставьте аргумент -l выше, сделав его PS4=':$BASH_SOURCE:$LINENO+' bash -x -i

Charles Duffy 10.08.2018 17:33

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

Charles Duffy 10.08.2018 17:35

Нет, получил разрешение на публикацию. Один момент

impression7vx 10.08.2018 17:36

Итак, -x -i не включает .bash_profile, а просто переходит прямо на .bashrc, как мы и ожидали. Как насчет -x -l -i, чтобы мы увидели, что делает оболочка входа в систему?

Charles Duffy 10.08.2018 17:40

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

impression7vx 10.08.2018 17:41

В отношении bash_profile ничего не печатается, хотя

impression7vx 10.08.2018 17:43

Подождите, вы имеете в виду, что -x -l -i не содержит никаких ссылок на .bash_profile? Это интересно. Есть вообще .profile?

Charles Duffy 10.08.2018 17:43

Итак, как мне в этом случае использовать переменные из bash_profile?

impression7vx 10.08.2018 17:44

Позвольте нам продолжить обсуждение в чате.

Charles Duffy 10.08.2018 17:44
0
20
441
1

Ответы 1

~/.profile, /etc/profile, ~/.bash_rc и /etc/bashrc обрабатываются только при вызове оболочки. Если вы внесли изменения, выйдите из текущего сеанса оболочки и начните новый.

Да, я могу открыть / закрыть / перезагрузить и т.д. Ничего не происходит.

impression7vx 10.08.2018 17:22

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