从脚本调用命令并保持样式

从脚本调用命令并保持样式

我正在从 Linux 上运行的脚本调用命令。在本例中,ls列出目录内容。

ls当我从脚本中调用时,我会执行一个简单的while循环来逐行读取输出。

echo然后我使用双引号打印该行,例如echo "$line"。它确实会回显每一行,但会丢失所有样式(颜色)。

我如何在保持造型的同时仍然能够自己处理线条?

答案1

这里有两个问题。首先,您所做的处理目录中文件的方法绝对是错误的,如果您的文件名包含换行符或其他奇怪的内容,则会中断。看http://mywiki.wooledge.org/ParsingLs了解更多。

也就是说, 的颜色ls是可选的。在许多 Linux 发行版中,该命令ls实际上是别名,它在打印到 ttyls --color=tty时启用颜色(例如,与循环相反)。但是,脚本中通常不会启用别名,因此当您从脚本运行时,您只是正常运行,没有颜色。lswhilelsls

因此,第一个丑陋的解决方法是调用ls --color=always.这会让你与颜色相呼应。然而,正如我在第一段中提到的,这几乎肯定是一个坏主意。一方面,如果您只想打印每一行,为什么不直接运行ls并忘记while循环呢?

如果您确实需要出于某种其他原因处理文件并且仍然需要使用ls,请使用 globbing 来获取文件列表,然后ls手动运行每个文件:

for file in *; do
    ls -d --color=always -- "$file"
done

这不会因奇怪的文件名而中断,并且仍然会按照您的要求显示颜色。

相关内容