${line#*'Caused By'}
— это конкретный пример подстановки переменных ${parameter#word}
(, как это написано в руководстве bash
, а также в стандарте POSIX для оболочки sh
).
В ${parameter#word}
шаблон word
будет удален из начала значения $parameter
.Он называется «Удалить шаблон наименьшего префикса», потому что он удалит самую короткую совпадающую строку префикса, которая соответствует шаблону вword
(с ##
вместо #
. Он удалит самый длинный . ] соответствующая строка префикса ).
В этом конкретном примере строкаCaused by
(и все, что предшествует ей, благодаря *
), если она существует, удаляется из значения $line
. Одинарные кавычки вокруг строки избыточны.
Сравнивая результат подстановки со значением самой переменной, тест определяет, содержит ли значение $line
текст Caused by
, и печатает Yes
, если содержит.
Это имеет тот же эффект, что и
if [[ "$line" == *'Caused by'* ]]; then
echo 'Yes'
fi
в bash
, ksh93
или zsh
, или
case "$line" in
*'Caused by'*) echo 'Yes'
esac
в любой оболочке sh
.
Цикл в вопросе считывает «строки» из стандартного ввода. См. вопрос "Понимание "IFS= чтение -r строки" для обсуждения этого.
Да, в tcsh это возможно (в отличие от оболочек в стиле Bourne -, где вместо этого вам нужно использовать функцию ). Вам нужно поместить !*
в текст псевдонима, чтобы заменить параметры, переданные псевдониму, и после этого может быть еще что-то.
alias emacs 'emacs \!* &'
Полезнее использовать встроенный сервер. Начиная с Emacs 22 (IIRC ), вы можете легко запустить emacsclient
и запустить Emacs, если он еще не запущен. (В более ранних версияхemacsclient
существует, но менее полезен.)
alias e 'emacsclient -a "" \!* &'
А если Emacs работает, и вы просто хотите открыть новое окно, тогда нет необходимости запускать emacsclient в фоновом режиме :скажите ему открыть файл в существующем экземпляре Emacs и выйти.
alias e 'emacsclient -a "" -c \!*'