대시: zsh에서 매개변수 ala "${(q+@)@}"를 인용하는 방법은 무엇입니까?

대시: zsh에서 매개변수 ala "${(q+@)@}"를 인용하는 방법은 무엇입니까?

매개변수를 대시(또는 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셸 입력에 맞도록 인용됩니다. variablebeing 의 경우 @이는 모든 위치 매개변수에 적용됩니다.

${(q)@}이는 쉘에서 얻는 것과 유사합니다 zsh.

reval () {
    eval "${(q)@}"
}

관련 정보