Подтвердить что ты не робот

Как сделать эхо-интерпретацию обратной косой черты и не печатать конечную новую строку?

Я хотел бы использовать echo в bash для печати строки символов, за которой следует только возврат каретки. Я просмотрел справочную страницу и обнаружил, что echo -e сделает echo интерпретировать escape-символы обратной косой черты. Используя это, я могу сказать echo -e 'hello\r', и он будет печататься следующим образом

$>echo -e 'hello\r'
 hello
$>

Итак, похоже, что он правильно обработал каретку. Я также нашел, что echo -n в man-странице остановит echo от вставки символа новой строки, и похоже, что он работает, когда я это делаю

$>echo -n 'hello\r'
 hello\r$>

Проблема, с которой я столкнулась, заключается в объединении как -e, так и -n. Я пробовал каждый из echo -e -n 'hello\r', echo -n -e 'hello\r', echo -en 'hello\r' и echo -ne 'hello\r', и ничего не печатается так:

$>echo -ne 'hello\r'
$>

Есть ли что-то, чего я здесь не вижу, или варианты -e и -n не будут использоваться вместе?

4b9b3361

Ответ 1

Я думаю, что это работает, вы просто не видите этого. Это ваша команда:

$> echo -ne 'hello\r' 

Из-за возврата каретки (\r), это оставит курсор в начале той же строки на терминале, где он написал hello - это означает, что, когда следующая информация, выводимая на терминал, будет написано. Поэтому, если ваше фактическое приглашение больше, чем $>, которое вы здесь видите, оно полностью перезапишет hello.

Эта последовательность позволит вам увидеть, что на самом деле происходит:

echo -ne 'hello\r'; sleep 5; echo 'good-bye'

Но для лучшей переносимости для других оболочек я бы избегал использования опций на echo. Это чисто багизмы, не поддерживаемые стандартом POSIX. Однако встроенная функция printf указана POSIX. Поэтому, если вы хотите отображать строки без новой строки и разбора последовательностей обратной косой черты, вы можете просто использовать ее:

printf '%s\r' 'hello'

Ответ 2

Существует множество различных реализаций команды echo. Там один встроенный в большинство оболочек (с различным поведением для каждого), а поведение /bin/echo значительно варьируется от одной системы к другой.

Вместо echo используйте printf. Он встроен в bash, а также доступен как внешняя команда, и его поведение намного более согласовано во всех реализациях. (Основное отличие состоит в том, что GNU coreutils printf распознает опции --help и --version.)

Просто используйте:

printf 'hello\r'

Ответ 3

Я хочу, чтобы вы познакомили вас с printf.

OP, встретить printf. printf. Это OP...

Всякий раз, когда вы пытаетесь сделать что-либо необычное с выходом в BASH, вы должны переключиться на printf. На самом деле, я использую printf все время, поэтому мои скрипты будут работать под BASH и Kornshell.

Хотя BASH и Kornshell на 99% одинаковы, команда echo отличается. В Kornshell он устарел, и вы должны использовать встроенный print. Однако в BASH нет print. Использование printf решает проблему, потому что она работает (вроде) одинаково в обеих оболочках.

Так как printf автоматически не заканчивает каждую строку с помощью \n, вам не нужно беспокоиться о том, как предотвратить добавление \n. Черт, если вы хотите \n, вы должны поставить его сами. В вашем случае:

printf `hello\r`

Однако по соображениям безопасности вы действительно должны это сделать:

printf '%s\r' 'hello'

Это привычка, с которой я столкнулся, когда я использую printf. Представьте себе, хочу ли я распечатать $FOO, и я делаю это:

printf "$FOO\n"

Это нормально работает, но что, если $FOO имеет тире в начале или имеет знак %. Вышеупомянутое не будет делать то, что я хочу сделать. Однако, если я это сделаю:

printf '%s\n' "$FOO"

Это напечатает $FOO независимо от того, что в нем $FOO.

Ответ 4

Цитирование. Это волна будущего. Всегда цитируйте.

echo -ne 'hello\r'

Используйте двойные кавычки, если вы поместите переменную внутри, которую хотите развернуть.

Ответ 5

POSIX 7 говорит, что это невозможно:

Если первый операнд равен -n, или если какой-либо из операндов содержит символ обратной косой черты, результаты определяются реализацией.

В Ubuntu 12.04, например:

  • Bash встроенное эхо echo -e '\n' интерпретирует новую строку, echo '\n' не делает.
  • /bin/sh встроенный echo не имеет опции -e и интерпретирует новую строку даже без нее. Это можно байт при записи Makefile s, которые по умолчанию используют /bin/sh.

Решение POSIX 7: printf, как упоминалось выше.