]> git.eshelyaron.com Git - emacs.git/commitdiff
Support "/dev/null" as a target when creating Eshell handles
authorJim Porter <jporterbugs@gmail.com>
Thu, 29 Aug 2024 02:12:29 +0000 (19:12 -0700)
committerEshel Yaron <me@eshelyaron.com>
Wed, 4 Sep 2024 07:51:43 +0000 (09:51 +0200)
Previously, you could only use this when setting the handle afterwards.

* lisp/eshell/esh-io.el (eshell-set-output-handle): Don't catch
'eshell-null-device' here...
(eshell-get-target): ... catch it here.

* test/lisp/eshell/eshell-tests.el
(eshell-test/eshell-command/output-dev-null): New test (bug#72857).

(cherry picked from commit b6f4ffcc106fdbc21dfea45c75fdc4f217d8f201)

lisp/eshell/esh-io.el
test/lisp/eshell/eshell-tests.el

index 0fcba9b14747c25de51bca42e92d1cb960681b23..feb4bf8959fdeda70ebe84d3d8186e68e9102428 100644 (file)
@@ -429,11 +429,10 @@ current list of targets."
       (when defaultp
         (cl-decf (cdar handle))
         (setcar handle (cons nil 1)))
-      (catch 'eshell-null-device
-        (let ((current (caar handle))
-              (where (eshell-get-target target mode)))
-          (unless (member where current)
-            (setcar (car handle) (append current (list where))))))
+      (let ((current (caar handle))
+            (where (eshell-get-target target mode)))
+        (when (and where (not (member where current)))
+          (setcar (car handle) (append current (list where)))))
       (setcar (cdr handle) nil))))
 
 (defun eshell-copy-output-handle (index index-to-copy &optional handles)
@@ -609,11 +608,13 @@ return an `eshell-generic-target' instance; otherwise, return a
 marker for a file named TARGET."
   (setq mode (or mode 'insert))
   (if-let ((redir (assoc raw-target eshell-virtual-targets)))
-      (let ((target (if (nth 2 redir)
-                        (funcall (nth 1 redir) mode)
-                      (nth 1 redir))))
-        (unless (eshell-generic-target-p target)
-          (setq target (eshell-function-target-create target)))
+      (let (target)
+        (catch 'eshell-null-device
+          (setq target (if (nth 2 redir)
+                           (funcall (nth 1 redir) mode)
+                         (nth 1 redir)))
+          (unless (eshell-generic-target-p target)
+            (setq target (eshell-function-target-create target))))
         target)
     (let ((exists (get-file-buffer raw-target))
           (buf (find-file-noselect raw-target t)))
index e5aeee5123e77888631c10f749823ae7c6db26ef..50a748cd56e5aa696e1c51922856da709777156e 100644 (file)
@@ -150,6 +150,14 @@ This test uses a pipeline for the command."
   (eshell-command "echo hi" 'eshell-command-output)
   (should (equal eshell-command-output "hi")))
 
+(ert-deftest eshell-test/eshell-command/output-dev-null ()
+  "Test that the `eshell-command' function handles /dev/null properly."
+  (ert-with-temp-directory eshell-directory-name
+    (let ((eshell-history-file-name nil))
+      (with-temp-buffer
+        (eshell-command "echo hi" "/dev/null")
+        (should (equal (buffer-string) ""))))))
+
 (ert-deftest eshell-test/command-running-p ()
   "Modeline should show no command running"
   (with-temp-eshell