Я только что обновил одну из своих систем до Precise Pangolin (Ubuntu 12.04). (Давно назревшее обновление Lucid. Youch!)
Когда я пытаюсь войти в X Windows, я получаю файл ~ / .xsession-errors со следующим содержимым:
/etc/gdm/Xsession: Beginning session setup...
/etc/gdm/Xsession: 11: /home/username/.profile: function: not found
/etc/gdm/Xsession: 19: /home/username/.profile: RC: not found
Warning: unknown mime-type for "0" -- using "application/octet-stream"
Error: no such file "0"
/etc/gdm/Xsession: 23: /home/username/.profile: Syntax error: "}" unexpected
Моя обычная оболочка входа в систему - ksh, а в .profile у меня определена функция - и эта функция используется в сценарии несколько раз. Все вышеперечисленные сообщения имеют отношение к этой функции. Определение выглядит так:
function checkFile {
#<stuff here>
print "${RC}"
}
Я не могу найти способ обойти это; не вижу способа заставить вход в систему X-windows распознавать расширенный файл .profile и не вижу способа заставить его игнорировать .profile или какие-либо строки внутри него. Я пробовал создать .bash_profile и .bash_rc, но все же .profile читается при входе в систему. Я также попытался обернуть функцию (и ее вызывающие) вокруг тестов для интерактивной оболочки .. что просто меняет сообщение об ошибке на "{found - ожидание фи »или подобное.
Мне не нравится, когда какое-либо программное обеспечение заставляет меня загонять себя в коробку 1970-х ... Какие у меня есть варианты, кроме того, что я не использую такие функции в .profile и не использую X-windows?
Вот журнал того, что происходит, когда я использую более переносимый синтаксис:
username@hpmicro1:/home/username> cat .xsession\-errors
/etc/gdm/Xsession: Beginning session setup...
/etc/gdm/Xsession: 12: /home/username/.profile: Syntax error: "(" unexpected (expecting "fi")
username@hpmicro1:/home/username> more .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 [ "${SHELL}" = "/bin/ksh" ]; then
function checkFile() {
Похоже, что X-сервер использует более стандартную оболочку Bourne для создания вашего .profile, даже если ваша оболочка входа - ksh. Используя bash в качестве примера, вы можете использовать подобную логику перед любыми специфичными для bash командами в вашем .profile:
if [ "$BASH" != "" ]; then
bash stuff
fi
Я уверен, что в среде ksh есть что-то, что вы могли бы использовать для аналогичной проверки.
Вы можете попробовать более переносимый синтаксис:
checkFile() {
#<stuff here>
echo "${RC}"
}