将 eval/source 的输出管道化到 fish shell
Pipe the output of eval/source in fish shell
我想将 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
However, I do not manage to redirect stderr if the command does not exist
那是因为输出不是来自 eval
或命令,而是来自您的命令未找到处理程序。
尝试执行命令之前先检查命令是否存在。如果绝对不能,从技术上讲可以通过重新定义 __fish_command_not_found_handler
:
来完全消除未找到命令的错误
function __fish_command_not_found_handler; end
之后您必须通过 functions --copy
:
将其移回原处
functions --copy __fish_command_not_found_handler oldcnf
总的来说,我不推荐这些,我怀疑你可能过度使用了 eval
。
Something that works with source would also be very much appreciated:
从字面上看,这就是 eval 的用途。在即将发布的 3.1 版本中,eval 只是一个 source
带有一些支持代码的函数,这些代码主要归结为处理这些重定向。
如果命令存在,你应该评估,这可以用
test -f (whereis -b command | awk '{print }')
whereis -b
将在您的系统
中搜索 command
的二进制文件
awk
过滤输出只显示第一个结果
test -f
将验证文件是否存在
如果命令存在,它return status 0
。所以最后你可以这样写
test -f (whereis -b abcde | awk '{print }') && abcde > log.txt 2>&1
也可以使用这种形式
test (whereis -b abcde | awk '{print }') != '' && abcde > log.txt 2>&1
我想将 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
However, I do not manage to redirect stderr if the command does not exist
那是因为输出不是来自 eval
或命令,而是来自您的命令未找到处理程序。
尝试执行命令之前先检查命令是否存在。如果绝对不能,从技术上讲可以通过重新定义 __fish_command_not_found_handler
:
function __fish_command_not_found_handler; end
之后您必须通过 functions --copy
:
functions --copy __fish_command_not_found_handler oldcnf
总的来说,我不推荐这些,我怀疑你可能过度使用了 eval
。
Something that works with source would also be very much appreciated:
从字面上看,这就是 eval 的用途。在即将发布的 3.1 版本中,eval 只是一个 source
带有一些支持代码的函数,这些代码主要归结为处理这些重定向。
如果命令存在,你应该评估,这可以用
test -f (whereis -b command | awk '{print }')
whereis -b
将在您的系统
command
的二进制文件
awk
过滤输出只显示第一个结果
test -f
将验证文件是否存在
如果命令存在,它return status 0
。所以最后你可以这样写
test -f (whereis -b abcde | awk '{print }') && abcde > log.txt 2>&1
也可以使用这种形式
test (whereis -b abcde | awk '{print }') != '' && abcde > log.txt 2>&1