LINUX.ORG.RU

История изменений

Исправление vbr, (текущая версия) :

Во-первых есть встроенные команды shell-а и есть бинарники. И это разный код. /usr/bin/bash -c 'echo hi' и /usr/bin/echo hi это разный код. То же касается printf.

Во-вторых printf как правило интерпретирует эскейп-последовательности, а echo не интерпретирует. Но в zsh интерпретирует. Также echo добавляет символ перевода строки в конце, а printf нет.

В-третьих у echo могут быть опции -n чтобы не добавлять символ перевода строки в конца и -e чтобы интерпретировать слеши. А могут и не быть, см. первый пункт. Конечно же эскейп-последовательности в общем случае у каждой реализации могут быть свои, хотя, думаю, можно рассчитывать, что \xHH будет работать везде.

Вот пример из моего терминала, думаю, поймёшь, что всё это значит.

% echo '\xE2' | hexdump -C
00000000  e2 0a                                             |..|
00000002

% /usr/bin/echo '\xE2' | hexdump -C
00000000  5c 78 45 32 0a                                    |\xE2.|
00000005

% /usr/bin/echo -e '\xE2' | hexdump -C
00000000  e2 0a                                             |..|
00000002

% /usr/bin/printf '\xE2' | hexdump -C
00000000  e2                                                |.|
00000001

Исходная версия vbr, :

Во-первых есть встроенные команды shell-а и есть бинарники. И это разный код. /usr/bin/bash -c 'echo hi' и /usr/bin/echo hi это разный код. То же касается printf.

Во-вторых printf как правило интерпретирует эскейп-последовательности, а echo не интерпретирует. Также echo добавляет символ перевода строки в конце, а printf нет.

В-третьих у echo могут быть опции -n чтобы не добавлять символ перевода строки в конца и -e чтобы интерпретировать слеши. А могут и не быть, см. первый пункт. Конечно же эскейп-последовательности в общем случае у каждой реализации могут быть свои, хотя, думаю, можно рассчитывать, что \xHH будет работать везде.

Вот пример из моего терминала, думаю, поймёшь, что всё это значит.

% echo '\xE2' | hexdump -C
00000000  e2 0a                                             |..|
00000002

% /usr/bin/echo '\xE2' | hexdump -C
00000000  5c 78 45 32 0a                                    |\xE2.|
00000005

% /usr/bin/echo -e '\xE2' | hexdump -C
00000000  e2 0a                                             |..|
00000002

% /usr/bin/printf '\xE2' | hexdump -C
00000000  e2                                                |.|
00000001