персонаж ехо нового рядка не працює в баші


13

У мене є Баш скрипт , який має безліч echoзаяв , а також я псевдонім , echoщоб echo -eяк в .bash_profileі .bashrc, таким чином , що нові лінії друкуються правильно для заяви , як echo 'Hello\nWorld'результат повинен бути

Hello
World

але вихід, який я отримую, - це

Hello\nWorld

Я навіть намагався використовувати shopt -s expand_aliasesв сценарії, це не допомагає

Я виконую свій сценарій як bash /scripts/scriptnm.sh; якщо я запускаю його, коли . /scripts/scriptnm.shотримую бажаний вихід ...


3
згладжування, echoяк ви хочете, - це погана практика ІМХО
шелхоліка

1
Використовуйте подвійні лапки, щоб \ n інтерпретувались. Одиночні цитати перешкоджають інтерпретації \ n та ще багатьох речей.
BillThor

Відповіді:


16

Змішана історія echoзасобів за замовчуванням залежить від оболонки до оболонки. POSIX вказує, що результат echo"визначено реалізацією", якщо перший аргумент є -nабо будь-який аргумент містить зворотну косу рису.

Більш надійно використовувати printf(як вбудовану команду, або як зовнішню команду) там, де поведінка більш чітко визначена: зворотна косої лінії стилю С ухиляються, а специфікатори формату підтримуються у рядку формату (перший аргумент).

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

Ви можете контролювати розширення зворотної косої межі керуючих послідовностей з баш «и echoвбудованої команди з xpg_echoопцією оболонки.

Встановіть його у верхній частині будь-якого сценарію bash, щоб echoавтоматично розширювати втечі зворотної косої риси без додавання -eдо кожної команди echo.

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; Працювали для мене.
Башусер

6

Під час використання bash myfile.shBash запускається в "пакетному" режимі, в окремому процесі, і не читає його профіль або rcfile.

Під час використання . myfile.shфайл отримується за допомогою поточного процесу оболонки (як би його вміст було введено вами), тому він бачить ваші визначені на даний момент псевдоніми.

Загалом, дуже погана ідея писати сценарії, які залежать від конкретної конфігурації оболонки, особливо псевдонімів, якщо ви не визначите їх у самому сценарії . ( Ніколи не покладайтеся на користувача .bashrc, навіть якщо це ваш власний.)


5

Рекомендована практика - використовувати printfдля всіх нових сценаріїв.

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"

+1 printf трохи складніше у використанні, ніж ехо, але він більше, ніж окупається, уникаючи невідповідностей ехо.
Гордон Девіссон

1

Це добре працює в терміналі

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

збережіть у файл і зробіть його виконуваним (chmod + x)

запустити як ./your_file


запустити його як bash your_file і перевірити вихід.
Башусер

Працює як очікується
LaLeX

але ехо "Hello \ nWorld" не відображає очікуваного результату. Оскільки відлуння вже чує відлуння, - це повинно, але це не працює, і це моє запитання
Bashuser

Оскільки псевдонім echo є поганою практикою (програми, які від цього залежать, можуть зламатися), ви повинні видалити псевдонім і в своєму скрипті шукати echo end замінити його на echo -e
LaLeX

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