Я пишу оболочку script, которая должна быть несколько безопасной, т.е. не передает защищенные данные через параметры команд и предпочтительно не использует временные файлы. Как передать переменную в команду stdin? Или, если это невозможно, как правильно использовать временные файлы для такой задачи?
Как передать значение переменной в stdin команды?
Ответ 1
Что-то простое:
echo "$blah" | my_cmd
Ответ 2
Передача значения на stdin так же просто, как:
your-command <<< "$your_variable"
Обязательно поставьте кавычки вокруг переменных выражений!
Ответ 3
Обратите внимание, что операции 'echo "$var" | command
означают, что стандартный ввод ограничен эхо-сигналом. Если вы также хотите, чтобы терминал был подключен, вам нужно быть более привлекательным:
{ echo "$var"; cat - ; } | command
( echo "$var"; cat - ) | command
Это означает, что первая строка (строки) будет содержимым $var
, а остальное будет от cat
, считывая его стандартный ввод. Если команда не делает ничего необычного (попробуйте включить редактирование командной строки или запустите, например, vim
), тогда все будет хорошо. В противном случае вам нужно получить действительно фантазию - я думаю, что expect
или одна из его производных, вероятно, будет подходящей.
Обозначения в командной строке практически идентичны, но вторая запятая необходима с фигурными скобками, тогда как она не заключена в круглые скобки.
Ответ 4
(cat <<END
$passwd
END
) | command
cat
на самом деле не нужен, но он помогает лучше структурировать код и позволяет вам использовать больше команд в круглых скобках в качестве ввода вашей команды.
Ответ 5
Мне понравился ответ Мартина, но он имеет некоторые проблемы в зависимости от того, что находится в переменной. Это
your-command <<< """$your_variable"""
лучше, если переменная содержит "или!
Ответ 6
Попробуйте следующее:
echo "$variable" | command
Ответ 7
В соответствии с ответом Мартина существует функция bash, называемая Here Strings (которая сама по себе является вариантом более широко поддерживаемой функции "Документы" ).
http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings
3.6.7 Здесь Строки
Вариант здесь документов, формат:
<<< word
Слово расширяется и передается в команду на стандартном вход.
Обратите внимание, что здесь строки будут выглядеть как bash, а значит, для улучшения переносимости вам, вероятно, будет лучше с оригинальной функцией "Документы" в соответствии с ответом PoltoS:
( cat <<EOF
$variable
EOF
) | cmd
Или, более простой вариант:
(cmd <<EOF
$variable
EOF
)
Вы можете опустить (
и )
, если вы не хотите, чтобы это было перенаправлено дальше в другие команды.