例如,您可以编写一个 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 相同。)