Несколько месяцев назад я татуировал вилочную бомбу на руке и пропускал пробелы, потому что я думаю, что без них это выглядит лучше. Но, к моему ужасу, иногда (не всегда), когда я запускаю его в оболочке, он не запускает вилочную бомбу, а просто выдает синтаксическую ошибку.
bash: syntax error near unexpected token `{:'
Вчера это случилось, когда я попытался запустить его в оболочке Bash друга , а затем я добавил пробел, и он неожиданно заработал :(){ :|:& };:
вместо:(){:|:&};:
Имеет ли значение пробел; я татуировал ошибку синтаксиса на моей руке ?!
Кажется, всегда работает в Zsh , но не в Bash.
Связанный вопрос не объясняет ничего о пробелах, что действительно является моим вопросом; Почему пробел необходим Bash для правильного его анализа?
bash
shell
syntax
syntax-error
spydon
источник
источник
Ответы:
В BASH есть список символов, которые разделяют токены. Эти символы называются метасимволы и они
|
,&
,;
,(
,)
,<
,>
, пространство и вкладки . С другой стороны, фигурные скобки ({
и}
) - это просто обычные символы, составляющие слова.Пропуск второго пробела до того, как
}
будет сделано, так&
как является метасимволом. Поэтому ваша татуировка должна иметь хотя бы один космический символ.источник
on the other hand
... каламбур? ;): D (Извините, за не по теме комментарий.){
и}
являются ключевыми словами оболочки в этом контексте. Только если они не распознаются как таковые - из-за отсутствия окружающих пробелов / метасимволов - они рассматриваются как буквальная часть слова, частью которого они становятся. (И затем есть расширение скобки, которое происходит в другом контексте.){foo} () { echo hello; }
«Имя», определяемыеbash
как «слово, состоящее только из буквенно-цифровых символов и подчеркиваний и начинающиеся с буквенного символа или подчеркивания», применяется только к именам переменных.Просто тату
Шебанг над ним, и все будет хорошо.
источник
Скобки больше похожи на нечетные ключевые слова, чем на специальные символы и требуют пробелов. Это отличается от скобок, например. Для сравнения:
который работает, и:
который ищет команду по имени
{ls}
. Чтобы работать, это должно быть:Точка с запятой останавливает закрывающую скобку в качестве параметра
ls
.Все, что вам нужно сделать, это сказать людям, что вы используете пропорциональный шрифт с довольно узким пробелом.
источник
ls
.Хотя это не так легко увидеть в шрифте татуировки, на самом деле между фигурной скобкой и двоеточием есть знак порядка байтов (BOM) (возможно, вы были достаточно опьянены, когда получили татуировку, которую не заметили, но она действительно есть) , Это оставляет три очевидные возможности:
источник
Это из-за того, как оболочка разбирает. Вам нужен пробел после начала определения функции, то есть после
{
.действительны. С другой стороны,
нет.
Тебе действительно нужна татуировка, подобная этой:
Из источника :
Пропуск пробела после
{
причины приводит к{echo
тому, что интерпретируется как один токен.Эквивалентная форма
было бы
Обратите внимание, что
{
в альтернативной версии пробела нет , но разрыв строки приводит к тому, что оболочка распознается{
как токен.источник
{echo
до того, как он достиг требуемой открывающей скобки?