Как передать значение переменной в стандартный ввод команды? - PullRequest
87 голосов
/ 23 января 2011

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

Ответы [ 9 ]

152 голосов
/ 23 января 2011

Передать значение в стандартный ввод данных так же просто, как:

your-command <<< "$your_variable"

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

65 голосов
/ 23 января 2011

Что-то простое, как:

echo "$blah" | my_cmd
17 голосов
/ 23 января 2011

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

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

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

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

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

15 голосов
/ 23 января 2011
(cat <<END
$passwd
END
) | command

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

12 голосов
/ 27 февраля 2015

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

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

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

7 голосов
/ 16 января 2014

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

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

3.6.7 Здесь строки

Вариант документов здесь, формат:

<<< word

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

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

( cat <<EOF
$variable
EOF
) | cmd

Или, более простой вариант вышеупомянутого:

(cmd <<EOF
$variable
EOF
)

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

4 голосов
/ 23 января 2011

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

echo "$variable" | command
1 голос
/ 03 марта 2019

Этот надежный и портативный способ уже появился в комментариях. Это должен быть отдельный ответ.

printf '%s' "$var" | my_cmd

или

printf '%s\n' "$var" | my_cmd

Примечания:

  • Это лучше, чем echo, причины здесь: Почему printf лучше, чем echo?
  • printf "$var" неправильно. Первый аргумент - формат, в котором различные последовательности, такие как %s или \n, интерпретируются как . Чтобы передать переменную правильно, она не должна интерпретироваться как формат.
  • Обычно переменные не содержат завершающие символы новой строки. Предыдущая команда (с %s) передает переменную как есть. Однако инструменты, работающие с текстом, могут игнорировать или жаловаться на неполную строку (см. Почему текстовые файлы должны заканчиваться символом новой строки? ). Поэтому вам может потребоваться последняя команда (с %s\n), которая добавляет символ новой строки к содержимому переменной. Неочевидные факты:

    • Здесь строка в Bash (<<<"$var" my_cmd) добавляет новую строку.
    • Любой метод, который добавляет символ новой строки, приводит к непустому стандартному значению my_cmd, даже если переменная пуста или не определена.
0 голосов
/ 28 февраля 2018

Просто сделай:

printf "$my_var" | my_cmd

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

echo -n "$my_var" | my_cmd

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...