Використання ^ як метахарактера оболонки


19

Сьогодні я написав невеликий сценарій, який містив

grep -q ^local0 /etc/syslog.conf

Під час огляду колега запропонував ^local0цитувати його, оскільки ^означає «трубу» в оболонці Борна. Здивований цією претензією, я намагався відстежити будь-які посилання, які згадували про це. Ніщо, що я знайшов в Інтернеті, не підказувало, що це проблема.

Однак виявляється, що реалізація bsh(яка претендує на оболонку Bourne) на AIX 7 насправді має таку поведінку:

> bsh
$ ls ^ wc
      23      23     183
$ ls | wc
      23      23     183

Жодна з інших реалізацій "Bourne shell", яку я намагався поводити таким чином (тобто ^взагалі не вважається метахарактером оболонки). Я спробував як shна CentOS (який насправді є bash), так і shна FreeBSD (що не bash). У мене немає багатьох інших систем, щоб спробувати.

Чи очікується така поведінка? Які оболонки вважають ^метахарактером труб?


1
Я знаю, що ^це символ заперечення в zsh, а також у просторі регулярних виразів. Як окремий коментар, як правило, рекомендується використовувати одиничні лапки у виразному вираженні для перенесення через оболонки.
mkc

Оболонка Бурна мала багато дивної поведінки, яку ми все ще бачимо в оточенні роботи в сучасному коді оболонки, наприклад [ x"$foo" = x"bar" ].
jordanm

bshце не оболонка Борна. Ім'я зловживається лише для Bourne Shell лише в AIX. bshце скоріше оболонка, представлена ​​мною у 1984 р. в H.Berhold AG на UNOS (перший клон UNIX). Зауважимо, що AIX не існував у 1984 році.
шилі

Відповіді:


21

^Характер як синонім |сходить від оболонки Томпсона . Вони були представлені одночасно в Unix v4 і разом згадуються на сторінці man . Свен Маскек згадує, що ^"ймовірно [введено] з міркувань зручності на ранніх терміналах лише для верхнього регістру", де введення тексту |"дещо боліло" .

Оболонки Томпсона давно минуло, але його наступник оболонки Борна зберіг той самий синтаксис (навіть незважаючи на те, що його сторінка man лише згадується |).

Оболонки наступника, такі як зола, баш та кш, розуміють лише |як характер труби. Ви не збираєтеся знайти фактичну оболонку Bourne у версіях з відкритим кодом Unix, оскільки довгий час не було відкритого випуску оболонки Bourne. (Я думаю, що OpenSolaris включив один, але він не був прийнятий в іншому місці, оскільки до того часу він давно застарів новішими реалізаціями).

Специфікація Single Unix не зазначає ^особливого символу, що фактично означає, що оболонки POSIX повинні це тлумачити буквально¹. Я не думаю, що коли-небудь існував повністю POSIX-сумісний варіант оболонки Bourne (лише незалежні реалізації).

^є спеціальним у zsh, коли параметр extendedglobвключений, але не в його режимі сумісності sh. У режимі за замовчуванням він багато в чому відхиляється від POSIX.

Я рекомендую цитувати ^в регулярному виразі все одно для наочності. Цитуйте регулярний вираз у сценарії незалежно від того, які символи відображаються в ньому.

¹ за виключення того, як перший символ вираження в квадратних дужках в якості підстановлювальний шаблону, де !є стандартним запереченням характеру , але реалізації можуть також інтерпретувати ^таким же чином.


Дякую, ціла нитка TUHS з 2003 року була просвітницькою.
Грег Х'югілл

Для повноти ви можете згадати, що ^є особливим у тому, fishде це оператор перенаправлення, rc/ esде це оператор конкатенації , або csh / tcsh / bash / zsh для розширення історії, коли це перший символ командного рядка.
Стефан Шазелас


3

Так, OpenSolaris включає джерело Bourne Shell, але це джерело не є портативним.

Зберігається і дуже портативна версія джерела Борна Шелл можна знайти тут в schily-*.tar.bz2архівах.

Ось відповідна частина джерела в cmd.c:

/* 
* ^ is a relic from the days of UPPER CASE ONLY tty model 33s 
*/ 
if ((t = item(TRUE)) != 0 && (wdval == '^' || wdval == '|')) 

Розумієте, це не пов'язано з конкретною оболонкою (наприклад, оболонкою Томпсона), а з тим, що в 1970-х роках все ще існували лише великі корпуси.

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