У меня есть процесс, который выводит некоторые сжатые данные на стандартный вывод. Что я делаю с этим выводом, так это pipe и отправляю его через туннель SSH на другую машину, где он записывается в файл.

Вот так:

/usr/bin/myapp | ssh root@remotemachine "cat > /path/to/output/file.gz"

когда я ssh к машине и вызываю эту строку, все идет хорошо. Но когда я помещаю эту команду в сценарий оболочки, как

#!/bin/sh
APP=/usr/bin/myapp
OPTS=--gzip
OUTPUT= "| ssh root@remotemachine \"cat > /path/to/output/file.gz\""
$APP $OPTS $OUTPUT

И затем вызвать сценарий, я вижу мусор на консоли, который я могу только предположить, что это вывод myapp , а затем это

Unknown parameter '|'
Unknown parameter 'ssh'
Unknown parameter 'root@remotemachine'
Unknown parameter '"cat'
Unknown parameter '>'
Unknown parameter '/path/to/output/file.gz"'

Я предполагаю, что оболочка отправила раздел $OUTPUT в качестве аргумента myapp вместо того, чтобы воздействовать на них. Итак, эти "Неизвестный параметр" пришли из myapp не из оболочки.

Как я могу это исправить?

2 ответа2

0

Хорошо....Я нашел то, что мне было нужно. Это была команда eval . Это на самом деле ответили здесь .

Итак, скрипт можно изменить следующим образом:

#!/bin/sh
APP=/usr/bin/myapp
OPTS=--gzip
OUTPUT= "| ssh root@remotemachine \"cat > /path/to/output/file.gz\""
eval "$APP $OPTS $OUTPUT"
0

Ваша оболочка анализирует любую командную строку в определенной последовательности. Когда он сталкивается с $APP $OPTS $OUTPUT он видит, что нет оператора канала; позже эти переменные будут расширены и | появляется, но не имеет особого значения, потому что для этого уже слишком поздно.

Результат может быть переоценен с помощью eval (ваш ответ показывает, что вы уже обнаружили это), но eval может оказаться evil с орфографической ошибкой.

Ваш оригинальный подход имеет недостатки, поскольку переменные оболочки не должны содержать код. Функции для кода. Пример:

app=/usr/bin/myapp
opts=--gzip
output() { ssh root@remotemachine "cat > /path/to/output/file.gz"; }
$app $opts | output

Обратите внимание, что рекомендуется использовать имена переменных в нижнем регистре.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .