매개변수를 대시(또는 sh 또는 가능하지 않은 경우 bash)로 인용하고 싶습니다. "${(q+@)@}"
터미널에 입력하는 것과 동일한 zsh를 사용하여 이 작업을 수행 할 수 있습니다 reval <sth> ...
.<sth> ...
reval () {
eval "$(gquote "$@")"
}
gquote () {
print -r -- "${(q+@)@}"
}
답변1
for arg do
arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
set -- "$@" "'$arg'"
shift
done
eval "$@"
이렇게 하면 각 위치 매개변수 주위에 작은따옴표가 추가됩니다. 루프는 각 위치 인수를 반복하고 작은따옴표를 사용하여 목록 끝에 현재 위치 인수를 추가한 다음 첫 번째(현재 처리된) 요소를 제거합니다.
포함된 작은따옴표는 목록 끝에 추가 '$arg'
되기 전에 문자열로 대체됩니다 $arg
.'\''
sed
다음과 같은 함수로 reval
:
reval () {
for arg do
arg=$(printf '%s\n' "$arg" | sed "s/'/'\\\''/g")
set -- "$@" "'$arg'"
shift
done
eval "$@"
}
(따라서 인수는 후행 줄 바꿈을 제거합니다.)
셸에서는 루프의 bash
명령 대체를 호출 printf
하고 다음으로 바꿀 수 있습니다.sed
arg=${arg//\'/\'\\\'\'}
장점은 후행 줄 바꿈이 보존된다는 것입니다. bash
쉘 에서도 할 수 있지만
reval () {
eval "${@@Q}"
}
...여기서 ${variable@Q}
값은 $variable
셸 입력에 맞도록 인용됩니다. variable
being 의 경우 @
이는 모든 위치 매개변수에 적용됩니다.
${(q)@}
이는 쉘에서 얻는 것과 유사합니다 zsh
.
reval () {
eval "${(q)@}"
}