将命令的输出作为文件提供给另一个命令

将命令的输出作为文件提供给另一个命令

我可以tor使用cat <<EOF命令制作配置文件,如下所示:

cat <<EOF
SocksPort 9050
ControlPort 9150
DataDirectory /usr/var/lib/tor/torrc
EOF

但它可以通过重定向>到文件来保存输出。然后使用tor -f file

但怎么直接喂呢tor -f?我不想创建文件或任何类型的临时文件并随后删除。

  • 我想要类似的东西
    tor -f < $(cat <<EOF
    ...
    ...
    EOF)
    
    但它给出了EOF): ambiguous redirect
  • 直接重定向?tor -f <<EOF... not worked
  • 并且管道会报错。

谢谢

答案1

您正在寻找的称为流程替代;它不是 shell 的标准功能,但在 Bash/ksh/zsh 中受支持。一个例子:

$ echo <(echo foo)
/dev/fd/63
$ cat <(echo foo)
foo

扩展<(cmd)为 shell 安排的文件名,以便从中读取输出cmd。在 Linux 上,有可能/dev/fd/NN,但也可能是命名管道,具体取决于系统和 shell。

所以,我想你可以使用

tor -f  <(cat <<EOF
...
...
EOF
)

请注意,上面的 with cat,我可以使用cat < <(echo foo)重定向而不是cat <(echo foo),它与cat < somefileand 的区别相同cat somefilecat两者都可以使用,因为它默认读取 stdin,但如果该工具需要文件名,则不会添加重定向。


不管怎样,上面的内容有点毛茸茸的,最好直接阅读torhere-doc,中间不要再进行其他过程。你只需要让它读取标准输入即可。

如果给定的文件名是,一些实用程序会读取标准输入(或写入标准输出)-,但如果tor不支持,您可以使用/dev/stdin(或/dev/stdout),所以我想这可能有效:

tor -f /dev/stdin <<EOF
...
...
EOF

当然,除非它需要 stdin 来做其他事情。在这种情况下,您应该能够在此处文档中使用另一个 fd:

tor -f /dev/fd/9 9<<EOF
...
...
EOF

(尽管你需要一个支持的系统/dev/fd/NN

相关内容