我几乎是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
命令后打开。但它提前开放了。
所以我的问题有两个:
sed
命令似乎没有等待输入?答案 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
命令。但请注意,命令行的最大大小有限制。