Описание тега exit-status
Первое, что нужно понять в этом процессе, как СШ обрабатывает свои аргументы. Я не имею в виду аргументы, что ты пытаешься убежать, но аргументы СШ. Когда вы вызываете СШ
, аргументы после удаленного узла, спецификация (пользователь@сервер
) объединяются вместе, и прошли через оболочку на удаленном конце. Это важно, а просто потому, что ваши аргументы правильно разделить на местной стороне, не означает, что они будут правильно разделить на удаленной стороне.
Использовать ваш пример:
СШ@пользователя сервера 'Echo "Привет 1 $"' ш "мир"
Эти аргументы заставляют объединяются как команда:
Echo "Привет $1" ш мир
Именно поэтому вы получаете
привет СГ мира
Двойное пространство между привет
И Ш
- это потому что там $1
должен идти, но нет $1
.
В качестве другого примера, без $1
, это:
SSH пользователь@сервер Эхо "Foo бар" баз
Какие результаты на выходе:
Василий Пупкин баз
Это потому, что аргументы были сцеплены вместе, так что вы в конечном итоге с помощью команды:
Эхо Foo бар Базом
Так как нет никакого способа, чтобы обойти команды прошли через оболочку, вы просто должны убедиться, что то, что вы прошли может пережить оценки раковины. Как я обычно сделать это с помощью функции printf "%м "
Например:
КМД=(Эхо "Foo бар" баз)
SSH пользователь@сервер "$(е "%м " "${cmd и[@]}")"
Какие результаты на выходе:
Василий Пупкин баз
Пока она чище и легче разобраться с УМК
отдельного ВАР, это не требуется. Следующих работах:
SSH пользователь@сервер "$(е "%м " эхо "Foo бар" баз)"
Это также хорошо работает с вашим примером аргумент оболочки:
КМД=(Ш-с 'Эхо 1="<$1>" 2="<$2>" 3="<$3>"' ш "мой арг1" "мой аргумент2" "мое значение arg3")
SSH пользователь@сервер "$(е "%м " "${cmd и[@]}")"
Какие результаты на выходе:
1=<мой арг1> 2=<Мой аргумент2> 3=<мое значение arg3>
В качестве альтернативного решения, вы можете передать вашу команду как полноценный скрипт. Например:
SSH пользователь@сервер <<'ВФ'
Ш-с 'Эхо 1="<1$>" 2="<$2>" 3="<3$>"' ш "мой арг1" "мой аргумент2" "мое значение arg3"
ВФ
Есть и недостатки в этом решении, хотя, как это трудно сделать программно (генерации документа для передачи на устройства stdin). Также так как вы используете стандартный ввод, если вы хотите, чтобы скрипт на удаленной стороне для чтения стандартного ввода, вы не можете (по крайней мере, не без некоторой хитрости).