从 Bash 脚本显示 Unix 命令的准确输出

Display exact output of Unix command from a Bash script

我正在尝试打印出传递给 bash 脚本的命令所显示的输出。我试图解决的问题是如何使输出看起来与 运行 来自 shell 的命令完全一样。例如,当我 运行 ls 时,我看到目录和文件的颜色不同。

这是我目前所拥有的一些示例代码:

#!/bin/bash

command="$@"
output=`$command`
echo "$output"

所以我的 shell 脚本接受一个命令,运行s 命令,然后打印输出。我知道我可以使用颜色代码和 echo -e 自定义输出的颜色,但我希望输出看起来就像我 运行 来自 shell 的命令时一样。知道我该怎么做吗?

一些程序,例如 ls,检查是否是标准输出 isatty() 并根据它做出不同的行为。如果您在变量中捕获命令的输出,shell 会将其标准输出重定向到不是 TTY 的管道。

除了阅读每个命令的手册页以了解它是否支持使其行为独立于其标准输出是否通过管道传输的特殊选项之外,您对此无能为力。特别是对于 ls,您可以使用 dir 程序作为替代方案,该程序将始终生成人性化的列格式输出。

在更一般的层面上:无论如何,你正在尝试做的事情似乎是一件相当奇怪的事情。我确信有一个更强大的解决方案可以完成您想要完成的事情。

如果您只需要显示输出,您可以 运行 在脚本中内联命令(让它直接写入标准输出,而不将其输出存储在某个变量中)。

即可以替换为:

output=`$command`
echo $output

与:

$command

eval $command

如果您还需要该输出进行某种处理,那就有点棘手了。您可以(例如)使用 | tee /var/tmp/some-temp-file.$$ 然后从临时文件中读取输出。

为什么不直接将脚本设为:

#!/bin/bash
"$@"

它将运行任何作为参数传递的命令行并打印未修改的输出。