тире :Как я могу указать аргументы типа "${ (q+@ )@}" в zsh?

Попробуйте выполнить следующую команду:

cat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >>.ssh/authorized_keys

0
28.07.2020, 13:38
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равно @, это относится ко всем позиционным параметрам.

Это похоже на то, что вы получите с ${(q)@}в оболочке zsh:

reval () {
    eval "${(q)@}"
}
0
18.03.2021, 23:16

Теги

Похожие вопросы