【问题标题】:Why is bash ">" string comparison failing for path names?为什么路径名的 bash ">" 字符串比较失败?
【发布时间】:2017-09-25 22:48:04
【问题描述】:

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

$ 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

有什么线索吗?

谢谢。


编辑 - 在接受的答案中回复 cmets:

$ 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
>

编辑新问题是“X”在“a”之前。

$  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 冒泡排序期间,数百个额外目录的排序顺序会导致列表不按顺序向上移动。

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

【问题讨论】:

  • 在运行测试之前,您是否尝试过在您的环境中设置LANG=C? (在设置之前跟踪它是什么,以便之后重新设置。)
  • @JonathanLeffler,哇,它有效。您可以发布答案以便我接受吗?

标签: string bash command-line path


【解决方案1】:

将评论转化为答案。

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

我应该注意到,尽管这似乎适用于他们环境中的 OP,但在 macOS Sierra 10.12.4 上对我来说似乎没有什么不同——无论是使用本机 Bash 3.2.x 还是更现代的 Bash 4.3 .x.

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

【讨论】:

  • 虽然它解决了/etc/cupsholder 的问题,但它产生了一个新问题:if [[ "/etc/X11/xsm" &gt; "/etc/acpi" ]]; then echo "&gt;"; else echo "&lt;="; fi 返回&lt;=。它应该返回&gt;。重置为默认语言 en_CA.UTF-8 会给出正确的结果。您能否推荐任何链接以进一步阅读 bash 排序层次结构?
  • 您将需要找到或创建一个区域设置,这样排序规则就是您想要的。 X11 结果是 C 排序规则所期望的结果。事物以最冷的顺序排序。听起来您想要一个不忽略标点符号的不区分大小写的排序规则。我不知道你在哪里找到的。
  • 我更新了解释为什么不需要特殊排序规则的问题,因为它是基本的目录排序。你认为我需要深入研究tree 或ls 源代码以查看他们使用的“语言环境”吗?
  • 您可能需要查看ls、tree 和bash 的代码,以了解它们使用哪些函数对数据进行排序(以及它们是否设置了语言环境,以及他们设置的内容)。您可能会发现他们以 3 种不同的方式进行操作,而协调这 3 种方式是不可行的。您可能会发现 2 一致,而 1 不一致;你必须决定这有多重要。
  • 我已经解决了这个问题。我正在解决的问题是逐个标点符号进行整理。实际上,我只需要在键上使用[:alnum:] 测试用例来匹配tree 排序样式。我觉得我应该对此发表一个答案,但不知道这个社区是否对此感到不满。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多