範囲を使用したtrの奇妙な動作

範囲を使用したtrの奇妙な動作

trを使用すると、奇妙な動作を示す特定のサーバーがあります。以下は、稼働中のサーバーの例です。

-bash-3.2$ echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
-bash-3.2$

これは私にとって完全に理解されています。

ただし、これは「特殊」サーバーからのものです。

[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890

ご覧のとおり、すべての小文字を削除すると失敗します。ただし、文字「o」は削除されます。

興味深い部分は次の2つの例ですが、私には理解できません。

[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-n]
opqrstuvwxyz1234567890
[root@host~]# echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-o]
abcdefghijklmnpqrstuvwxyz1234567890
[root@host~]#

(最後の例では「o」が削除されました)

ここで何が起こっているのか知っている人はいますか?私が使用している他のLinuxボックスではそれを再現することはできません。

ベストアンサー1

o現在のディレクトリには次のファイルがあります。

foo> ls
foo> echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
1234567890
foo> touch o
foo> echo "abcdefghijklmnopqrstuvwxyz1234567890"|tr -d [a-z]
abcdefghijklmnpqrstuvwxyz1234567890

[a-z]一致するものが見つかると、シェルは文字列を展開します。

これをパス名拡張と呼びます。man bash

パス名拡張
語を分離した後、bashは-fオプションが設定されていない限り、文字*、?と[について各単語を検索します。 ...(...)

bash が拡張を実行します。

[...]は含まれている文字の1つと一致します。

おすすめ記事