如何使用管道命令创建屏幕
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 |
将被解析为带有命令 echo
和 moo
的管道,什么也没有(这当然是语法错误)。如果你想 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
.
我正在尝试为使用管道的命令打开一个新屏幕。 我尝试了很多选择,例如:
screen "cat ~/input | parallel --colsep '\t' -j 100 -m sh ~/runner.sh {}"
也许我遗漏了文件描述符之类的东西,但搜索工作是徒劳的。 谢谢
您不能在传递给 screen
的参数中直接使用 shell 语法结构,例如 { code; }
或 ;
或 &
或 |
(或 parallel
,或 xargs
,等等)。 shell 将尝试在 运行 之前解析您的命令,所以任何看起来像
echo | moo |
将被解析为带有命令 echo
和 moo
的管道,什么也没有(这当然是语法错误)。如果你想 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
.