将文本传递给需要文件的程序

将文本传递给需要文件的程序

与我在 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 上对我有效,但我不确定它在哪里也能有效。

相关内容