From 935ee05f07019d0dc1ccf304317a6790767f5a20 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 10 Dec 2014 14:15:51 +0100 Subject: [PATCH] * net/tramp-sh.el (tramp-get-remote-path): Use a login shell in order to determine `tramp-own-remote-path'. --- lisp/ChangeLog | 5 +++++ lisp/net/tramp-sh.el | 52 ++++++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d946a2eb586..116317bc30c 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2014-12-10 Michael Albinus + + * net/tramp-sh.el (tramp-get-remote-path): Use a login shell in + order to determine `tramp-own-remote-path'. + 2014-12-09 Fabián Ezequiel Gallina * progmodes/python.el (python-shell-parse-command): Quote diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el index ff00b55756d..f94c5b5d47a 100644 --- a/lisp/net/tramp-sh.el +++ b/lisp/net/tramp-sh.el @@ -3847,6 +3847,18 @@ file exists and nonzero exit status otherwise." (setq item (pop alist)) (when (string-match (car item) shell) (setq extra-args (cdr item)))) + ;; It is useful to set the prompt in the following command + ;; because some people have a setting for $PS1 which /bin/sh + ;; doesn't know about and thus /bin/sh will display a strange + ;; prompt. For example, if $PS1 has "${CWD}" in the value, then + ;; ksh will display the current working directory but /bin/sh + ;; will display a dollar sign. The following command line sets + ;; $PS1 to a sane value, and works under Bourne-ish shells as + ;; well as csh-like shells. We also unset the variable $ENV + ;; because that is read by some sh implementations (eg, bash + ;; when called as sh) on startup; this way, we avoid the startup + ;; file clobbering $PS1. $PROMPT_COMMAND is another way to set + ;; the prompt in /bin/bash, it must be discarded as well. (tramp-send-command vec (format "exec env ENV='' HISTFILE=/dev/null PROMPT_COMMAND='' PS1=%s PS2='' PS3='' %s %s" @@ -3923,20 +3935,6 @@ seconds. If not, it produces an error message with the given ERROR-ARGS." Mainly sets the prompt and the echo correctly. PROC is the shell process to set up. VEC specifies the connection." (let ((tramp-end-of-output tramp-initial-end-of-output)) - ;; It is useful to set the prompt in the following command because - ;; some people have a setting for $PS1 which /bin/sh doesn't know - ;; about and thus /bin/sh will display a strange prompt. For - ;; example, if $PS1 has "${CWD}" in the value, then ksh will - ;; display the current working directory but /bin/sh will display - ;; a dollar sign. The following command line sets $PS1 to a sane - ;; value, and works under Bourne-ish shells as well as csh-like - ;; shells. Daniel Pittman reports that the unusual positioning of - ;; the single quotes makes it work under `rc', too. We also unset - ;; the variable $ENV because that is read by some sh - ;; implementations (eg, bash when called as sh) on startup; this - ;; way, we avoid the startup file clobbering $PS1. $PROMPT_COMMAND - ;; is another way to set the prompt in /bin/bash, it must be - ;; discarded as well. (tramp-open-shell vec (or (tramp-get-connection-property vec "remote-shell" nil) @@ -5025,13 +5023,25 @@ Return ATTR." "/bin:/usr/bin") "/bin:/usr/bin")))) (own-remote-path - (when elt2 - (condition-case nil - (tramp-send-command-and-read vec "echo \\\"$PATH\\\"") - (error - (tramp-message - vec 3 "$PATH not set, ignoring `tramp-own-remote-path'.") - nil))))) + ;; We cannot apply `tramp-send-command-and-read' because + ;; the login shell could return more than just the $PATH + ;; string. So we emulate that function. + (when elt2 + (tramp-send-command + vec + (format + "%s -l %s 'echo \\\"$PATH\\\"'" + (tramp-get-method-parameter + (tramp-file-name-method vec) 'tramp-remote-shell) + (mapconcat + 'identity + (tramp-get-method-parameter + (tramp-file-name-method vec) 'tramp-remote-shell-args) + " "))) + (with-current-buffer (tramp-get-connection-buffer vec) + (goto-char (point-max)) + (forward-line -1) + (read (current-buffer)))))) ;; Replace place holder `tramp-default-remote-path'. (when elt1 -- 2.39.2