나는 이것이 효과가 있을 것이라고 생각했습니다:
source <(sed '1,/# HELPER FUNCTIONS #/d' "$0")
fun abc
# HELPER FUNCTIONS #
fun() {
echo"$@"
}
하지만 지금 생각해 보면 스크립트가 완료되면 도우미 함수를 현재 셸로 가져올 것입니다.
스크립트 끝에 도우미 함수를 넣을 수 있는 방법이 있나요?
답변1
source
귀하의 접근 방식은 실제로 작동하지만 도우미 함수를 선언하는 문은 실행 전과 실행 후에 한 번, 두 번 실행됩니다 fun abc
. 그래서 exit
구분선 앞에 간단한 문장을 삽입 하겠습니다 .
#!/bin/bash
source <(sed '1,/^# HELPER FUNCTIONS #$/d' "$0")
fun ABC
exit
# HELPER FUNCTIONS #
fun () {
echo "$@"
}
또한 정규식을 최소한 줄의 시작 부분에 고정해야 합니다. 그렇지 않으면 command 가 포함된 줄과 일치하게 되어 source
결국 스크립트의 첫 번째 절반(sans sed
)이 회피에 의해 실행됩니다source
개인적으로 나는 이것이 코드를 읽기 어렵게 만든다고 생각합니다. 또한 구분 기호 뒤에 뭔가가 변경됩니다. 예를 들어, BASH_SOURCE
배열은 첫 번째 요소로 추가 파일 이름을 가지며 BASH_LINENO
스크립트의 초기 부분 크기에 따라 오프셋되며 스크립트 하단의 오류 메시지에 보고된 줄 번호(및 스크립트 이름)는 어려워집니다. 따르다.
$0
합리적인 값을 갖거나 동적으로 수정하는 스크립트를 호출할 필요 없이 이를 수행하는 또 다른 방법은 sed
스크립트 본문을 자체 함수(아마도 호출됨)에 넣은 main
다음 스크립트의 마지막으로 이것을 호출하는 습관을 들이는 것입니다. 기능:
#!/bin/sh
main () {
fun ABC
}
fun () {
echo "$@"
}
# Call "main" with the arguments given to the script
# (even if the function may not use them).
main "$@"
이는 쉘이 끝까지 스크립트를 읽고 모든 함수가 인스턴스화되며 main
해당 함수가 코드의 위치에 관계없이 작업을 수행하는 데 필요한 모든 함수를 호출할 수 있음을 의미합니다.
또한 쉘 스크립트에 대한 Google 스타일 가이드를 참조하세요.이것을 제안하다main
, 함수의 코드를 마지막 에 넣으라고 되어 있지만 꼭 필요한 것은 아닙니다. 사실 언급할 가치가 있을 수도 있겠네요첫 번째더 쉽게 찾을 수 있도록 합니다.
관련된: