2012-04-16 113 views
0

这是一个简单的脚本,从实际有用的东西中提炼出来的,适用于Fedora,但不适用于OS X Lion。bash脚本与Linux上的阵列作品不在mac os x

declare -a directory_contents=($(ls .)) 
test -e ${directory_contents[0]} 
echo $? 

在linux上它返回0,即测试-e通过。在Mac上,它返回1.

任何想法在这里可能会出错?

+0

上面的代码在我的OS X 10.6.8上返回0 ... – miku 2012-04-16 21:45:56

+0

@NickAtoms,[yes](https://gist.github.com/2401956)。这是很好的老bash 3.2.48(1) - 释放。 – miku 2012-04-16 22:00:43

+0

苹果仍然分发bash 3.2,而不是bash 4.x.这是你麻烦的根源吗? – 2012-04-16 22:01:57

回答

0

我在原始问题中忽略的一点是,我的“脚本”确实是一个bash函数。我的问题的原因是“ls”正在解析为具有“--color = auto”的别名,将不可打印的字符添加到实际的文件名。

总是定义变量来保存脚本中使用的可执行文件的完整路径,例如“LS =/bin/ls”。而且,根据上面的答案,ls可能不是您强健的制作脚本的最佳选择。

2

尼克的答案是正确的。但是你也应该记住,除非在高度控制的环境中,ls而不是你应该用来填充带有文件名的变量。有很多其他的方法可以选择一个文件名。

[[email protected] ~]$ ls -l foo* 
-rw-r--r-- 1 ghoti wheel 0 Apr 16 21:01 foo bar.txt 
-rw-r--r-- 1 ghoti wheel 0 Apr 16 21:01 foo.txt 
[[email protected] ~]$ test1=`for i in foo*txt;do echo $i; break; done` 
[[email protected] ~]$ echo $test1 
foo bar.txt 
[[email protected] ~]$ test2=`find . -name foo\*.txt -print | head -1` 
[[email protected] ~]$ echo $test2 
./foo.txt 
[[email protected] ~]$ 

显然,并不是所有的方法都会以相同的顺序返回文件。

还要注意以连字符开头的文件名。 :-)

+0

Upvote,因为你的答案直指问题的核心,即不要依赖“ls”。虽然这不是真正的原因。我回答了我自己的问题,尽管现在看起来很明显,所以希望可以帮助其他人。 – pduey 2012-04-17 14:52:27