Quote file name commands in eshell.
authorChong Yidong <cyd@gnu.org>
Sat, 28 Jan 2012 13:58:46 +0000 (21:58 +0800)
committerChong Yidong <cyd@gnu.org>
Sat, 28 Jan 2012 13:58:46 +0000 (21:58 +0800)
* lisp/eshell/esh-arg.el (eshell-quote-argument): New function.

* lisp/eshell/esh-ext.el (eshell-invoke-batch-file):
* lisp/eshell/em-unix.el (eshell/cat, eshell/du): Use it to quote the
first arg to eshell-parse-command.

Fixes: debbugs:10523

lisp/ChangeLog
lisp/eshell/em-unix.el
lisp/eshell/esh-arg.el
lisp/eshell/esh-ext.el

index c374c71..8bde5f9 100644 (file)
@@ -1,3 +1,11 @@
+2012-01-28  Chong Yidong  <cyd@gnu.org>
+
+       * eshell/esh-arg.el (eshell-quote-argument): New function.
+
+       * eshell/esh-ext.el (eshell-invoke-batch-file):
+       * eshell/em-unix.el (eshell/cat, eshell/du): Use it to quote the
+       first arg to eshell-parse-command (Bug#10523).
+
 2012-01-28  Drew Adams  <drew.adams@oracle.com>
 
        * net/ange-ftp.el (ange-ftp-canonize-filename): Check, that
index 296e2ee..6ac53e3 100644 (file)
@@ -599,7 +599,7 @@ symlink, then revert to the system's definition of cat."
       (let ((ext-cat (eshell-search-path "cat")))
        (if ext-cat
            (throw 'eshell-replace-command
-                  (eshell-parse-command ext-cat args))
+                  (eshell-parse-command (eshell-quote-argument ext-cat) args))
          (if eshell-in-pipeline-p
              (error "Eshell's `cat' does not work in pipelines")
            (error "Eshell's `cat' cannot display one of the files given"))))
@@ -855,7 +855,7 @@ external command."
                           (file-remote-p (expand-file-name arg) 'method) "ftp")
                          (throw 'have-ange-path t))))))
        (throw 'eshell-replace-command
-              (eshell-parse-command ext-du args))
+              (eshell-parse-command (eshell-quote-argument ext-du) args))
       (eshell-eval-using-options
        "du" args
        '((?a "all" nil show-all
index 8143f2d..ad52a5d 100644 (file)
@@ -202,6 +202,18 @@ If POS is nil, the location of point is checked."
     (or (= pos (point-max))
        (memq (char-after pos) eshell-delimiter-argument-list))))
 
+(defun eshell-quote-argument (string)
+  "Return STRING with magic characters quoted.
+Magic characters are those in `eshell-special-chars-outside-quoting'."
+  (let ((index 0))
+    (mapconcat (lambda (c)
+                (prog1
+                    (or (eshell-quote-backslash string index)
+                        (char-to-string c))
+                  (setq index (1+ index))))
+              string
+              "")))
+
 ;; Argument parsing
 
 (defun eshell-parse-arguments (beg end)
index a33ccc8..cf57a1d 100644 (file)
@@ -108,7 +108,9 @@ wholly ignored."
   ;; argument...
   (setcar args (subst-char-in-string ?/ ?\\ (car args)))
   (throw 'eshell-replace-command
-        (eshell-parse-command eshell-windows-shell-file (cons "/c" args))))
+        (eshell-parse-command
+         (eshell-quote-argument eshell-windows-shell-file)
+         (cons "/c" args))))
 
 (defcustom eshell-interpreter-alist
   (if (eshell-under-windows-p)