tcsh не может повторить слово с квадратной скобкой

У меня есть список данных ниже

%cat data
a
b[1]
c[2]
d

и я пытаюсь повторить каждую строку, используя команду ниже:

%foreach aa ( `cat data` )
foreach? echo $aa
foreach? end
a
echo: No match

может кто-нибудь объяснить, что происходит с echo cmd и как это исправить? Спасибо.


person user466130    schedule 11.02.2014    source источник


Ответы (1)


Когда вы делаете

echo $aa

и $aa содержит b[1], оболочка пытается обработать метасимволы [ и ] после расширения значения переменной. Поскольку в вашем текущем каталоге (вероятно) нет ничего, совпадающего с b[1], вы получите сообщение об ошибке.

Вам нужно процитировать ссылку на переменную. Заменять

echo $aa

либо

echo "$aa"

or

echo $aa:q

(Синтаксис :q специфичен для csh и tcsh; двойные кавычки работают одинаково в большинстве оболочек, включая оболочки, производные от csh, и оболочки, производные от sh, такие как bash).

person Keith Thompson    schedule 11.02.2014
comment
[] - это подстановочные метасимволы, и оболочка интерпретирует их, как вы сказали. Не могли бы вы объяснить два момента по этому поводу? Во-первых, стандартное поведение в этом случае — оставить строку в покое, а не ошибку. Во-вторых, как echo узнает о том, что была подмена, если оболочка делает это до вызова команд? В сообщении об ошибке указано, что echo — это программа, возвращающая ошибку. Это какое-то старое поведение оболочки? - person Larry; 28.06.2019
comment
@Larry: tcsh не просто оставляет строку в покое. Если есть ошибка замены, об этом сообщается как об ошибке. Если вы говорите о стандартном поведении, вы, вероятно, имеете в виду стандарт оболочки POSIX, поддерживаемый (в основном) sh, ksh, bash и др. (и многие оболочки, производные от sh, имеют опции для изменения поведения). echo не знает, что произошла ошибка. Сама оболочка вставляет имя команды в сообщение об ошибке. Например, в tcsh nosuchcommand nosuchfile*.txt печатает nosuchcommand: No match. (в bash печатает nosuchcommand: command not found - person Keith Thompson; 28.06.2019
comment
Спасибо за объяснение! У меня на рабочем месте tcsh настроен иначе и ошибки нет. На моем домашнем ПК действительно возникает ошибка, о которой вы упомянули. Однако Bash делает это немного по-другому, после установки shopt -s failglob. /bin/echo bla? -> bash: no match: bla? - person Larry; 29.06.2019