TRAMP игнорирует tramp-remote-path

В моем .emacs есть следующее:

(require 'tramp)
(add-to-list 'tramp-remote-path "/some/path")
(add-to-list 'tramp-remote-path 'tramp-default-remote-path)

поэтому, когда я открываю файл с помощью tramp over ssh, я ожидаю, что мой PATH будет содержать /some/path. Вместо этого запуск M-! echo $PATH возвращает

/bin:/usr/bin:/usr/sbin:/usr/local/bin

Даже если я установил export PATH=/hwdisks/data/modules/pkg/git/1.8.4.1/bin/git:$PATH в .bashrc или .profile, PATH будет установлен неправильно.

В журнале Tramp, *debug tramp/ssh remotehost*, я вижу, что tramp явно устанавливает PATH:

12:28:34.202135 tramp-send-command (6) # PATH=/bin:/usr/bin:/usr/sbin:/usr/local/bin; export PATH

Если я включу echo "in .bashrc" в свой .bashrc, он появится в журнале бродяг, так что я знаю, что бродяга его читает.

Как заставить бродягу использовать правильный PATH?

Версия Emacs: 24.2.1
Версия Tramp: 2.2.3-24.1


person Yossarian    schedule 29.10.2014    source источник


Ответы (2)


Как ни странно, ответ находится в руководстве для бродяг:

Другая возможность - повторно использовать настройки пути вашей удаленной учетной записи при входе в систему. Обычно эти настройки перезаписываются, потому что они могут быть бесполезны для бродяги. Заполнитель tramp-own-remote-path сохраняет эти настройки. Вы можете активировать его через

(add-to-list 'tramp-remote-path 'tramp-own-remote-path)

Я до сих пор не уверен, почему он игнорирует другие пути, добавленные в tramp-remote-path.

person Yossarian    schedule 30.10.2014
comment
Спасибо, что нашли время вернуться сюда и опубликовать этот ответ после того, как нашли его. Это единственное, что я могу сделать с tramp-remote-path, что действительно влияет на путь. - person dpritch; 05.04.2019

Я прочитал это в руководстве по бродяге и попробовал. Добавлен

(add-to-list 'tramp-remote-path 'tramp-own-remote-path)

Затем вышел из emacs, удалил ~/.emacs.d/tramp и перезапустился, как описано здесь

Но M-! echo $PATH по-прежнему показывает значение tramp-default-remote-path вместо значения, установленного в моем .bashrc.

Похоже, проблема заключается в моем понимании того, как загружаются профили. Способ, которым tramp вызывает удаленную оболочку, чтобы получить удаленный PATH:

/bin/sh -l -c 'echo $PATH'
/bin:/sbin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin

Поскольку bash вызывается как оболочка входа в систему и как /bin/sh он читает .profile вместо .bash_profile или .bashrc.

Я нашел это на странице руководства bash:

Если bash вызывается с именем sh, он пытается максимально точно имитировать поведение при запуске исторических версий sh, при этом также соответствуя стандарту POSIX. При вызове в качестве интерактивной оболочки входа или неинтерактивной оболочки с параметром --login она сначала пытается прочитать и выполнить команды из / etc / profile и ~ / .profile в указанном порядке. Параметр --noprofile может использоваться, чтобы запретить такое поведение. При вызове в качестве интерактивной оболочки с именем sh, bash ищет переменную ENV, раскрывает ее значение, если оно определено, и использует расширенное значение как имя файла для чтения и выполнения. Поскольку оболочка, вызываемая как sh, не пытается читать и выполнять команды из любых других файлов запуска, параметр --rcfile не действует. Неинтерактивная оболочка, запущенная с именем sh, не пытается читать какие-либо другие файлы запуска. При запуске как sh, bash переходит в режим posix после чтения файлов запуска.

Я обычно настраиваю только ~/.bashrc и ~/.bash_profile. Для правильной работы трампа, похоже, мне нужно переместить свой .bash_profile на .profile

Надеюсь, это поможет другим.

  • GNU Emacs: 25.0.94.2 Бродяга: 2.2.13.25.1
person Oden Godner    schedule 17.06.2016