Запустите приложение в cwd на удаленном хосте изнутри eshell

12

Я часто использую Eshell для подключения к удаленным системам. На этих удаленных системах мне иногда хочется запускать скрипты в текущем рабочем каталоге. В обычном терминале я набрал бы это:

./my-script.sh

К сожалению, внутри Eshell это не сработает:

~ $ cd /remote1:~
/ssh:remote1:/home/rekado $ ./my-script.sh 
env: /ssh:remote1:/home/rekado/my-script.sh: No such file or directory
/ssh:remote1:/home/rekado $ 

Это работает, только если я предоставлю полный путь TRAMP к сценарию:

/ssh:remote1:/home/rekado $ /ssh:remote1:/home/rekado/my-script.sh 
It works!
/ssh:remote1:/home/rekado $ 

Есть ли способ убедить Eshell расширяться .автоматически, чтобы простой вызов просто работал?

В качестве обходного пути в настоящее время я использую функцию, связанную с этим, C-c .которая вставляет текущий полный путь в командную строку. Я бы предпочел .просто вести себя, как ожидалось.

rekado
источник

Ответы:

11

Это похоже на ошибку в eshell, вы должны сообщить об этом.

Я думаю, что вы можете это исправить,

(defadvice eshell-gather-process-output (before absolute-cmd (command args) act)
  (setq command (file-truename command)))

В итоге, проблема в том, что tramp заканчивает тем, что строит удаленную командную строку в форме (я убираю некоторые экранирующие символы, чтобы сделать это более понятным):

cd /home/rekado && exec env PS1='/ssh:remote1:/home/rekado $' /ssh:remote1:/home/rekado/my-script.sh

Вот почему вы в конечном итоге с этим «таинственным» сообщением о env

Вместо этого нужно сгенерировать (и это достигается с помощью приведенной выше команды), что-то вроде

cd /home/rekado && exec env PS1='/ssh:remote1:/home/rekado $' /home/rekado/my-script.sh

Я действительно считаю, что ошибка на стороне eshell, поскольку tramp не может знать, что «/ ssh: remote1: ...» не является допустимой удаленной командой (хотя, если бы это было так, у нас, вероятно, было бы намного больше проблемы с многопрыжком бродяга ... но все равно). И eshell действительно делает вменяемое, когда команда явно является бродячим путем.

Сигма
источник
Работает плавно. Спасибо за это решение.
Boccaperta-IT
1
Это действительно ошибка, и она уже исправлена.
Rekado
@rekado, в какой версии emacs это исправлено?
djhaskin987
Я считаю, что это было исправлено с помощью этого коммита: git.savannah.gnu.org/cgit/emacs.git/commit/…
rekado
Я столкнулся с этой ошибкой и должен был применить вышеупомянутое исправление (которое исправляет проблему - спасибо за это). Я использую emacs 24.5.1, установленный с помощью homebrew на Mac. Исправление выше по течению не решает проблему для меня.
Бутала