На MacOSX 10.7 Apple помещает в /etc/bashrc функцию: update_terminal_cwd которая проверяет, работает ли терминал Apple, И не находимся ли мы в emacs (фрагмент вставлен ниже). К сожалению, благодаря включению autojump в мой конфигурационный файл bashrc, вызов подчиненной оболочки (т.е. M-x shell) приводит к вызову update_terminal_cwd. Я получаю этот вывод для любой команды, вызываемой в подчиненной оболочке:
bash: update_terminal_cwd: command not found
achan[10:29 AM]~ > echo $PROMPT_COMMAND
Когда я включаю autojump в мой bashrc, echo $PROMPT_COMMAND внутри emacs выглядит так:
{ [[ "$AUTOJUMP_HOME" == "$HOME" ]] && (autojump -a "$(pwd -P)"&)>/dev/null 2>>"${AUTOJUMP_DATA_DIR}/.autojump_errors";} 2>/dev/null ; update_terminal_cwd;
Если я не включаю autojump, я просто получаю пустую строку для echo $PROMPT_COMMAND .
В коде autojump вставляется первая часть:
{ [[ "$AUTOJUMP_HOME" == "$HOME" ]] && (autojump -a "$(pwd -P)"&)>/dev/null 2>>"${AUTOJUMP_DATA_DIR}/.autojump_errors";} 2>/dev/null ;
update_terminal_cwd добавляется просто добавлением $PROMPT_COMMAND в конец вышеуказанной строки.
Каким-то образом autojump создается в среде, где:
[ "$TERM_PROGRAM" == "Apple_Terminal" ] && [ -z "$INSIDE_EMACS" ]
правда. Но поскольку он запускается в emacs, update_terminal_cwd не определен; отсюда и ошибка.
Участники AutoJump предложили вместо этого использовать iTerm2 или выяснить, почему $ INSIDE_EMACS не работает.
Я подозреваю, что это что-то вроде следующего:
Вызов M-x shell каким-то образом привязан к среде оболочки, которая уже существует, когда вызывается emacs. Вот почему изменение файла .bashrc во время работы emacs не распространяет изменения в emacs. Вместо этого вам нужно создать новую среду bash и затем вызвать emacs с нижней оболочкой, прежде чем вы увидите эти изменения.
Есть ли способ заставить низшую оболочку игнорировать среду по умолчанию и попытаться запустить bash с нуля?
Apple /etc /bashrc
# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
   return
fi
PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize
# Tell the terminal about the working directory at each prompt.
if [ "$TERM_PROGRAM" == "Apple_Terminal" ] && [ -z "$INSIDE_EMACS" ]; then
    update_terminal_cwd() {
        # Identify the directory using a "file:" scheme URL,
        # including the host name to disambiguate local vs.
        # remote connections. Percent-escape spaces.
    local SEARCH=' '
    local REPLACE='%20'
    local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
    printf '\e]7;%s\a' "$PWD_URL"
    }
    PROMPT_COMMAND="update_terminal_cwd; $PROMPT_COMMAND"
fi
