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

Art*_*are 38 linux bash command-line

与我在 Stack Overflow 上提出的一个问题相关:将多行代码传递给 wsadmin.sh?.

我有,作为一个字符串,我需要输入命令的几行输入。然而,该命令只接受一个充满输入的文件。

有什么方法可以将这些行存储在一个临时文件或管道中,而这些文件或管道实际上从未真正写入磁盘,然后将其直接输入到程序中?

我如何获取管道,将输入输入其中,将该管道传递给命令,然后摆脱管道?

Edw*_*ard 36

另一种解决方案是在 Bash 中使用进程替换。如果您的系统有命名管道,您可以使用此功能。

它是这样使用的:

program_expecting_a_file <(list)
Run Code Online (Sandbox Code Playgroud)

哪里list是 shell 命令序列(实际上是管道;完整的细节在这里)。list将被执行,其输出将连接到管道。然后将管道的名称传递给您的程序。

注意:<和之间不允许有空格(

(另一个替换>(list)也如您所愿。)

在您的特定情况下,您可以使用

program_expecting_a_file <(echo "$your_strings")
Run Code Online (Sandbox Code Playgroud)

尽管您可能会发现 @meuh 的解决方案更优雅。

更新:Advanced Bash Scripting Guide 中可以找到很多使用示例。


meu*_*euh 18

您可以在此处使用 bash -doc。例如,

$ cat -n <<<'a
> b'
 1  a
 2  b
Run Code Online (Sandbox Code Playgroud)

如果你在 bash 变量中有一些东西,你也可以插入它:例如<<<"path is $PATH".


如果你的命令坚持一个文件名,你可以给它/dev/stdin. 例如:

$ sed -f /dev/stdin <<<'s/a/b/'
Run Code Online (Sandbox Code Playgroud)

产生输出:s/b/b/


Maj*_*nko 7

根据脚本中的内容,您可以使用特殊文件名 - (减号),它代表stdin

$ mycmd -
Line 1
Line 2
^D
Run Code Online (Sandbox Code Playgroud)

另一种可能对您有用的方法是打开/dev/fd/0再次代表stdin的文件。

第三种选择可能是创建FIFO(先进先出)。这就像一个文件,但它有两端——你在一端写入并从另一端读取。

-- Process 1 --                  -- Process 2 --
$ mkfifo foo
$ cat foo
<waits>                          $ echo hello > foo
hello                            $
$ rm foo
Run Code Online (Sandbox Code Playgroud)

  • 可能值得注意的是,必须编写程序以通过这种方式解释 `-` - 这不是 shell 或操作系统的特性。当然,据我所知,大多数标准 Linux 实用程序都遵循此约定。 (3认同)