Прямо к сути.
Все это зависит от значения LANG
или, LC_ALL
установленного в сеансе терминала при запуске tr
. В Linux они установлены, C
а в macOS - что-то вроде en_US.UTF-8
. Конечно, это en_US
может быть какой-то другой местный язык, такой как en_UK
(английский английский), но дело в том, что причиной является [something].UTF-8
настройка вместо простого ASCII через C
.
Подробнее
Похоже, что tr
в macOS конвертирует в 0xff
UTF8 эквивалент, c3bf
когда он получает вместо чистого ASCII 0xff
. Это объясняется здесь, в этой ветке поддержки сообщества Apple здесь :
Linux не обрабатывает Unicode в терминале, как Mac. Если вы установите переменную среды «LANG» в «C» (как это, вероятно, в Linux), она будет работать. В противном случае все эти старшие биты будут интерпретироваться как символы Юникода.
И использование этого LANG
совета работает! Просто сделайте следующее; проверено лично мной только сейчас на macOS 10.13.6 (High Sierra).
Во-первых, запомните, как LANG
выглядит существующее значение:
echo $LANG
Вывод, который я вижу:
en_US.UTF-8
Теперь установите LANG
значение C
так:
LANG=C
И снова запустите эту команду:
dd if=/dev/zero ibs=1k count=100 | tr "\000" "\377" >paddedFile.bin
Теперь hexdump
значения должны выглядеть так:
hexdump -C paddedFile.bin 00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00019000
Чтобы сбросить LANG
значение, просто закройте сеанс терминала или просто выполните эту команду:
LANG=en_US.UTF-8
Или, как указано в комментариях, вы можете просто установить LANG
значение прямо в параметрах командной строки, прежде чем вызывать tr
так:
dd if=/dev/zero ibs=1k count=100 | LANG=C tr "\000" "\377" >paddedFile.bin
И вы даже можете использовать LC_ALL
вместо, LANG
потому что LANG
это просто происходит от в LC_ALL
любом случае, как это:
dd if=/dev/zero ibs=1k count=100 | LC_ALL=C tr "\000" "\377" >paddedFile.bin