It can be difficult to diagnose test failures in the Eshell ERT test suite, since it doesn't print useful details like the command that was executed. See bug#57129 for example. Here are some patches to fix that. The failures now look like this: ---------------------------------------- (ert-test-failed ((should (eshell-match-output regexp)) :form (eshell-match-output "wrong") :value nil :explanation (mismatched-output (command "echo $INSIDE_EMACS[, 1]\n") (output "eshell\n") (regexp "wrong")))) ---------------------------------------- (ert-test-failed ((should (eshell-command-result--equal command (eshell-test-command-result command) result)) :form (eshell-command-result--equal "echo $LINES" 22 2) :value nil :explanation (nonequal-result (command "echo $LINES") (result 22) (expected 2)))) ---------------------------------------- Most of the first two patches are purely-mechanical changes to update function calls. The diffs ended up being pretty big, but I think it improves matters. Let me know if I should do it differently (especially for the commit message; I didn't see much benefit to listing *every* test function I touched, but maybe I should do that?) While I was testing these, I also found a couple real bugs with the 'eshell-command-result' function. This throws 'eshell-defer': M-: (eshell-command-result "if {[ foo = foo ]} {echo hi}") That's because 'eshell-do-eval' wasn't forwarding the SYNCHRONOUS-P argument in a couple spots. This is also wrong: M-: (eshell-command-result "if (zerop 1) {echo yes} {echo no}") => nil It should return "no". I fixed these in the third patch. Maybe that could go in a separate bug, but it's fairly closely related to this one.