shell排序的奇怪结果?

时间:2015-04-14 15:02:42

标签: shell sorting

测试1

此代码:

text() {
    cat <<'EOF'
f='.git_cache_meta';
f='adir/bdir/cdir/';
f='adir/';
f='he'\'''\'''\'''\'''\''s good.txt';
f='-test';
f='subdir/';
f='一份文件.txt';
f='subdir/.secret';
f='my file.txt';
f='adir/bdir/cdir/keep.txt';
f='adir/bdir/';
EOF
}

text | sort

输出:

f='adir/';
f='adir/bdir/';
f='adir/bdir/cdir/';
f='adir/bdir/cdir/keep.txt';
f='.git_cache_meta';
f='he'\'''\'''\'''\'''\''s good.txt';
f='my file.txt';
f='subdir/';
f='subdir/.secret';
f='-test';
f='一份文件.txt';

测试2

这段代码:

text() {
    cat <<'EOF'
f='.git_cache_meta'; something
f='adir/bdir/cdir/'; something
f='adir/'; something
f='he'\'''\'''\'''\'''\''s good.txt'; something
f='-test'; something
f='subdir/'; something
f='一份文件.txt'; something
f='subdir/.secret'; something
f='my file.txt'; something
f='adir/bdir/cdir/keep.txt'; something
f='adir/bdir/'; something
EOF
}

text | sort

输出:

f='adir/bdir/cdir/keep.txt'; something
f='adir/bdir/cdir/'; something
f='adir/bdir/'; something
f='adir/'; something
f='.git_cache_meta'; something
f='he'\'''\'''\'''\'''\''s good.txt'; something
f='my file.txt'; something
f='subdir/.secret'; something
f='subdir/'; something
f='-test'; something
f='一份文件.txt'; something

问题

我对上述代码的期望是按ASCII码排序,即:

f='-test';
f='.git_cache_meta';
f='adir/';
f='adir/bdir/';
f='adir/bdir/cdir/';
f='adir/bdir/cdir/keep.txt';
f='he'\'''\'''\'''\'''\''s good.txt';
f='my file.txt';
f='subdir/';
f='subdir/.secret';
f='一份文件.txt';

和此:

f='-test'; something
f='.git_cache_meta'; something
f='adir/'; something
f='adir/bdir/'; something
f='adir/bdir/cdir/'; something
f='adir/bdir/cdir/keep.txt'; something
f='he'\'''\'''\'''\'''\''s good.txt'; something
f='my file.txt'; something
f='subdir/'; something
f='subdir/.secret'; something
f='一份文件.txt'; something

respectly。

两个测试结果显示排序不遵循ASCII码,并且向尾部添加相同的值(test2)会产生非常不同的结果(在测试1中f='adir/';在{{1}之前},而在测试2 f='adir/bdir/cdir/';之后是f='adir/'; something)。

我想知道f='adir/bdir/cdir/'; something使用的实际算法是什么。我应该如何编码以产生预期的结果?

1 个答案:

答案 0 :(得分:1)

它使用$LC_COLLATE中指定的归类顺序。有关详细信息,请参阅locale(7)手册页。

text | LC_COLLATE=C sort