이전 정의와 관련하여 bash 함수를 어떻게 재정의합니까?


13

이전 정의와 관련하여 bash 함수를 재정의 할 수있는 방법이 있습니까? 예를 들어 다음 코드 블록을 함수의 프리앰블에 추가하고 싶습니다 command_not_found_handle ().

# Check if $1 is instead a bash variable and print value if it is
local VAL=$(eval echo \"\$$1\")
if [ -n "$VAL" ] && [ $# -eq 1 ]; then
    echo "$1=$VAL"
    return $?
fi

현재 /etc/profile.d/PackageKit.sh에 정의되어 있으며 bash 시작 스크립트에 의해 제공됩니다.

이렇게하면 변수 이름을 입력하기 만하면 명령 프롬프트에서 환경 변수의 값을 쿼리 할 수 ​​있습니다 (해당 이름의 해당 명령이없는 경우). 예 :

user@hostname ~:$ LANG
LANG=en_AU.utf8

현재 정의를 복사하여 붙여 넣고 내 변경 사항을에 추가 할 수는 ~/.bashrc있지만 코드 재사용과 관련된보다 우아한 방법을 찾고 있습니다.

내 목표 또는 코드 개선 / 확장을 달성하는 더 좋은 방법도 높이 평가됩니다.


이 질문이 stackoverflow에 더 적합하다면 누군가가 그것을 마이그레이션 할 수 있습니까? 어떻게 모르겠습니다.
tmoschou

3
Stack Overflow 의이 게시물이 귀하의 질문에 대한 답변 이라고 생각 합니다 .
Mat

2
대신 다음과 같은 eval간접적 인 사용이 가능합니다.local VAL=$(echo ${!1})
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


14

함수의 현재 정의를 인쇄 한 다음 eval절 내부의 함수 정의에 포함시킬 수 있습니다.

current_definition=$(declare -f command_not_found_handle)
current_definition=${current_definition#*\{}
current_definition=${current_definition%\}}
prefix_to_add=$(cat <<'EOF'
  # insert code here (no special quoting required)
EOF
)
suffix_to_add=$(cat <<'EOF'
  # insert code here (no special quoting required)
EOF
)
eval "command_not_found_handle () {
  $prefix_to_add
  $current_definition
  $suffix_to_add
}"

또 다른 접근법은 원래 이름을 새 이름으로 정의하고 정의에서 호출하는 것입니다. 원래 정의의 로컬 변수에 대해 조치를 취할 필요가없는 경우에만 작동합니다.

eval "original_$(declare -f command_not_found_handle)"
command_not_found_handle () {
  
  original_command_not_found_handle
  
}

1
건배, 여기에 문서를 사용하는 것이 결코 발생하지 않았으며 특별한 인용이 필요하지 않았습니다. 첫 번째 방법을 선호한다고 생각합니다.로 전체 정의를 쉽게 볼 수 declare -f있지만 원래 func의 이름을 바꾸는 방법이 마음에 듭니다.
tmoschou

0

감사합니다 @mat, @ dennis-williamson 당신의 의견을 읽은 후, 이것이 내가 얻은 것입니다

eval 'command_not_found_handle () {

    local VAL=$(echo "${!1}")
    if [ -n "$VAL" ] && [ $# -eq 1 ]; then
            echo "$1=$VAL"
            return $?
    fi

    '$(declare -f command_not_found_handle |
    tail -n +3 | head -n -1)'
}'

@Gilles 솔루션을 선호한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.