我正在尝试打印从传递给bash脚本的命令中显示的输出。我试图解决的问题是如何使输出看起来与从shell运行命令时的输出完全一样。例如,当我运行ls
时,我看到目录与文件的颜色不同。
以下是我目前的示例代码:
#!/bin/bash
command="$@"
output=`$command`
echo "$output"
所以我的shell脚本接受命令,运行命令,然后打印输出。我知道我可以使用颜色代码和echo -e
自定义输出的颜色,但我希望输出看起来就像从shell运行命令时一样。知道如何做到这一点吗?
答案 0 :(得分:1)
如果您只需要显示输出,则可以在脚本中内联命令(只需直接写入stdout,而不将其输出存储在某个变量中)。
也就是说,您可以替换:
output=`$command`
echo $output
使用:
$command
或
eval $command
如果您还需要输出进行某种处理,那将会有点棘手。您可以(例如)使用| tee /var/tmp/some-temp-file.$$
然后读取临时文件的输出。
答案 1 :(得分:0)
某些程序(例如ls
)会检查标准输出isatty()
是否有所不同,具体取决于此。如果要在变量中捕获命令的输出,shell会将其标准输出重定向到不是TTY的管道。
除了阅读每个单独命令的手册页以查明它是否支持使其行为与其标准输出是否通过管道无关的特殊选项之外,您无能为力。特别是对于ls
,您可以使用dir
程序,该程序将始终生成人性化的列格式化输出作为替代方案。
在更一般的层面上:无论如何,你要做的事似乎是一件相当奇怪的事情。我确信有一个更强大的解决方案来完成你想要完成的任务。
答案 2 :(得分:0)
为什么不把你的脚本作为:
#!/bin/bash
"$@"
它将运行作为参数传递的任何命令行并打印未修改的输出。