Як надрукувати "-n" без випуску нового рядка?


16

Я намагаюся надрукувати -nза допомогою echoкоманди. Але якщо я просто набираю echo -n, він видає лише новий рядок, а не з'являється -n, натомість видає новий рядок.


Чи echo -n -- -nпрацює (у вас немає зручності для тестування скриньки Linux)?
n0rd

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

1
Я перевірив - це не так. Можливо тому, що це внутрішня команда bash, і вона не використовує getopt(???) для розбору командного рядка
n0rd

1
Це питання задається і відповідає у публікації pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html - - "Відповідні програми, які ... можливо, очікують відлуння a -n, повинні використовувати утиліту printf, похідну від Дев'ятої. Видання системи "
Брандін

Перше популярне питання, яке я зробив. Так?
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

Ви правильні, що будь-який дійсний символ \ \ буде робити.
Пілот6

@ Pilot6 так, але проблема з таким підходом (вашим і моїм) полягає в тому, що він додає додатковий характер. Це може викликати проблеми внизу лінії. Особливо, якщо ви тоді хочете розібратися і спробувати щось подібне grep '^-n'. pritnfце справді шлях.
тердон

Що ж, printfкраще все-таки, але питання стосується справедливості echo.
Пілот6

2
Схоже, echo -e "-n\c"це робить точно.
Пілот6

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
Вов! Це краще, ніж моє; ви можете трохи пояснити "новачкам" ;-)
Саді

Дякую, я також помітив, що не має значення, куди ви додасте повернення вагона, на початку чи в кінці.
Саді

@Sadi так, тому що додавання чого-небудь робить це недійсним варіантом. -nдійсно, -nfooне так, що буде надруковано.
тердон

@terdon man echoтеж є. Але helpтрохи краще.
Пілот6

Я знаю, що це є, це просто не актуально. /bin/echoзовсім інша річ, і коли ти працюєш echoу баш, ти отримуєш вбудований, який може бути зовсім різним, залежно від твоїх оболонок.
тердон

5

Я думаю, якщо ви обов'язково хочете використовувати echoлише це, це повинно вас задовольнити:

echo "-n "

Це працює, тому що поки -nце допустимий варіант для echo, -nпробілу після нього немає. Оскільки це не варіант, echoпросто надрукуйте його.


Більшість глядачів тут можуть хотіти лише "-n", а не "-n".
Star OS

5

Ви, хлопці, справді це передумуєте.

 echo -e \\055n

Або без задніх рядків

 echo -en \\055n

Як відбувається printf "-n\n" переосмислення?
Дмитро Григор’єв

Так, я просто відповів таким чином. Видалить мою відповідь. Це порівняно портативно, оскільки він працює із вбудованим відлунням і, /bin/echoпринаймні, якщо його викликають якecho -e "\055n"
abligh

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

2

Щоб поширити відповідь @ AB, єдиний портативний спосіб використання echo- це утриматися від використання будь-яких варіантів, таких як -n. Розгляньте використання printfзамість того, де це можливо. Ця довідкова сторінка містить більш детальну інформацію та дуже добре пояснює, коли і як echoі яким чином printfслід користуватися:

Сьогодні ехо (1) є портативним лише у тому випадку, якщо ви опустіть прапори та уникнете послідовності. Використовуйте натомість printf (1), якщо вам потрібно більше, ніж звичайний текст.


Я хочу поширити відповідь, відредагуйте її.
Зірка ОС

Я не впевнений, що це гарна ідея змінити чужу відповідь на той момент, коли в ній буде більше тексту, ніж від першого автора.
Дмитро Григор’єв

2

У сценарії Bash ви можете запустити:

echo -n -
echo n

Або в інтерактивній оболонці:

echo -n - ; echo n

Це echoі є -персонаж, і nперсонаж.


Ви пробували? Це неправильно.
Пілот6


Перші командні виходи -pilot6@Pilot6:~$. Другий вихід n.
Пілот6

@ Pilot6 Залежить від того, запускаєте ви його в інтерактивному терміналі або в bash-скрипті, що не вказано в питанні. ОТОХ, якщо вам це потрібно в терміналі, просто поєднати два рядки &&- я б не дуже сказав, що ця відповідь неправильна .
користувач12205

Я відредагую його, щоб це стало набагато зрозумілішим, що це для баш сценарію.
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


Зола? Зола? ПОКЕМОН я маю на увазі, що?
Star OS

Я побіг 'busbox ash'
jiwopene

Скажіть "Busybox" або "Busybox Ash". Не просто "Еш", бо люди можуть подумати про цей покемоновий персонаж або попіл ******* від вулканів.
Зірка ОС

Краще. alt255alt255
Star OS

@StarOS ash- назва оболонки Алмкіста.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.