Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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
)

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