为什么是bash">"字符串比较失败的路径名?

时间:2017-04-27 23:44:25

标签: string bash command-line path

在这三个简短的测试中,只有第二个测试正确:

$ if [[ "/etc/cupshelpers" > "/etc/cups/interfaces" ]]; then echo ">"; else echo "<="; fi
<=
$ if [[ "/etc/cupsh" > "/etc/cups/" ]]; then echo ">"; else echo "<="; fi
>
$ if [[ "/etc/cupshe" > "/etc/cups/i" ]]; then echo ">"; else echo "<="; fi
<=

当我对目录列表进行排序并且结果与tree命令不同时,问题变得明显:

$ tree /etc/cups* -d
/etc/cups
├── interfaces
├── ppd
└── ssl [error opening dir]
/etc/cupshelpers

任何线索?

感谢。

修改 - 回复已接受答案中的评论:

$ bash --version
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ uname -a
Linux dell 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

修改证明其有效(您可以试用自己的非Mac机器)。

$ if [[ "/etc/cupshelpers" > "/etc/cups/interfaces" ]]; then echo ">"; else echo "<="; fi
<=
$ LANG=C
$ if [[ "/etc/cupshelpers" > "/etc/cups/interfaces" ]]; then echo ">"; else echo "<="; fi
>

修改新问题是&#34; X&#34;来之前&#34; a&#34;。

$  if [[ "/etc/X11/xsm" > "/etc/acpi" ]]; then echo ">"; else echo "<="; fi
>
$ echo $LANG
en_CA.UTF-8
$ LANG=C
$ if [[ "/etc/X11/xsm" > "/etc/acpi" ]]; then echo ">"; else echo "<="; fi
<=

我没有什么特别的尝试。我使用tree命令生成目录名列表(3,000到20,000)。后来我将一个目录附加到列表中,我需要使用内部bash数组。在bash冒泡排序期间,整理顺序会导致数百个额外的目录不按顺序向上移动。

我认为我不需要特殊的整理顺序,只需treels命令使用。

1 个答案:

答案 0 :(得分:1)

将评论转换为答案。

在运行测试之前,您是否尝试在您的环境中设置LANG=C? (在设置之前记录它是什么,以便之后可以重置它。)

我应该注意到虽然这似乎适用于他们环境中的OP,但它似乎对我在macOS Sierra 10.12.4上有所作为 - 无论是使用原生Bash 3.2.x还是更现代Bash 4.3.x。

因此,您的里程可能会有所不同。