我正在使用来自的解决方案测试命令是否输出空字符串。除了这些解决方案之外,我想打印命令的输出(如果它不为空)。
我想知道如果命令的输出不为空,是否可以通过仅调用命令一次来打印命令的输出。
我可以通过在 中重新调用相同的命令来完成此操作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
)。