![将文本传递给需要文件的程序](https://linux22.com/image/1457236/%E5%B0%86%E6%96%87%E6%9C%AC%E4%BC%A0%E9%80%92%E7%BB%99%E9%9C%80%E8%A6%81%E6%96%87%E4%BB%B6%E7%9A%84%E7%A8%8B%E5%BA%8F.png)
与我在 Stack Overflow 上提出的一个问题相关:将多行代码传递给 wsadmin.sh?。
我有几行字符串需要输入到命令中。但是,该命令只接受一个包含所有输入的文件。
有什么方法可以让我将这些行存储在临时文件或管道中,而这些行实际上永远不会写入磁盘,然后将其直接输入到程序中?
我该如何获取管道、将输入输入其中、将该管道传递给命令,然后摆脱管道?
答案1
另一个解决方案是使用流程替代在 Bash 中。如果您的系统有命名管道,则可以使用此功能。
使用方式如下:
program_expecting_a_file <(list)
其中list
是 shell 命令序列(实际上是管道;完整细节如下这里)。list
它将被执行,并且其输出将连接到管道。然后管道的名称将传递给您的程序。
笔记:<
和之间不允许有空格(
。
(另一种替换>(list)
也如您所期望的那样有效。)
就您的具体情况而言,你可以使用
program_expecting_a_file <(echo "$your_strings")
尽管你可能会发现@meuh 的解决方案更加优雅。
更新:您可以在高级 Bash 脚本指南。
答案2
你可以使用 bash此处文档。 例如,
$ cat -n <<<'a
> b'
1 a
2 b
如果 bash 变量中有内容,您也可以对其进行插入:例如<<<"path is $PATH"
。
如果你的命令要求指定文件名,你可以为其指定/dev/stdin
。例如:
$ sed -f /dev/stdin <<<'s/a/b/'
产生输出:s/b/b/
。
答案3
根据脚本内容,你可能可以使用特殊文件名 - (减号),代表标准输入
$ mycmd -
Line 1
Line 2
^D
另一种可能对你有用的方法是打开文件,/dev/fd/0
该文件再次代表标准输入。
第三个选择可能是创建一个先进先出(先进先出)。这就像一个文件,但它有两个端点 - 您可以从一端写入,然后从另一端读取。
-- Process 1 -- -- Process 2 --
$ mkfifo foo
$ cat foo
<waits> $ echo hello > foo
hello $
$ rm foo
答案4
还有另一种与该mycmd -
解决方案类似的选项,但即使对于没有-
专门处理的程序也是如此:
$ mycmd /dev/stdin
Line 1
Line 2
^D
/dev/stdin
似乎与操作系统有关,它在 Debian GNU/Linux 上对我有效,但我不确定它在哪里也能有效。