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

16

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

Star OS
источник
Работает ли 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
terdon
источник
Вы правы, что подойдет любой действительный символ `\`.
Pilot6
@ Pilot6 да, но проблема с этим подходом (вашим и моим) заключается в том, что он добавляет дополнительный символ. Это может вызвать проблемы в будущем. Особенно если потом захочешь разобрать и попробовать что-то подобное grep '^-n'. pritnfэто путь, действительно.
Terdon
Ну, printfв любом случае лучше, но вопрос касается просто echo.
Pilot6
2
Похоже, echo -e "-n\c"делает то же самое.
Pilot6
1
\cэто подавить дальнейший вывод
Pilot6
15

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

% printf "-n\n"       
-n
AB
источник
Это предпочтительная идея для переносимости
Сергей Колодяжный
7

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

echo -e  "\r-n"

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

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

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

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

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

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

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

echo -e "-n\c"

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

echo -e "-n\n"

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

Pilot6
источник
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характер.

jiwopene
источник
Вы пробовали это? Это неверно.
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

jiwopene
источник
Ash? Ash? POKEMON я имею в виду, что?
Star OS
Я побежал "Занятая коробка"
Jiwopene
Скажите «Busybox» или «Busybox Ash». Не только "Пепел", потому что люди могут думать об этом персонаже покемона или о золе от вулканов.
Star OS
Лучше. alt255alt255
Star OS
@StarOS ash- это название Almquist Shell.
муру