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/
。
根据脚本中的内容,您可以使用特殊文件名 - (减号),它代表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)