2010-09-01 116 views
1

我几乎是shell脚本的新手。我试图将一些管道命令的输出发送到OSX中bashopen命令。Bash:打开命令的管道参数失败。打开命令过早过早?

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

这是什么的AppleScript被发送到终端:

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 

但正如你所看到的,我再尝试这种管结果sed给Flash Player而这也正是它失败。 Flash Player似乎太早开放。我希望Flash Player只能在脚本完成sed命令后才能打开。但它提前开放。

所以我的问题是双重的:

  1. 它甚至有可能到管道的 参数open命令这 方式?
  2. 我是否需要使用某种类型的延迟命令 才能使这个 工作,因为open命令似乎没有在等待输入?

回答

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壳),可以更换漂亮$()

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

它的工作。我首先尝试了static_rtti的答案。感谢您的额外信息! – 2010-09-01 12:29:03

1

我不熟悉的“打开”命令,因为它似乎是MAC的事情,但我想想要做的是:

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

一般来说,你可以” t管道参数传递给命令时,必须指定您希望将前一个命令的输出作为参数处理,如我的示例或命令xargs。请注意,尽管对命令行的最大大小有限制。

+1

天才..它正在工作!哈哈,男人,我很兴奋!非常感谢!! – 2010-09-01 12:26:20

2

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

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

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

谢谢你的回答亚伦! – 2010-09-01 12:33:51