如何使用管道命令创建屏幕

How can I create screen using piped command

我正在尝试为使用管道的命令打开一个新屏幕。 我尝试了很多选择,例如:

screen "cat ~/input | parallel --colsep '\t' -j 100 -m sh ~/runner.sh {}"

也许我遗漏了文件描述符之类的东西,但搜索工作是徒劳的。 谢谢

您不能在传递给 screen 的参数中直接使用 shell 语法结构,例如 { code; };&| (或 parallel,或 xargs,等等)。 shell 将尝试在 运行 之前解析您的命令,所以任何看起来像

的东西
echo | moo |

将被解析为带有命令 echomoo 的管道,什么也没有(这当然是语法错误)。如果你想 echo 一对文字管道字符,你必须引用它们:

echo '| moo |'

如果您希望在 shell 解析它之后评估引用的内容,有几个选项。

  • 将命令外部封装在一个脚本中,这样你就可以说screen myscript并在脚本文件myscript中拥有实际有用的命令。 (一些有用的工具甚至允许您在这里使用 shell 函数甚至别名。)
  • 传递命令 sh -c 'morecommands'bash -c 'morecommands' 以便命令被引用但无论如何最终都会被执行。这实际上只是另一种封装形式,但不需要单独的外部定义,如脚本文件或 shell 函数。

因此,在您的示例中,您可以将代码放入 ./metarunner 之类的脚本中,然后只需调用 screen ./metarunner;或者像

这样引用命令行
screen sh -c "parallel --colsep '\t' -j 100 -m sh $HOME/runner.sh {} <$HOME/input"

(我在这里将 ~ 切换为 $HOME,这样我就可以使用 sh 而不是 bash。如果您需要重要的 Bash 功能或者太懒得将代码重构为 POSIX shell 脚本,显然使用 bash -c 而不是 sh -c。另请参阅 Difference between sh and bash 以了解确切的区别。)

切线地,我也摆脱了 useless use of cat.