Еще одна синтаксическая ошибка рядом с неожиданным токеном `('[closed]

У меня была такая же проблема, я нашел ответ на https://www.evonide.com/non-root-gpu-passthrough- настройка / . Вам нужно добавить -cpu host, kvm = off в командную строку qemu. Я использую ganeti, поэтому проблема решена следующим образом:

gnt-instance modify -H cpu_type="host\,kvm=off"

Если я правильно понимаю, этот флаг не отключает ускорение KVM для гостя, которое включено с помощью -machine pc, Accel = kvm . Но он отключает ускорение вложенного KVM для гостя (поэтому вы не сможете запустить виртуальную машину KVM внутри гостя).

1
14.11.2016, 13:41
1 ответ

Несколько общих тенденций, объясняющих, почему команда не анализирует должным образом в сценарии, но работает сама по себе:

Источник ошибки находится в другом месте.

Оболочка сообщает об ошибке при первой же ошибке. то, чего он не ожидает. Здесь он не ожидает (, но кажется, что он находится внутри строки в кавычках. Возможное объяснение состоит в том, что вы не в строке в кавычках, потому что первый ' там на самом деле закрывает ранее незакрытую цитату вместо открытия новой '...' , как в:

echo It's a bug
formattedTIME=`awk '{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}' $domPATH/duration.seconds

На самом деле:

echo It'quoted-string'{printf("Duration:\t%02dh %02dm",($1/60/60%24),($1/60%60))}'...

И это некотируемое ( выше неожиданно для оболочки .

Вы получаете аналогичные проблемы с любой структурой, которая не закрыта должным образом или имеет неправильный формат, например, fi без , затем ...

Обратные кавычки

На самом деле не следует использовать обратные кавычки. Вместо них следует использовать $ (...) .

Внутренние обратные кавычки, \ обрабатываются по-другому.

echo "`
  echo It\\\'s OK
`"

не подходит. echo It \\ 'OK само по себе нормально, так как внутри обратных кавычек первые две обратные косые черты становятся одной, так что в итоге получается echo It \\' OK .

Современная форма $ (...) не имеет этих проблем.

Псевдонимы

псевдоним es чем-то похожи на макросы, их расширение снова подвергается интерпретации кода.

Например:

alias foo="echo '"
...
foo bar
echo 'baz('

может скрывать проблему в определении псевдонима foo .

Есть более тонкие, например:

alias foo='a;b'
cmd | foo

Которые, не вызывая синтаксических ошибок, вызывают неожиданный синтаксический анализ.

Часто функции более подходят, чем псевдонимы

локализация

Некоторые байтовые последовательности могут интерпретироваться по-разному в зависимости от локали.

Например, байт 0xa0 - это неразрывный пробел в наборе символов ISO-8859-1. И этот символ оказывается пробелом в Solaris, а bash обрабатывает все пробелы как разделители (в настоящее время только для однобайтовых символов).

Этот байт 0xa0 также является частью нескольких символов UTF-8, например à . Таким образом, вы можете обнаружить, что, например, сценарий, имеющий:

var=àdo

(с этим à , записанный в UTF-8) перестает работать при запуске в Solaris в локали ISO-8859-1, потому что это становится var = X do (где X - это первый байт этого символа à ).

Или вы можете обнаружить, что:

echo ε

С этим ε , записанным в наборе символов BIG5-HKSCS, перестает работать, если вы не находитесь в локали zh_HK.big5hkscs , поскольку что ε фактически кодируется как 0xa3 0x60, где 0x60 в ASCII и все однобайтовые наборы символов являются обратным апострофом.

2
27.01.2020, 23:34

Теги

Похожие вопросы