echo
echo
Реалізація яких строго відповідає специфікації Single Unix буде додати нові рядки , якщо ви:
echo 'line1\nline2'
Але це не є надійною поведінкою. Насправді, насправді немає жодної стандартної поведінки, якої можна очікувати echo
.
ОПЕРАНДИ
string
Рядок, який слід записати на стандартний вихід. Якщо перший операнд є -n
, або якщо будь-який з операндів містить символ < \
зворотний косий рядок> , результати визначаються реалізацією .
У системах, сумісних з XSI , якщо перший операнд є -n
, він повинен розглядатися як рядок, а не як варіант . Наступні послідовності символів повинні бути розпізнані в системах, що відповідають XSI, в межах будь-якого з аргументів:
\a
- Напишіть <alert> .
\b
- Напишіть <backspace> .
\c
- Пригнічіть <newline>, що в іншому випадку слідує за заключним аргументом у висновку. Усі символи, наведені \c
в аргументах, ігноруються.
\f
- Напишіть <form-feed> .
\n
- Напишіть <newline> .
\r
- Напишіть <carriage-return> .
\t
- Напишіть <tab> .
\v
- Напишіть <vertical-tab> .
\\
- Введіть символ <зворотний проріз> .
\0num
- Напишіть 8-бітове значення, яке дорівнює нулю, одному, дво- чи тризначному восьмеричному номеру num
.
І тому насправді не існує жодного загального способу знати, як написати новий рядок echo
, за винятком того, що ви, як правило, можете покластися лише на те, echo
щоб зробити це.
bash
Оболонка зазвичай зовсім НЕ відповідає специфікації, а також обробляє -n
і інші варіанти, але навіть це є невизначеним. Ви можете зробити:
shopt -s xpg_echo
echo hey\\nthere
hey
there
І навіть це не потрібно, якщо bash
він був побудований з можливістю збору часу ...
--enable-xpg-echo-default
Зробіть echo
заздалегідь вбудовані символи розширення символів, що уникнули косої риски, не вимагаючи цього -e
параметра. Це встановлює значення за замовчуванням для параметра xpg_echo
оболонки на on
, що змушує Bash echo
поводитись більше, як версія, визначена в специфікації Single Unix, версія 3. Дивіться Bash Builtins , щоб отримати опис послідовностей епізоду , що echo
розпізнається.
printf
З іншого боку, printf
поведінка досить приборкано порівняно.
RATIONALE
printf
Утиліта була додана , щоб забезпечити функціональні можливості, які історично наданим echo
. Однак через непримиренні відмінності в різних версіях echo
існуючих версій є мало особливих особливостей, що залишає їх новій printf
утиліті, яка базується на одній у системі Дев'ятого видання.
Розділ ДОСЛІДЖЕНОГО ОПИСУ майже точно відповідає printf()
функції в стандарті ISO C, хоча він описаний термінами позначення формату файлу у форматі XBD File Notation .
Він обробляє рядки формату, які описують його аргументи - що може бути будь-якою кількістю речей, але для рядків - це майже будь- %b
які рядки yte або буквальні %s
тренги. Окрім %f
орматів у першому аргументі, він поводиться найбільше як %b
аргумент yte string, за винятком того, що він не обробляє вхід \c
.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Дивіться, чому printf
краще, ніж echo
? для більш.
echo() printf
Ви можете написати свої власні стандарти, echo
як ...
echo(){
printf '%b ' "$@\n\c"
}
... що завжди повинно робити правильно все автоматично.
Насправді, ні ... Це виводить буквальне \n
в кінці аргументів, якщо останній аргумент закінчується непарною кількістю <зворотних косих> .
Але це не так:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echo
обов'язковим? ви можете використовуватиprintf
.