这是一个简单的脚本,从实际有用的东西中提炼出来的,适用于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.
任何想法在这里可能会出错?
这是一个简单的脚本,从实际有用的东西中提炼出来的,适用于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.
任何想法在这里可能会出错?
我在原始问题中忽略的一点是,我的“脚本”确实是一个bash函数。我的问题的原因是“ls”正在解析为具有“--color = auto”的别名,将不可打印的字符添加到实际的文件名。
总是定义变量来保存脚本中使用的可执行文件的完整路径,例如“LS =/bin/ls”。而且,根据上面的答案,ls可能不是您强健的制作脚本的最佳选择。
如果ls
返回的第一个文件名称中有空格,${directory_contents[0]}
将不会展开为完整的文件名(仅限于第一个空格)。这个条件是否适用于你的OSX测试,而不是你的Fedora测试?
添加声明语句前加上下面一行可能会解决问题:
IFS=$'\n'
参考:http://www.linuxquestions.org/questions/programming-9/bash-passing-arrays-with-spaces-611159/
尼克的答案是正确的。但是你也应该记住,除非在高度控制的环境中,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] ~]$
显然,并不是所有的方法都会以相同的顺序返回文件。
还要注意以连字符开头的文件名。 :-)
Upvote,因为你的答案直指问题的核心,即不要依赖“ls”。虽然这不是真正的原因。我回答了我自己的问题,尽管现在看起来很明显,所以希望可以帮助其他人。 – pduey 2012-04-17 14:52:27
上面的代码在我的OS X 10.6.8上返回0 ... – miku 2012-04-16 21:45:56
@NickAtoms,[yes](https://gist.github.com/2401956)。这是很好的老bash 3.2.48(1) - 释放。 – miku 2012-04-16 22:00:43
苹果仍然分发bash 3.2,而不是bash 4.x.这是你麻烦的根源吗? – 2012-04-16 22:01:57