나는 본 적이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
따라서 사용자 자신의 인쇄 명령을 전혀 구현할 필요가 없으며 쉘이 이를 수행합니다.