-c は、string1 内の文字の補数を使用すること、または「string1 にない任意の文字が string1 の値を置き換える」ことを意味します。
-t は、最初の値のセットを 2 番目のセットの長さに切り詰めることを意味します。String2 の長さは 1 文字のみであるため、string1 はその長さに切り捨てられます。
つまり: tr -ct '\n' '0' -> tr -t '\000\001\002...01234...ABCDEF...' '0' -> tr '\000' '0 '
これを試してテストしてください:
printf '\000afoo\n' | tr -ct '\na' '7'
「'\n' または 'a' 以外の任意の文字」 (-c) は '\000' (-t) になります。これは、長さが 1 の string2 に '7' が指定されているためです。
printf '\000afoo\n' | tr -ct '\na' '[7*]'
「'\n' または 'a' 以外の任意の文字」 (-c) は、そのセット内の任意の文字に '7' が使用されるため、残ります。これは GNU および歴史的な BSD tr のデフォルトの動作であるため、-t が指定されていない場合、'7' は '[7*]' と同様に機能します。System V および POSIX tr の場合、'[7*]' は反復形式ですが、'7' は最初のセットの最初の文字を単に '7' に置き換えます。これは間違いなくより直感的であり、確かに問題が発生する場所の一部です。 from (-t が指定されている場合、GNU tr は動作を System V に変更します)。