Попробуйте выполнить следующую команду:
cat ~/.ssh/id_rsa.pub | ssh user@hostname 'cat >>.ssh/authorized_keys
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)@}"
}