Я пытаюсь создать глобальную переменную счетчика для наблюдения сколько раз ~/.profile
выполняется. Таким образом:
В ~/.bashrc
:
# ...
if [ "$PROFILE_EXEC_TIMES" = "" ]; then
export PROFILE_EXEC_TIMES=0
fi
let "PROFILE_EXEC_TIMES += 1"
В ~/.profile
:
# ...
export PROFILE_EXEC_TIMES
let "PROFILE_EXEC_TIMES += 1"
Но когда я открываю новую оболочку и запись echo $PROFILE_EXEC_TIMES
, все, что я получаю, 1
. $PROFILE_EXEC_TIMES
должны быть по крайней мере 2. Я подозреваю это ~/.profile
не получен ударом... если так, что я должен сделать для проверки сколько раз ~/.profile
выполняется?
Править:
Я заметил это /etc/gdm/Xsession
получает ~/.profile
следующей строкой:
test -f "$HOME/.profile" && . "$HOME/.profile"
и ~/.bashrc
получен в ~/.profile
следующими строками:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Кроме того, я имею, добавляет следующая строка к ~/.bashrc
& ~/.profile
:
echo $(cd ${0%/*} && echo $PWD/${0##*/}) >> /home/myUserName/a
и видел, что только одна строка была добавлена к файлу после того, как я вошел в систему своего пользователя.
Я хочу подчеркнуть, что моя цель здесь:
Обнаружение, сколько раз ~/.profile
выполняется, когда пользователь входит в систему.
Дополнительные детали:
$ uname -a
Linux my-desktop 2.6.32-25-generic #45-Ubuntu SMP Sat Oct 16 19:52:42 UTC 2010 x86_64 GNU/Linux
$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.1 LTS"
Из ваших комментариев к моему первоначальному ответу видно, что ваш настоящий вопрос звучит так: «Источник ~ / .profile создан GNOME?» Ответ - да. Смотрите в /etc/gdm/Xsession
:
# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.profile" && . "$HOME/.profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"
С man-страницы bash:
Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с параметром --login, она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет
blockquote>~/.bash_profile
,~/.bash_login
и~/.profile
в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения.Таким образом, у вас может быть файл с именем .bash_profile или .bash_login в вашем домашнем каталоге. Если что-то из этого существует, bash будет использовать его вместо .profile.
Во-первых, если вы хотите посмотреть, что происходит в сценарии оболочки, поместите set -x
вверху (сразу после строки #!
, если есть). Это печатает след выполнения на стандартной ошибке. Здесь стандартная ошибка оболочки должна быть перенаправлена на ~/.xsession-errors
.
В вашем вопросе есть противоречие: вы говорите, что ваша цель «выяснить, сколько раз ~ / .profile выполняется, когда пользователь входит в систему», а затем вы продолжаете взламывать .bashrc
. Простое помещение export PROFILE_EXEC_TIMES; let "PROFILE_EXEC_TIMES += 1"
в ваш .profile
действительно подсчитывает, сколько раз оно получено, и неудивительно, что результат равен 1 (вы входите только один раз).
Ваши .profile
источники .bashrc
, что странно, поскольку .profile
используется при входе в систему, а .bashrc
- это файл конфигурации bash, когда он интерактивный. Возможно, вы сделали это, чтобы обойти ошибку проектирования в bash, из-за которой он не читает .bashrc
в оболочке, которая является одновременно оболочкой входа в систему и интерактивной; Я предпочитаю иметь .bash_profile
, который является источником как .profile
, так и (если оболочка является интерактивной) .bashrc
.
Обратите внимание, что ваш .profile
позаботится о том, чтобы не получать .bashrc
, если оболочка не bash. Это объясняет, почему .bashrc
не читается при входе в систему: /etc/gdm/Xsession
выполняется /bin/sh
, что в Ubuntu 10.04 - dash , а не bash.
В верхней части .bashrc
у вас есть: «Если не работает в интерактивном режиме, ничего не делайте», комментируя строку [ -z "$PS1" ] && return
. На самом деле, эта линия не сделает этого; PS1
довольно часто устанавливается в неинтерактивных оболочках (например, он устанавливается /etc/profile
). Надежным тестом для интерактивного bash является [[ $- = *i* ]]
.
Вас также может заинтересовать Разница между .bashrc и .bash_profile .
~/.profile
выполняется только для оболочек входа в систему (bash --login
), а не для всех оболочек, вот для чего ~/.bashrc
. Поэтому счет 1 должен быть правильным, так как ~/.profile
выполняется один раз при входе в систему.
Если вы не доверяете счетчику переменных среды, просто напишите файл с уникальным именем файла (что-то вроде $(uuidgen)
), чтобы отслеживать выполнение ~/.profile
.
Вы получаете .profile в .bashrc? В противном случае Bash не считает его. У Вас должно быть что-то вроде этого, вероятно, лучше всего помещенное наверху Вашего .bashrc:
[ -r ${HOME}/.profile ] && . ${HOME}/.profile
Это удостоверится, что .profile и существует и читаем, и если это - чем процесс это.
@Dor: У меня пока недостаточно репутации, чтобы писать комментарии, но я могу ответить вам на последний комментарий от 7 декабря 10 в 12:41, который был:
«Когда я добавляю код для обоих файлов и входа в GNOME, в файле Xsession.log по-прежнему есть одна строка (файл Xsession.log пуст перед каждым входом в систему). Почему? В последнем случае должно быть не менее двух строк. "
Нет, потому что когда вы входите в Gnome (используя GDM), ~/.bashrc
НЕ выполняется, только ~/.profile
. Как объяснил Жиль, Гном называет /etc/gdm/Xsession
, что, в свою очередь, приводит источники ~/.profile
. И ~/.profile
ТОЛЬКО источники ~/.bashrc
, если работает Bash .
Из ~/.profile
:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
И когда вы входите в Gnome / GDM, вы не используете Bash, потому что, как отметил Жиль, /etc/gdm/Xsession
имеет использует директиву #! /bin/sh
, которая в Ubuntu является символической ссылкой на dash , а не bash.
Таким образом, весь процесс входа в Gnome не вызывает bash. Поэтому такие файлы, как / etc / profile, ~ / .bash_login, ~ / .bash_profile, не вызываются автоматически. Вот почему /etc/profile
и ~/.profile
должны были быть «вручную», явно получены из /etc/gdm/Xsession
. И оба они проверяют Bash перед поиском ~/.bashrc
Тест «is Interactive shell» в / etc / profile (а также на ~ / .bashrc) может быть некорректным, [ 1119], но bash test работает и возвращает false при входе в систему. Вот почему ваш файл журнала имеет только 1 строку ... то есть из ~/.profile
Когда вы открыть терминал, его терминал Bash. Сам Bash вызывает ~/.bashrc
напрямую, а ~/.profile
не выполняется.
И последнее, но не менее важное: Не создавайте ~ / .profile из ~ / .bashrc , как это было предложено в предыдущем ответе. Это приведет к циклической ссылке (оба файла исходят друг от друга), и это технически и концептуально неправильно. Это может вызвать проблемы, если bash когда-либо используется для входа в систему (может быть, текстовый режим, восстановить консоль?)