Subject: Re: bug#33791: 26.1; Eshell on Windows connecting to GNU/Linux machine using TRAMP and plink: env: ‘c:/home/jordan/test.sh’: No such file or directory

From: Michael Albinus <[email-masked]>
Date: Sat, 29 Dec 2018 10:25:37 +0100

Eli Zaretskii <[email-masked]> writes:

Hi Eli,

> Michael, I need your help here.  The problem is in this part of
> eshell-gather-process-output:
>
>     (cond
>      ((fboundp 'start-file-process)
>       (setq proc
> 	    (let ((process-connection-type
> 		   (unless (eshell-needs-pipe-p command)
> 		     process-connection-type))
> 		  (command (file-local-name command)))
> 	      (apply 'start-file-process
> 		     (file-name-nondirectory command) nil
> 		     ;; `start-process' can't deal with relative filenames.
> 		     (append (list (expand-file-name command)) args))))
>
> The problem is that file-local-name returns a Unix-style absolute file
> name /foo/bar/baz, and the following expand-file-name call then
> prepends a drive letter on Windows, because there's no longer any sign
> of COMMAND being a remote file, and so expand-file-name doesn't invoke
> the Tramp handler.

This is fixed in the master branch already:

--8<---------------cut here---------------start------------->8---
    (cond
     ((fboundp 'start-file-process)
      (setq proc
	    (let ((process-connection-type
		   (unless (eshell-needs-pipe-p command)
		     process-connection-type))
		  ;; `start-process' can't deal with relative filenames.
		  (command (file-local-name (expand-file-name command))))
	      (apply 'start-file-process
		     (file-name-nondirectory command) nil command args)))
--8<---------------cut here---------------end--------------->8---

The respective commit is

--8<---------------cut here---------------start------------->8---
commit bca35315e16cb53415649e5c0ac2ec0cc1368679
Author: Michael Albinus <[email-masked]>
Date:   Thu Sep 6 12:16:00 2018 +0200

    Fix Bug#31704
    
    * lisp/eshell/esh-proc.el (eshell-gather-process-output): Do not
    let `expand-file-name' prefix remote file names with MS Windows
    volume letter.
    
    * lisp/net/tramp.el (tramp-eshell-directory-change):
    Use `path-separator' as it does eshell.  (Bug#31704)
--8<---------------cut here---------------end--------------->8---

As you see, it requires two changes, in esh-proc.el and tramp.el.

> Btw, isn't it confusing that start-file-process needs only the "local"
> part of COMMAND?  Why cannot its handler DTRT internally instead?

What do you do, if COMMAND is another remote location than
default-directory?

And more general, there could also be file names in the PROGRAM-ARGS
part of start-file-process. Who decides, which of them is a remote file
name to be stripped to the local part, and which offers remote file name
syntax to be used literally?

That's why we have decided (long ago), to not allow remote arguments for
both start-file-process and process-file.

> Thanks.

Best regards, Michael.