Чи підтримують оболонки, окрім Bash та Zsh, котирування ANSI-C? наприклад, $ 'string'


13

У мене є сценарій оболонки, який використовує наступне для друку зеленої галочки у своєму виході:

col_green="\e[32;01m"
col_reset="\e[39;49;00m"

echo -e "Done ${col_green}✓${col_reset}"

Ознайомившись із цитуванням ANSI-C Баша , я зрозумів, що можу використовувати його під час встановлення змінних кольорів та видалення -eпрапора з мого відлуння .

col_green=$'\e[32;01m'
col_reset=$'\e[39;49;00m'

echo "Done ${col_green}✓${col_reset}"

Це здається привабливим, так як це означає , що друкує повідомлення правильно будь то передається вбудовано Bash - відлуння або зовнішнього Util /bin/echo(я на MacOS).

Але чи робить це сценарій менш портативним? Я знаю, що Bash і Zsh підтримують цей стиль цитування, але я не впевнений у інших.


Так, з тих пір, коли лише ksh та його варіанти підтримують його. Але IIRC, ANSI-C цитування буде в наступній специфікації POSIX.
cuonglm

Відповіді:


12

$'…'є функцією ksh93, яка також присутня в zsh, bash, mksh, FreeBSD sh та в деяких збірках BusyBox sh (BusyBox ash, створений за допомогою ENABLE_ASH_BASH_COMPAT). У мові POSIX sh ще немає. Поширені оболонки, подібні до Борна, які не мають його, включають тире (який /bin/shза замовчуванням є Ubuntu серед інших), ksh88, оболонку Борна, NetBSD sh, yash, похідні pdksh, крім mksh, та деякі складання BusyBox.

Потрібно використовувати портативний спосіб отримати зворотну косу літери та косий штрих в якості контрольних символів printf. Він присутній у всіх POSIX-сумісних системах.

esc=$(printf '\033') # assuming an ASCII (as opposed to EBCDIC) system
col_green="${esc}[32;01m"

Зауважте, що \eце не портативно. Він підтримується багатьма реалізаціями, printfале не тим, хто знаходиться в тире¹. Замість цього використовуйте восьмеричний код.

¹ Він підтримується в Debian та похідних, які постачають щонайменше 0,5,8-2,4, наприклад, з часу розтягування Debian та Ubuntu 17.04.


Ви впевнені, що \eне підтримуєте dash? dash -c 'printf "\e[1;31m"; type printf; printf "\e[m"'буде надруковано printf is a shell builtinжирним червоним кольором тут (тире-0,5,8). Оболонка, яка не підтримує, \eє yash.
mosvy

@mosvy Друкує \e[1;31mprintf is a shell builtin \e[mтут. Ubuntu 16.04, тире 0.5.8-2.1ubuntu2. Друкується червоним кольором на Ubuntu 18.04 із штрихом 0,5.8-2.10. Схоже, Ubuntu зробив виправлення для його підтримки.
перестань бути злим"

Так, вибачте, схоже, це debian (9.7 розтягнення) патч. ось оригінал.
mosvy

0

Ступінь $'...'підтримки також слід враховувати при перенесенні. Пропозиція людей POSIX про те, щоб помістити це в POSIX sh, зокрема згадує:

stephane: ksh93 - оболонка $ '...' походить від (в той час як $'\uxxxx'[ і$'\Uxxxxxxxx' ] походить від zsh: http://www.zsh.org/mla/workers/2003/msg00223.html ) [^]

З того, що я потрапив сюди на своє Debian Buseye, ksh2020з AT&T розуміє $'\U1F600'. Це єдина "офіційна" оболонка Korn, яку я можу отримати на цьому новому дистрибутиві.

mkshпроаналізував його, але повністю поєднав його з U + FFFE. Оскільки він не скаржився на синтаксичну помилку, у розумінні Unicode має бути щось не так. Це справляється $'\U01F60'чудово.


На жаль, в результаті нещодавнього перевороту ksh2020 зник. Але так, оригінальний ksh93 дійсно підтримує, $'...'і iirc це був перший, хто це зробив.
mosvy

@ Arthur2e5. ksh2020не від AT&T. Кілька років тому, пару людей з Red Hat, фактично викрали дерево ksh93
гітабу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.