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

예를 들어 들여쓰기 명령을 지원해야 하는 경우 패턴을 약간 완화해야 하며 물론 새 줄을 지나 계속되는 명령은 말할 것도 없고 or , 또는 .와 같은 명령이 있으면 실패할 것입니다 ..... 하지만 왜냐하면 당신은 그것을 가지고 있지 않습니다. 한 가지 가능성은 줄의 명령만 특수 주석 표시로 바꾸는 것입니다 .. /dev/stdin < .... <(whatever). "./dir/$scriptname".. somefile.sh # flatten

qx//(흥미롭게도 최소한 실행된 셸이 기본 스크립트에서 사용된 것과 동일한 경우에는 공백이 있는 파일 이름을 지원합니다 .)

관련 정보