Как передать значение переменной в stdin команды?



Я пишу сценарий оболочки, который должен быть несколько безопасным, т. е. не передает безопасные данные через параметры команд и предпочтительно не использует временные файлы. Как я могу передать переменную в stdin команды? Или, если это невозможно, Как правильно использовать временные файлы для таких задач?

709   8  

8 ответов:

примерно так:

echo "$blah" | my_cmd

передача значения на stdin так же просто, как:

your-command <<< "$your_variable"

всегда убедитесь, что вы ставите кавычки вокруг переменных выражений!

обратите внимание, что 'echo "$var" | command операции означают, что стандартный ввод ограничен линией(АМИ) эхом. Если вы также хотите, чтобы терминал был подключен, то вам нужно быть более причудливым:

{ echo "$var"; cat - ; } | command

( echo "$var"; cat -   ) | command

это означает, что первая строка(ы) будет содержание $var а остальные cat читать стандартный ввод. Если команда не делает ничего слишком причудливого (попробуйте включить редактирование командной строки или запустить как vim делает) тогда все будет хорошо. В противном случае, вам нужно чтобы получить действительно фантазии - я думаю expect или один из его производных, вероятно, будет подходящим.

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

(cat <<END
$passwd
END
) | command

The cat на самом деле не требуется, но это помогает лучше структурировать код и позволяет использовать больше команд в скобках в качестве входных данных для вашей команды.

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

your-command <<< """$your_variable"""

лучше, если переменная содержит " или !

согласно ответу Мартина, есть функция bash под названием Здесь Строки (что само по себе является вариантом более широко поддерживаемых Здесь Документы функция).

http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings

3.6.7 Вот Строки

вариант вот документов, формат такой:

<<< word

слово расширяется и подается в команду на своем норматив вход.

обратите внимание, что здесь строки будут отображаться только для bash, поэтому для улучшения переносимости вам, вероятно, будет лучше использовать оригинальную функцию Here Documents, согласно ответу PoltoS:

( cat <<EOF
$variable
EOF
) | cmd

или, более простой вариант выше:

(cmd <<EOF
$variable
EOF
)

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

попробуйте это:

echo "$variable" | command

Так же:

printf "$my_var" | my_cmd

, Если ВАР не содержит пробелов, то кавычки могут быть опущены.
Если вы используете bash, то вы также можете сделать:

echo -n "$my_var" | my_cmd

избегайте использования echo без -n, потому что он будет передавать vraiable с добавленным разрывом линии в конце.

Comments

    Ничего не найдено.