测试命令的输出是否为空字符串,如果不为空则打印其结果

测试命令的输出是否为空字符串,如果不为空则打印其结果

我正在使用来自的解决方案测试命令是否输出空字符串。除了这些解决方案之外,我想打印命令的输出(如果它不为空)。

我想知道如果命令的输出不为空,是否可以通过仅调用命令一次来打印命令的输出。

我可以通过在 中重新调用相同的命令来完成此操作if condition,但现在第二次调用可能会消耗额外的 CPU 使用率,因为我们已经获得了其结果。


可能的方法是,同一命令被调用两次:

if [[ $(ls -A) ]]; then
    ls -A
else
    echo "no files found"
fi

output=$(git diff --ignore-blank-lines --color-words HEAD | tr -d ' \n\r\t ' | wc -c)
if [ "$output" -gt 0 ]; then
    git diff --ignore-blank-lines --color-words HEAD 
else
    echo "diff is empty"
fi

答案1

笔记:该问题最初被标记为,但 OP 此后表示使用的 shell 是zsh.这会使答案在一定程度上无效。

您可以将命令的输出存储在变量中并测试该变量是否为空:

output="$(your_command)"

if [[ -n $output ]]
then
    printf -- "%s\n" "$output"
else
    printf -- "No output\n"
fi

-n测试将检查是否$output为非空字符串。如果是,$output则打印 的内容。否则,将打印一条消息,表明未产生任何输出。注意周围的引号"$output"是必要的。

另请注意(正如 @ilkkachu 所提到的),尾随换行符将通过命令替换删除,因此如果您关心这些,则需要采用不同的方法。

答案2

如果您在任何情况下都需要输出,可以将其通过管道传输tee并使用它来复制输出,而无需再次运行命令:一次到标准输出,一次到可以对空输入起作用的命令。

例如:

ls | tee >([ $(wc -m) -gt 0 ] || echo No output)

请注意,这仅处理标准输出,因此您可能会在错误消息后得到“无输出”。当命令的输出根据是否发送到终端而变化时,您还必须相应地调整命令(例如 ls -C,或带颜色输出)。

答案3

ls -A命令为例,将执行以下操作:

if ls -A | grep ^; then
   : the output was already written
else
   : no output
fi

if ! ls -A | grep ^; then
   : handle the no-output condition
fi

这也将确保在输出中保留尾随换行符。

对于本文提到的实际案例评论(不要less以空输出运行),有-F(“如果一个屏幕则退出”)选项:

command ... | less -FXR

(您可以省略X较新版本的less)。

相关内容