Как напечатать «-n» без ввода новой строки?


16

Я пытаюсь распечатать, -nиспользуя echoкоманду. Но если я просто наберу echo -n, он выдает только новую строку, а не появляется -n, вместо этого выдает новую строку.


Работает ли echo -n -- -n(нет Linux-box удобного для тестирования)?
n0rd

Я устанавливаю Ubuntu на виртуальную машину, и она кажется очень медленной, подождите.
Star OS

1
Я проверил - это не так. Вероятно, потому что это внутренняя команда bash и она не использует getopt(???) для разбора командной строки
n0rd

1
Этот вопрос задается и на него дается ответ в pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - «Соответствующие приложения, которые ... могут ожидать эхо -n, должны использовать утилиту printf, полученную из Ninth Издание системы "
Брандин

Первый популярный вопрос, который я задал. Ура?
Star OS

Ответы:


28

Проблема в том, что echoинтерпретируется -nкак аргумент. В реализации bash по умолчанию это означает (с help echo):

  -n  do not append a newline

Есть разные способы обойти это:

  1. Превратите это во что-то, что невозможно, включив другого персонажа. Например, скажите echoне печатать символ новой строки -n, затем скажите ему интерпретировать экранирование обратной косой черты -eи явно добавить символ новой строки.

    $ echo -ne '-n\n'
    -n
  2. Или просто укажите пробел

    $ echo " -n"
     -n

    Это, однако, добавляет пробел, который вы, вероятно, не хотите.

  3. Используйте непечатный символ перед ним. Вот. Я использую Backspace ( \b)

    $ echo -e "\b-n"
    -n

    Это также добавляет дополнительный символ, который вы, вероятно, не хотите.

  4. Используйте обман

    $ echo n- | rev
    -n

    Команда revпросто печатает свой вывод в обратном порядке.

  5. Используйте правильный инструмент для работы

    $ printf -- '-n\n'
    -n

Вы правы, что подойдет любой действительный символ `\`.
Pilot6

@ Pilot6 да, но проблема с этим подходом (вашим и моим) заключается в том, что он добавляет дополнительный символ. Это может вызвать проблемы в будущем. Особенно если потом захочешь разобрать и попробовать что-то подобное grep '^-n'. pritnfэто путь, действительно.
Terdon

Ну, printfв любом случае лучше, но вопрос касается просто echo.
Pilot6

2
Похоже, echo -e "-n\c"делает то же самое.
Pilot6

1
\cэто подавить дальнейший вывод
Pilot6

15

Иногда хорошей идеей является использование правильного инструмента. Вы можете использовать printfвместо этого:

% printf "-n\n"       
-n


Это предпочтительная идея для переносимости
Сергей Колодяжный

7

Вы можете использовать эту команду, но она добавляет дополнительный пробел.

echo -e  "\r-n"

Это своего рода хак.

-e включает символы команды обратной косой черты.

\r это возврат каретки.

На самом деле любой \допустимый символ будет делать в любом месте строки.

Вы можете увидеть, какие из них действительны help echo.

echo "-n"не работает, потому что -nиспользуется в качестве параметра для echo.

PS Лучшее решение ИМХО это

echo -e "-n\c"

Это не добавляет никаких дополнительных символов .

echo -e "-n\n"

печатает то же самое, но с новой строкой char.


1
Wov! Это лучше, чем у меня; Вы можете объяснить немного для "новичков" ;-)
Сади

Спасибо, я также заметил, что не имеет значения, где вы добавляете возврат каретки, в начале или в конце.
Сади

@ Сади, да, это потому, что добавление чего-либо делает его недействительным. -nдействительно, -nfooне так, что будет напечатано.
Terdon

У @terdon man echoтоже есть. Но helpэто немного лучше.
Pilot6

Я знаю, что это есть, это просто не актуально. /bin/echoэто совершенно другая вещь, и когда вы запускаете echoв bash, вы получаете встроенные функции, которые могут сильно отличаться в зависимости от вашей оболочки.
Terdon

5

Я думаю, что если вы определенно хотите использовать echoтолько, это должно удовлетворить вас:

echo "-n "

Это работает, потому что, хотя -nявляется допустимым параметром echo, -nс пробелом после него нет. Так как это не вариант, echoпросто печатает его.


Большинству зрителей здесь может понадобиться только «-n», а не «-n».
Star OS

5

Вы, ребята, действительно обдумываете это.

 echo -e \\055n

Или без запятой

 echo -en \\055n

Как printf "-n\n" происходит переосмысление?
Дмитрий Григорьев

Да, я просто ответил таким образом. Удалит мой ответ. Это относительно переносимо в том /bin/echoecho -e "\055n"
смысле,

не то, что я хочу.
Star OS

2

Чтобы расширить ответ @ AB, единственный переносимый способ echo- это воздерживаться от использования таких опций, как -n. Попробуйте использовать printfвместо этого, где это возможно Эта справочная страница содержит более подробную информацию и очень хорошо объясняет, когда и как echoи как printfследует использовать:

В настоящее время echo (1) является переносимым, только если вы опустите флаги и escape-последовательности. Вместо этого используйте printf (1), если вам нужно больше, чем просто текст.


Я собираюсь продлить ответ, пожалуйста, отредактируйте ответ.
Star OS

Я не уверен, что это хорошая идея, чтобы изменить ответ другого человека до такой степени, что он будет иметь больше текста от меня, чем от первоначального автора.
Дмитрий Григорьев

2

В скрипте Bash вы можете запустить:

echo -n -
echo n

Или в интерактивной оболочке:

echo -n - ; echo n

Это echoэс на -характер и nхарактер.


Вы пробовали это? Это неверно.
Pilot6


Первые командные выходы -pilot6@Pilot6:~$. Вторые выходы n.
Pilot6

@ Pilot6 Зависит от того, используете ли вы его в интерактивном терминале или в bash-скрипте, который не указан в вопросе. OTOH, если вам это нужно в терминале, просто объединить две строки &&- я бы не сказал, что этот ответ неправильный .
user12205

Я отредактирую это так, что это станет намного более понятным, это для сценария bash.
Star OS

1

Три других способа:

$ echo -e '\x2dn' # ASCII hexadecimal value
-n
$ echo -e '\u002dn' # Unicode code point
-n
$ echo -e '\u2dn' # Unicode code point shortened
-n

0

Вы можете запустить

printf -n;echo

Проверено в Busybox Ash


Ash? Ash? POKEMON я имею в виду, что?
Star OS

Я побежал "Занятая коробка"
Jiwopene

Скажите «Busybox» или «Busybox Ash». Не только "Пепел", потому что люди могут думать об этом персонаже покемона или о золе от вулканов.
Star OS

Лучше. alt255alt255
Star OS

@StarOS ash- это название Almquist Shell.
муру
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.