在鱼壳中管道 eval/source 的输出

ena*_*one 2 eval file-descriptor io-redirection fish

我想将 的输出通过管道eval传输到文件。如果命令执行成功,这将按预期工作:

eval ls > log.txt 2>&1
cat log.txt # Documents Desktop
Run Code Online (Sandbox Code Playgroud)

如果命令不成功,它也有效

eval rm Desktop > log.txt 2>&1
cat log.txt # rm: cannot remove 'Desktop': Is a directory
Run Code Online (Sandbox Code Playgroud)

但是,如果命令不存在,我无法重定向 stderr

eval abcde > log.txt 2>&1 # fish: Unknown command abcde
cat log.txt # (empty)
Run Code Online (Sandbox Code Playgroud)

如何将第三种情况的输出也重定向到日志文件?


一些与工作source也将非常赞赏:

echo abcde | source > log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)

fah*_*aho 5

但是,如果命令不存在,我无法重定向 stderr

那是因为输出不是来自eval或命令,它来自您的 command-not-found 处理程序。

在尝试执行该命令之前,请尝试检查该命令是否存在。如果你绝对不能,技术上可以通过重新定义来完全消除 command-not-found 错误__fish_command_not_found_handler

function __fish_command_not_found_handler; end
Run Code Online (Sandbox Code Playgroud)

您必须通过以下方式处理将其移回functions --copy

functions --copy __fish_command_not_found_handler oldcnf
Run Code Online (Sandbox Code Playgroud)

总的来说,我不推荐任何这些,并怀疑您可能过度使用eval.

与源一起使用的东西也将非常感激:

从字面上看,这就是 eval 的用途。在即将发布的 3.1 版本之前,eval 只是一个source带有一些支持代码的函数,这些代码主要归结为处理这些重定向。