如何在黑白中为包含未知文件类型的 cat 输出着色?

Mic*_*ant 4 colors cat source-highlight

我喜欢我的颜色vim。当我做 a 时,我可以让我的输出同样着色cat吗?

我喜欢我可以像Colorized `cat`一样使用 colorize 工具来处理源文件和脚本文件吗?. 我希望这是我的标准cat,例如我创建了一个别名:

alias cat="source-highlight --out-format=esc -o STDOUT -i"
Run Code Online (Sandbox Code Playgroud)

但是,如果文件类型未知,请说.gitignore这将返回:

$ cat .gitignore_global
source-highlight: could not find a language definition for input file .gitignore
Run Code Online (Sandbox Code Playgroud)

source-highlight cat如果它是可识别的文件类型,我怎么能让命令执行一个版本,否则只执行标准的黑白cat文件?

一种选择是使用别名,ccatcat如果可能的话,我更愿意让它自行替换。

能够使用通配符也很好,例如cat *.rb(甚至ccat *.rb)?目前这给出:

$ ccat *.rb
Please, use one of the two syntaxes for invocation: 
source-highlight [OPTIONS]... -i input_file -o output_file
source-highlight [OPTIONS]... [FILES]...
Run Code Online (Sandbox Code Playgroud)

能够做到这一点会很棒:

ls *.rb | xargs ccat # (or cat)
Run Code Online (Sandbox Code Playgroud)

和我可以做的一样:

ls *.rb | xargs cat
Run Code Online (Sandbox Code Playgroud)

目前我得到:

$ ls *.rb | xargs ccat
xargs: ccat: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Gre*_*ill 6

也许您可以执行以下脚本(未经测试)之类的操作:

#!/bin/sh

for fn in "$@"; do
    source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn
done
Run Code Online (Sandbox Code Playgroud)

这做了几件事:

  • 遍历每个命令行参数
  • 尝试运行source-highlight,将错误输出重定向到/dev/null
  • 如果source-highlight失败,则运行常规/bin/cat

您将此脚本放在一个名为cdc例如的文件中,然后alias cat=cdc.

作为函数

您可以将上述脚本改编为 Bash 函数调用,然后可以将其合并到您的点文件中,如下所示:

cdc() { 
  for fn in "$@"; do 
    source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn;
  done 
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,编辑 (Michael) 尝试使用ccat函数名称没有奏效,但cdc确实如此!