Bash文档中的 about -a
和-e
options 都说:
-a file True if file exists. -e file True if file exists.
试图找出差异,我运行了以下脚本:
resin_dir=/Test/Resin_wheleph/Results if [ -e ${resin_dir} ] ; then echo "-e "; fi if [ ! -e ${resin_dir} ] ; then echo "! -e"; fi if [ -a ${resin_dir} ] ; then echo "-a"; fi if [ ! -a ${resin_dir} ] ; then echo "! -a"; fi
/Test/Resin_wheleph/Results
存在并且是一个目录.这就是我得到的:
-e -a ! -a
这似乎有点奇怪(注意-a
和 ! -a
).但是当我if [[ -e ${resin_dir} ]]
在类似的脚本中使用双括号(例如)时,它给出了合理的输出:
-e -a
所以:
-a
和-e
选项有什么区别?
-a
在单支架内使用时为什么会产生奇怪的结果?
Johannes Sch.. 67
我研究过,这很毛茸茸:
-a
不推荐使用,因此不再在联机帮助页中列出/usr/bin/test
,但仍然在bash中.使用-e
.对于单个'[',bash内置行为与bash内置行为相同test
,其行为/usr/bin/[
与/usr/bin/test
(和一个是另一个的符号链接)相同.注意效果-a
取决于它的位置:如果它在开始时,则意味着file exists
.如果它位于两个表达式的中间,则表示逻辑and
.
[ ! -a /path ] && echo exists
不起作用,因为bash手册指出那里-a
被认为是一个二元运算符,所以上面的解析不是a negate -a ..
而是if '!' and '/path' is true
(非空).因此,您的脚本始终输出"-a"
(实际上测试文件),"! -a"
这实际上是二进制文件and
.
因为[[
,-a
不再用作二进制文件and
(&&
在那里使用),因此它的唯一目的是检查那里的文件(虽然被弃用).所以,否定实际上是你所期望的.
我研究过,这很毛茸茸:
-a
不推荐使用,因此不再在联机帮助页中列出/usr/bin/test
,但仍然在bash中.使用-e
.对于单个'[',bash内置行为与bash内置行为相同test
,其行为/usr/bin/[
与/usr/bin/test
(和一个是另一个的符号链接)相同.注意效果-a
取决于它的位置:如果它在开始时,则意味着file exists
.如果它位于两个表达式的中间,则表示逻辑and
.
[ ! -a /path ] && echo exists
不起作用,因为bash手册指出那里-a
被认为是一个二元运算符,所以上面的解析不是a negate -a ..
而是if '!' and '/path' is true
(非空).因此,您的脚本始终输出"-a"
(实际上测试文件),"! -a"
这实际上是二进制文件and
.
因为[[
,-a
不再用作二进制文件and
(&&
在那里使用),因此它的唯一目的是检查那里的文件(虽然被弃用).所以,否定实际上是你所期望的.