有没有办法用源文件中的代码替换 bash 源命令?

有没有办法用源文件中的代码替换 bash 源命令?

例如,您可以编写一个 bash 文件:

#!/bin/bash
# file: foo/bar.sh

echo_foo(){
  echo "foo"
}

有一个主文件:

#!/bin/bash
# file: foo.sh
. foo/bar.sh

echo_foo

执行时,输出:

$ ./foo.sh
foo

但我想要的是拥有foo.sh带有导入的紧凑文件,现在flat-foo.sh从该foo.sh文件创建一个:

flatten foo.sh > foobar.sh

因此,它foobar.sh已注入源命令的所有内容,并且是一个独立的单元:

#!/bin/bash 
# file: boobar.sh

echo_foo(){
  echo "foo"
}

echo_foo

这似乎是一个以前已经解决过的问题,在我实现它或进一步深入之前,是否有一种简单的方法可以使用 bash 文件实现此目的?

答案1

对于简单的情况,使用 Perl 并不太难:

% perl -pe '$_ = qx/cat $1/ if /^\. (.*)$/;' main.sh
#!/bin/bash
# file: foo.sh
#!/bin/bash
# file: foo/bar.sh

echo_foo(){
  echo "foo"
}

echo_foo

如果您需要支持例如缩进命令,则必须稍微放松模式.,当然,如果您有类似. /dev/stdin < ...or . <(whatever)、 or 之类的命令,这将会失败,. "./dir/$scriptname"更不用说命令继续经过换行符的命令了......但是只要因为你没有这样的。一种可能性是仅替换.具有某些特殊注释标记的行上的命令,例如. somefile.sh # flatten

(有趣的是,它确实支持带有空格的文件名,至少前提是qx//启动的 shell 与主脚本使用的 shell 相同。)

相关内容