在鱼壳中管道输出 eval/源



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

eval ls > log.txt 2>&1
cat log.txt # Documents Desktop

如果命令不成功,它也可以工作

eval rm Desktop > log.txt 2>&1
cat log.txt # rm: cannot remove 'Desktop': Is a directory

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

eval abcde > log.txt 2>&1 # fish: Unknown command abcde
cat log.txt # (empty)

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


source一起使用的东西也将不胜感激:

echo abcde | source > log.txt 2>&1
但是

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

这是因为输出不是来自eval或命令,而是来自未找到命令的处理程序。

在尝试执行命令之前,请尝试检查该命令是否存在。如果你绝对不能,在技术上可以通过重新定义__fish_command_not_found_handler来完全静音未找到命令的错误:

function __fish_command_not_found_handler; end

之后,您必须通过以下方式将其移回functions --copy

functions --copy __fish_command_not_found_handler oldcnf

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

与源代码一起使用的东西也将不胜感激:

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

如果命令存在,你应该评估,这是可能的

test -f (whereis -b command | awk '{print $2}')

whereis -b愿意搜索系统中command的二进制文件

awk过滤输出以仅显示第一个结果

test -f要验证文件是否存在

如果该命令存在,则返回status 0。所以最后你可以这样写

test -f (whereis -b abcde | awk '{print $2}') && abcde > log.txt 2>&1

也可以使用此表格

test (whereis -b abcde | awk '{print $2}') != '' && abcde > log.txt 2>&1

最新更新