Новий псевдонім не доступний після;


9

До цього часу я думав, що крапка з комою в оболонці має (якось) те саме значення, що і розрив рядка. Тож я здивувався тому, що

alias <name>=<replacement text>; <name>

<name>невідомо, поки це відомо в наступному рядку. csh, tcsh, sh, kshІ bashповодяться так само. Принаймні для cshцього не має значення, чи використовується псевдонім безпосередньо або якщо скрипт розміщений перед крапкою з комою - псевдоніми не відомі після, ;але відомі в наступному командному рядку. Це помилка чи така поведінка призначена?


"Я подумав, що крапка з комою в оболонці має (якось) те саме значення, що і розрив рядка" Майже. Не зовсім!
Гонки легкості по орбіті

1
Інтерпретація крапки з комою та новим рядком залежить від того, як називається аналізатор. Для команди "крапка" оболонка Борна називає аналізатор "NLFLG", який говорить йому, що в нових ситуаціях трактуються нові рядки та крапки з комою, але в інших випадках це не так. Взагалі крапка з комою та рядки рядків не є рівнозначними, оскільки ви можете мати розрив рядків, де крапка з комою може спричинити синтаксичну помилку.
schily

Відповіді:


9

Синтаксис псевдоніма, який ви використовуєте, не підходить для оболонки POSIX, для оболонки POSIX потрібно використовувати:

alias name='replacement'

Але для всіх оболонок це не може працювати, оскільки заміна псевдоніма робиться на початку аналізу.

Перед виконанням налаштування псевдоніму аналізатор зчитував весь рядок, і з цієї причини ваш командний рядок не працюватиме.

Якщо псевдонім з’явиться в наступному командному рядку, він буде працювати.


Крім того, деякі оболонки люблять yashабо zshне розширюють псевдонім у shell -c 'alias name=replacement<newline>replacement'. Що стосується AT&T ksh, у вас виникнуть проблеми з джерелами скриптів.
Стефан Шазелас

Мені потрібно використовувати csh в цьому випадку - там не =використовується aliasсинтаксис.
користувач3224237

@ user3224237 - це не має нічого спільного з =. це тому, що розширення псевдоніму відбувається, коли оболонка вперше бачить лінію, що є перед тим, як визначити псевдонім.
cas

@ Stéphane Chazelas Поведінка з "джерелами" сценаріїв викликана тим, що оболонка Bourne повністю аналізує такі файли перед їх виконанням. Ksh базується на джерелі Bourne Shell, і все, що не було змінено, веде себе однаково.
schily

@schily, так, це та сама причина, zsh/yash -c 'code'де codeрозбирається в цілому. Мабуть, це не так для оболонки Борна. Тож я припускаю, що оболонка Борна розбирає, що codeіснує по одному рядку.
Stéphane Chazelas

5

Така поведінка призначена та визначена POSIX у розділі Заміна Alias .

Псевдонім був заміщений відразу після виконання оболонки розпізнавання токена та перед застосуванням будь-яких граматичних правил . На той момент, коли ви викликали псевдонім <name>, команда aliasне виконувалася.

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