Bash:打开命令的管道参数失败。打开命令执行得太早?

时间:2010-09-01 12:12:45

标签: macos bash pipe command-line-arguments

我几乎是shell脚本的新手。我正在尝试将一些管道命令的输出发送到OSX中open的{​​{1}}命令。

我的最终目标是通过调用带有一点Applescript的bash脚本从TextWrangler编译Flex / Actionscript应用程序,并将结果直接在Flash Player中播放。 Applescript几乎正在做它的工作。但是bash脚本不能像我期望的那样工作。当我省略Applescript并将其直接放在终端时,结果相同。

这就是Applescript发送给终端的内容:

bash

基本上,我读了mxmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//' | open -a 'Flash Player' 输出的最后一行,它通常看起来像这样:

mxmlc

我在遇到的第一个空间后剥离了所有东西。我知道它几乎没有防弹,它仍然只是一个概念证明。当我得到这个大致工作时,我会改进。到目前为止,它返回了所需的结果:

/Users/fireeyedboy/Desktop/DocumentClass.swf (994 bytes)

但正如您所看到的,我尝试将此/Users/fireeyedboy/Desktop/DocumentClass.swf 结果传递给Flash Player,而这就是失败的地方。 Flash Player似乎过早开放。我希望Flash Player只在脚本完成sed命令后打开。但它提前开放了。

所以我的问题有两个:

  1. 甚至可以管道 这个打开命令的参数 办法?
  2. 我需要使用某种类型吗? 延迟命令得到这个 工作,因为sed命令似乎没有等待输入?

3 个答案:

答案 0 :(得分:3)

您试图将swf文件的名称作为open命令的标准输入的输入,但它不支持。

它希望文件名作为参数(类似于-a)。

您可以这样做:

FILENAME=`xmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//'`
open -a 'Flash Player' $FILENAME

或单行:

open -a 'Flash Player' `xmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//'`

如果您正在使用bash(或其他现代POSIX shell),则可以使用$()替换非常难以理解的反引号字符:

open -a 'Flash Player' $(xmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//')

答案 1 :(得分:2)

管道中的所有命令都是同时启动的。在此步骤中,它们的输入/输出被链接在一起。

我的猜测是open -a 'Flash Player'不等待输入,而只是启动Flash播放器。我建议尝试用参数运行播放器:

name=$(mxmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//')
open -a 'Flash Player' "$name"

答案 2 :(得分:1)

我不熟悉“open”命令,因为它似乎是一个mac的东西,但我你想要做的是:

open -a 'Flash Player' $(mxmlc -warnings=false DocumentClass.as | tail -n 1 | sed 's/[[:space:]].*$//')

通常,您不能将参数传递给命令,您必须指定您希望将上一个命令的输出视为参数,如在我的示例中或使用xargs命令。但请注意,命令行的最大大小有限制。

相关问题