Bash의 함수 매개변수에 $ 인용(명령 대체)

Bash의 함수 매개변수에 $ 인용(명령 대체)

나는 본 적이Bash에서 $(명령 대체) 내에서 인용그리고 여전히 내가 뭘 잘못하고 있는지 이해하지 못합니다(내 코드가 허용된 답변에서 "권장되는 방식"과 같은 것 같습니다). 그리고 해결 방법은 다음과 같습니다.

print_and_run(){
    echo next line: "$1"
    echo "$($1)"
}

print_and_run 'sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config' 
next line: sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config
sed: -e expression #1, char 1: unknown command: `"'

sed줄은 독립적으로 작동하며, 이 함수는 print_and_run따옴표 없이 명령에서 작동합니다(예: print_and_run 'cat ./.git/config'TIA) .

PS BTW, 이것이 중요한지 확실하지 않습니다. 줄 바꿈을 사용하여 인쇄 echo "$($1)"하지 않도록 썼습니다.echo $($1)https://stackoverflow.com/questions/15184358/how-to-avoid-bash-command-substitution-to-remove-the-newline-character, 이제 전자가 "권장되는 방법"처럼 보입니다.)

답변1

다른 접근 방식을 시도해 볼 수도 있습니다.

print_and_run() {
    printf "next line:"
    printf " '%s'" "$@"
    printf "\n"

    echo "$("$@")"
}

print_and_run sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config

결과:

next line: 'sed' '--in-place' '--' 's|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|' '.git/config'

이 예에서는 원래 참조가 보존됩니다. 그러나 파이프나 리디렉션과 같은 기능은 여전히 ​​작동하지 않습니다.

완전히 다른 접근 방식은 셸의 내장 명령을 사용하여 인쇄하는 것입니다.

 set -x
 sed --in-place -- "s|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|" .git/config
 set +x

다음과 같은 줄이 인쇄됩니다.

+ sed --in-place -- 's|fetch = +refs/\*:refs/\*|fetch = +refs/heads/*:refs/remotes/origin/*|' .git/config

따라서 사용자 자신의 인쇄 명령을 전혀 구현할 필요가 없으며 쉘이 이를 수행합니다.

관련 정보