Связанный с вопросом, который я задал относительно переполнения стека: передача нескольких строк кода в wsadmin.sh? ,
В качестве строки у меня есть несколько строк ввода, которые мне нужно ввести в команду. Команда, однако, принимает только файл, полный ввода.
Есть ли какой-нибудь способ, которым я мог бы сохранить строки во временном файле или канале, который никогда не будет записан на диск, а затем передать их непосредственно в программу?
Как мне получить трубку, подать входные данные в нее, передать эту трубку команде, а затем избавиться от канала?
linux
command-line
bash
ArtOfWarfare
источник
источник
Ответы:
Другое решение заключается в использовании процесса замены в Bash. Если ваша система имеет именованные каналы, вы можете использовать эту функцию.
Используется так:
где
list
- последовательность команд оболочки (на самом деле конвейеры; полная информация здесь ).list
будет выполнен, и его выход будет подключен к трубе. Имя канала затем передается в вашу программу.ПРИМЕЧАНИЕ: пробелы не допускаются между
<
и(
.(Другая замена
>(list)
также работает, как и следовало ожидать.)В вашем конкретном случае вы могли бы использовать
хотя вы можете найти решение @ meuh более элегантным.
Обновление: очень много примеров использования можно найти в Расширенном руководстве по написанию сценариев Bash .
источник
Вы можете использовать bash здесь-док . Например,
Если у вас есть что-то в переменной bash, вы также можете интерполировать это: например
<<<"path is $PATH"
.Если ваша команда настаивает на имени файла, вы можете указать его
/dev/stdin
. Например:производит вывод:
s/b/b/
.источник
stdin
, и если нет, это не сработает. Я надеюсь, что ОП уточняет."-f" option must be followed by a file name.
-f
и имя файла, укажите имя файла/dev/stdin
. Смотрите мое редактирование./dev/stdin
предложение. Программа, которую я пытаюсь вызвать, принимает только имя файла, поэтому я объединился/dev/stdin
с heredoc.В зависимости от того, что в сценарии, вы можете использовать специальное имя файла - (минус), что означает стандартный ввод
Другой способ, который может вам помочь, - это открыть файл,
/dev/fd/0
который снова обозначает stdin .Третий вариант может заключаться в создании FIFO (First In First Out). Это похоже на файл, но у него два конца - вы пишете с одного конца и читаете с другого.
источник
-
это - это не особенность оболочки или операционной системы. Хотя, конечно, большинство стандартных утилит Linux следуют этому соглашению, насколько я знаю.expect
.<()
решение, но более явные - что может быть очень полезно!Есть еще один вариант, похожий на
mycmd -
решение, но даже для программ, которые специально не обрабатывают-
:/dev/stdin
Кажется, что это связано с ОС, и это работает для меня в Debian GNU / Linux, но я не уверен, где еще это будет работать.источник
^D
?^D
является общим обозначением для нажатия Ctrl-D. ^ D имеет семантику «конец входного потока» здесь. Скорее всего, это чаще всего встречается^C
или^Z
обозначает нажатие Ctrl-C, соответственно нажатие Ctrl-Z./dev/stdin
а затем закрыл его?cat content | mycmd /dev/stdin
. Просто представьте разные команды, чемcat
здесь.