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



在这三个短测试中,第二个测试仅正确地工作:

$ 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

edit 证明它有效(您可以在自己的非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
>

编辑新问题是" x"。

$  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命令使用的内容。

将注释转换为答案。

您是否尝试过在运行测试之前在环境中设置LANG=C?(在设置之前跟踪它是什么,以便以后可以将其重置。(

我应该注意,尽管这似乎对他们的环境中的OP有效,但在Macos Sierra 10.12.4上似乎并没有有所作为 - 无论是使用本地bash 3.2.x还是更现代的bash 4.3.x。

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

最新更新