Bash 함수를 인라인으로 내보내기

Bash 함수를 인라인으로 내보내기

나는 이것을 가지고있다:

foo(){
   install_ores_gitflow;
   command foo "$@"
}

export -f foo;

나는 다음과 같은 것을 찾고 있습니다 :

export foo(){
   install_ores_gitflow;
   command foo "$@"
}

그러나 구문이 올바르지 않습니다.

제가 발견한 한 가지 기술은 다음과 같습니다. 파일의 모든 Bash 기능을 한 줄로 내보내는 방법은 무엇입니까?

이것은 내가 이것을 할 수 있다는 것을 의미합니다:

set -a;

foo(){
  install_ores_gitflow;
  command foo "$@"
}

set +a;

하지만 소싱 스크립트에 set -a매우 잘못된 스크립트가 있을 수 있으므로 이 솔루션이 마음에 들지 않습니다. 이는 내 스크립트가 이를 덮어쓰게 된다는 것을 의미합니다.

답변1

불쾌한 해킹이지만 적어도 export명령을 내릴 수는 있습니다.이상함수 정의를 더 쉽게 볼 수 있습니다.

# a function to create a dummy function and export it
export_function() { eval "function $1 { :; }; export -f $1"; }

# then

export_function foo
foo() { echo "here is the *real* function"; }

답변2

-a예를 들어 옵션의 상태를 확인하여 옵션 echo $-이 설정되어 있으면 아무 것도 할 필요가 없도록 사용하는 것은 어떨까요 ?

답변3

글쎄요, 저는 이것이 합리적이고 신뢰할 수 있는 접근 방식이라고 생각합니다.

#!/usr/bin/env bash

if [[ ! "$SHELLOPTS" =~ "allexport" ]]; then
    set -a;
    all_export=nope;
fi


ores_git_merge_with_integration(){
   install_ores_gitflow;
   command "$FUNCNAME" "$@"
}

ores_git_tools(){
   install_ores_gitflow;
   command "$FUNCNAME" "$@"
}


if [ "$all_export" == "nope" ]; then
  set +a;
fi

Bash 스크립트에서는 내보내려는 모든 함수를 그룹화하고 set -a / set + 명령으로 묶을 수 있습니다.

환경 변수를 확인하는 목적 $SHELLOPTS은 set -a가 켜져 있지 않은지 확인하는 것입니다. 그렇지 않은 경우 완료되면 꺼야 합니다.

관련 정보