bash在echo中调用ext func

时间:2014-12-05 22:28:30

标签: bash function echo external

正在测试外部功能。总的来说,它们似乎按预期工作,除了这一个。

我在外部脚本(mylib)中设置颜色

这似乎工作正常:

#!/bin/bash
. mylib
red
echo " red text "
. mylib
white
echo " white text "

这不是,不知道应该怎么做。我想在同一条线上改变颜色。 (没有所有的转义编码)

#!/bin/bash
. mylib
red
echo "Red text  " . mylib white "  white text"

我尝试了一些括号和' $'想法,但都失败了。

由于 戴夫

1 个答案:

答案 0 :(得分:1)

你可以这样做,但效率低得离谱。

echo "Red text $(source mylib; white) white text"

只有稍微才能更好地获取库一次:

source mylib # This only needs to be done ONCE!
echo "Red text $(white) white text"

考虑一下:每次你想要改变颜色,你要求shell执行此操作:

  • 致电fork()以创建子贝壳
  • 在父shell中,开始读取子shell发出的所有输出
  • 在该子shell中,读取文件mylib并执行每一行(在前一种情况下)
  • 在该子shell中,调用函数white
  • 在子shell中,退出并显示要运行的最后一个命令的状态(在这种情况下,该命令是white函数)。 [因为子shell正在退出,这意味着它读取和解析mylib的工作被丢弃了,下次需要更改颜色时,mylib将需要重新读取并从头开始重新分析]
  • 在父shell中,看到子shell已关闭;调用waitpid()从流程表中获取它。
  • 在父shell中,将从子shell读取的内容替换为正在运行的echo命令。

如果运行source mylib设置一个名为white变量,并且只提取一次mylib,之后又包含了通过引用变量:

source mylib # this only needs to be done ONCE!
echo "Red text ${white} white text"

在这种情况下,不需要任何子壳,更不用说换色了。


您可能还希望查看BashFAQ #37,讨论处理颜色的最佳做法。