Как передать значение переменной в stdin команды?
Я пишу сценарий оболочки, который должен быть несколько безопасным, т. е. не передает безопасные данные через параметры команд и предпочтительно не использует временные файлы. Как я могу передать переменную в stdin команды? Или, если это невозможно, Как правильно использовать временные файлы для таких задач?
8 ответов:
передача значения на stdin так же просто, как:
your-command <<< "$your_variable"всегда убедитесь, что вы ставите кавычки вокруг переменных выражений!
обратите внимание, что '
echo "$var" | commandоперации означают, что стандартный ввод ограничен линией(АМИ) эхом. Если вы также хотите, чтобы терминал был подключен, то вам нужно быть более причудливым:{ echo "$var"; cat - ; } | command ( echo "$var"; cat - ) | commandэто означает, что первая строка(ы) будет содержание
$varа остальныеcatчитать стандартный ввод. Если команда не делает ничего слишком причудливого (попробуйте включить редактирование командной строки или запустить какvimделает) тогда все будет хорошо. В противном случае, вам нужно чтобы получить действительно фантазии - я думаюexpectили один из его производных, вероятно, будет подходящим.обозначения командной строки практически идентичны - но вторая точка с запятой необходима с фигурными скобками, тогда как она не является скобками.
(cat <<END $passwd END ) | commandThe
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 )можно не указывать
(и), если вы не хотите, чтобы это перенаправлялось дальше в другие команды.
Так же:
printf "$my_var" | my_cmd, Если ВАР не содержит пробелов, то кавычки могут быть опущены.
Если вы используете bash, то вы также можете сделать:echo -n "$my_var" | my_cmdизбегайте использования echo без -n, потому что он будет передавать vraiable с добавленным разрывом линии в конце.
Comments