Ubuntu 22.04系统范围内如何用bat替换cat

Whi*_*rry 8 command-line bash cron cat 22.04

我正在使用带有 bash 的 Ubuntu 22.04,非常普通,并且已添加alias cat="batcat"~/.bashrc. 该程序batcat或被bat引用可以在这里找到: https: //github.com/sharkdp/bat

因此,cat ~/.bashrc例如,当我运行时,它会使用 输出文件的内容batcat。但是,当我运行诸如 之类的命令时crontab -l,输出似乎正在使用cat而不是batcat

任何帮助将不胜感激!

由于 的输出,似乎crontab -l没有使用。这是否意味着我无能为力?catstrace crontab -l |& grep cat

仍然可以使用crontab -l | batcat或获取输出并将其输入到 crontab 中crontab -l | cat

mar*_*elm 32

Ubuntu 22.04系统范围内如何用bat替换cat

我强烈建议不要这样做。

Cat 不仅仅用于在 shell 上交互使用;它还在系统脚本中用作cat <file> | filter | ... , 或DATA="$(cat <file>)"。如果 Bat 在这些情况下的行为不完全相同,您的系统最终可能会以意想不到的方式损坏,您甚至可能不会想到将这些损坏与替换的 Cat 连接起来。

(我发现的一个例子是bat /dev/zero | head -c1耗尽所有系统内存然后崩溃,但cat工作正常;请参阅问题#636

我正在使用带有 bash 的 Ubuntu 22.04,非常普通,并且已将别名 cat="batcat" 添加到 ~/.bashrc 中。

这样危害较小;它只影响你对 shell 的交互使用;不是脚本,也不是其他(系统)用户。

尽管如此,我还是建议不要这样做。同样,如果 Bat 的行为与 Cat 不完全一样,它可能会在某种程度上破坏您的 shell,例如,如果您复制/粘贴从某处使用的命令行cat

例如,请参阅bat问题#2380,其中有人抱怨zsh-async执行后会中断alias cat=bat

但是,当我运行诸如 之类的命令时crontab -l,输出似乎使用 cat 而不是 batcat。

仅仅因为某些东西产生输出,并不意味着它使用 Cat。 crontab -l只是打印它的输出。它不是通过 Cat 提供的,甚至不是系统寻呼机(见下文)。您必须| batcat手动使用。

(也就是说,我系统上的蝙蝠版本crontab -l | batcat不会对任何东西进行着色,所以我不确定这里有多大价值)

所以,你可以做什么?

好吧,首先,当您想要彩色输出时,您可以简单地使用batcat <file>or 。<command> | batcat这使得用法更加明确,因此不会弄乱任何不应该弄乱的东西。

您可以使用 自由定义另一个别名alias XXX="batcat",这样您就可以在交互式 shell 会话中以更少的输入来使用它。我建议不要在 Cat 上使用别名,但对我来说batbc似乎是很好的别名。

在 Zsh 等 shell 中,您可以考虑使用全局别名来节省更多输入并将命令简化为crontab -l B. 但要小心,全局别名本身就是一个蠕虫。

另一个想法是创建一个别名来重新运行前一个命令,并通过 Bat 传输其输出;例如:alias rebat='$(history -p !!) | batcat'

然后,如果您运行crontab -l并决定宁愿通过 Bat 传输其输出,您只需键入rebat,它就会crontab -l | batcat为您运行。

寻呼机

Unix 有寻呼机的概念;一个可以一次显示一页文本并允许您浏览文本的程序。最普遍的寻呼机可能是Less。一些程序(man、git、systemctl 等)自动通过寻呼机发送其输出。

export PAGER=bat您可以使用(例如在您的)中将 Bat 设置为默认寻呼机.bashrc,这将使这些程序默认使用 Bat。

请注意,寻呼机必须被调用bat,而不是batcat。Bat 仅对输出进行着色,不提供分页。如果 Bat 发现其输出对于终端来说太长,它会自动通过 提供其输出$PAGER

然而,从 开始$PAGER=bat,它将启动一个新的 Bat,并在那里提供其输出。新的 Bat 发现输出太长,因此它将启动一个寻呼机,这是另一个 Bat。这会无限重复(请参阅第 2023 期)。

为了防止这种情况,Bat 会检测寻呼机是否设置为 Bat,并悄悄地使用 Less 来代替分页。但这在寻呼机设置为 时有效bat,而不是batcat

为了实现这一点,您可以符号链接batcatbat某个地方。$HOME/bin这是我的偏好,但你需要设置 shell 才能使用它。/usr/local/bin将是一个系统范围的选择。

  • 请注意,“bc”实际上是一个[命令](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html),因此不能完全保证它是别名的安全选择。 (7认同)
  • 非常感谢您如此详尽的回答,我从未想过我会收到如此出色的答案!我将避免使用寻呼机,因为所需的结果主要由更简单的情况涵盖 (3认同)