~/.profile получен ударом?

Я пытаюсь создать глобальную переменную счетчика для наблюдения сколько раз ~/.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"
3
задан 1 February 2014 в 00:54

5 ответов

Из ваших комментариев к моему первоначальному ответу видно, что ваш настоящий вопрос звучит так: «Источник ~ / .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, если этот файл существует. После прочтения этого файла он ищет ~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения.

Таким образом, у вас может быть файл с именем .bash_profile или .bash_login в вашем домашнем каталоге. Если что-то из этого существует, bash будет использовать его вместо .profile.

0
ответ дан 1 February 2014 в 00:54

Во-первых, если вы хотите посмотреть, что происходит в сценарии оболочки, поместите 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 .

0
ответ дан 1 February 2014 в 00:54

~/.profile выполняется только для оболочек входа в систему (bash --login), а не для всех оболочек, вот для чего ~/.bashrc. Поэтому счет 1 должен быть правильным, так как ~/.profile выполняется один раз при входе в систему.

Если вы не доверяете счетчику переменных среды, просто напишите файл с уникальным именем файла (что-то вроде $(uuidgen)), чтобы отслеживать выполнение ~/.profile.

0
ответ дан 1 February 2014 в 00:54

Вы получаете .profile в .bashrc? В противном случае Bash не считает его. У Вас должно быть что-то вроде этого, вероятно, лучше всего помещенное наверху Вашего .bashrc:

[ -r ${HOME}/.profile ] && . ${HOME}/.profile

Это удостоверится, что .profile и существует и читаем, и если это - чем процесс это.

0
ответ дан 1 February 2014 в 00:54

@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 не выполняется.

1128 Надеюсь, теперь все прояснилось.

И последнее, но не менее важное: Не создавайте ~ / .profile из ~ / .bashrc , как это было предложено в предыдущем ответе. Это приведет к циклической ссылке (оба файла исходят друг от друга), и это технически и концептуально неправильно. Это может вызвать проблемы, если bash когда-либо используется для входа в систему (может быть, текстовый режим, восстановить консоль?)

0
ответ дан 1 February 2014 в 00:54

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

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