【问题标题】:redirecting all output to lolcat将所有输出重定向到 lolcat
【发布时间】:2020-01-24 05:50:57
【问题描述】:

我最近发现了 lolcat。我非常喜欢它,因为我想通过 lolcat 重定向我的所有输出。在终端中,这可以通过

ls -lh | lolcat

这将输出颜色。如果我想对所有命令再次执行此操作,假设为

cat /filename.sh | lolcat

如果我想将此永久化并创建一个别名并将其推送到我的.bashrc 文件

cat='cat |lolcat'

这会运行,但我必须为大量命令编写很多别名。

我只知道我可以捕获终端输入并使用 $1$2 等替换内联, 但我希望它只在一个可以替换所有其他命令的地方执行。

【问题讨论】:

  • 我不确定你是否真的想要一直这样做,但是……考虑创建一个目录(可能是$HOME/lolcat),并在其中创建一个包含export PATH=$(echo "$PATH" | sed "s%$HOME/lolcat%%g") 的文件—— ——$(basename $0) "$@" | lolcatexport 从 PATH 中删除了 'lolcat' 目录;第二个运行命令,避免“lolcat”目录中的版本。然后在指向包装器的目录中为要映射(“别名”)的每个命令添加一个符号链接。最后,将 $HOME/lolcat 添加到 PATH 的前面,以便首先选择这些名称。需要照顾!
  • 请注意ls | lolcat 可能不会产生与ls 相同的输出(给予或接受着色)。你也不想使用vim 管道到lolcat
  • @google :您是否考虑过,将您的标准输出传送到 lolcat 会掩盖您原始命令的退出代码?即使您仅以交互方式使用它,您也无法再使用该功能来获取提示中显示的最新命令的退出代码,因为它只会显示 lolcat 的退出代码。

标签: bash ubuntu terminal


【解决方案1】:

对于您想要的认为,我能想出的最佳解决方案是将其添加到您的.bashrc

lol()
{
    if [ -t 1 ]; then
        "$@" | lolcat
    else
        "$@"
    fi
}

bind 'RETURN: "\e[1~lol \e[4~\n"'

lol() 函数接受任何命令,执行它,并将其标准输出通过管道传输到 lolcat 如果标准输出是终端。

您可以运行lol ls,它会将ls 传送到lolcat

bind 命令告诉 readline,bash 用于读取输入的库,当您在 bash 中按 Enter 时表现不同。

正常的行为是插入\n

这个命令(无耻地从this answer窃取)将导致回车到行首,输入文本lol然后回到行尾,然后才插入\n

如果您使用它,您将在终端中看到您的命令是如何以lol 为前缀的。

你很快就会发现这很烦人。因为你重定向了东西,所以事情就停止了。

例如,man ls 不会在寻呼机中打开,因为它man 检测到 stdout 不是终端而是管道。甚至不要尝试使用 vim。

另外一个问题是你输入ls,它会变成lol ls,然后当你按向上键执行最后一个命令时,按回车,它会变成@987654337 @。

要点是,您希望通过在您的.bashrc 中包含这些来具体说明您重定向的命令,并能够运行原始命令:

lol()
{
    if [ -t 1 ]; then
        "$@" | lolcat
    else
        "$@"
    fi
}

COMMANDS=(
    ls
    cat
)

for COMMAND in "${COMMANDS[@]}"; do
    alias "${COMMAND}=lol ${COMMAND}"
    alias ".${COMMAND}=$(which ${COMMAND})"
done

lol() 函数与以前相同,只是现在COMMANDS 数组包含您可以重定向的所有命令(与参数无关)。

例如,ls /usr 将实际运行 lol ls /usr,但运行 .ls /usr 将运行 /bin/ls /usr

【讨论】:

  • 我喜欢这个想法,但只要稍加修改,我就可以将这两者用作我能够理解的不同解决方案。谢谢。
【解决方案2】:

您很可能不想为命令创建单独的别名,因为这可能会影响管道、脚本等的操作,这些操作将隐式使用 catls 等命令。

另外,请记住,某些命令本质上是 visual(vi、emacs、info),如果输出通过 lolcat 过滤器,可能会出现问题。

搁置这些潜在问题,并专注于如何实现:考虑通过 lolcat 过滤器重定向所有输出,并从重定向中排除(少数)可视命令。该序列将当前标准输出(终端)保存到 fd #3。

alias vi 'vi >&3'
alias emacs `emacs >&3'
...
exec 3>&1 > >(lolcat)

【讨论】:

  • 我不想为我特别要求的所有命令写别名。
【解决方案3】:

全部功劳归于公认的答案,我只是为像我这样的未来发现者提取解决方案。

 lol()
 {
   if [ -t 1 ]; then
       "$@" | lolcat
   else
       "$@"
   fi
 }

仅此一项就足以解决我的问题。 如果我想用 lolcat 使输出着色,我可以使用 lol 函数 + 命令

下面的命令将使COMMANDS变量中提到的所有命令默认为彩色。

 COMMANDS=(
           ls
           cat
           )

 for COMMAND in "${COMMANDS[@]}"; do
    alias "${COMMAND}=${COMMAND} | lolcat"
    alias ".${COMMAND}=$(which ${COMMAND})"
 done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2019-02-10
    • 2018-03-31
    • 2015-03-24
    • 2011-10-04
    相关资源
    最近更新 更多