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.sh1つを作成することです。

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

たとえば、インデントコマンドをサポートする必要がある場合は、パターンを少し緩和する必要があります.。持っていません。 1つの可能性は、行のコマンドのみを特別なコメントマークに置き換えることです。. /dev/stdin < .... <(whatever). "./dir/$scriptname".. somefile.sh # flatten

qx//(興味深いことに、少なくとも実行されたシェルがデフォルトのスクリプトで使用されているのと同じ場合は、空白のファイル名をサポートしています。)

関連情報