Вызов удара от sh (тире) с командами, считанными из args, и “Незавершенной заключенной в кавычки строки” / “неожиданный EOF”

Компиляция из источника является лучшим способом, потому что это всегда - последний источник. Когда я компилирую php для своего поля, это дает мне всегда неправильное имя. Я должен зафиксировать его вручную для апача:-sf/usr/lib/apache2/libphp5.so/usr/lib/apache2/mod_php5.so ln. Но это может зависеть от Вашей конфигурации. Вы работают, делают тест после того, как делают? Это должно показать Вам еще некоторую информацию.

5
22.04.2013, 00:57
2 ответа

В одинарных кавычках никакой символ не имеет особое значение. В двойных кавычках, "\$` имейте особое значение. Работа это из внешней стороны в: первая фигура, какая строка создается внешней оболочкой, затем что внутренняя оболочка сделает из нее.

Например, если переменная a не определяется во внешней оболочке, с

sh -c "bash -c \"a=1; echo a\$a;\""

внешняя оболочка видит дважды заключенную в кавычки строку, которая расширяется до bash -c "a=1; echo a$a;", и случается так, что строка, которая передается промежуточному звену sh. sh синтаксические анализы это как вызов к bash с этими двумя аргументами -c и a=1; echo a;, последний, следующий из расширения дважды заключенной в кавычки строки "a=1; echo a$a;" где переменная a не определяется.

Если Вы делаете этот анализ, Вы видите, что один способ добраться, что Вы хотите, состоял бы в том, чтобы иметь "a=1; echo a\$a;" на данном этапе. Для получения этой дополнительной обратной косой черты необходимо поместить две обратных косых черты в оригинал, так как уже был один этап расширения оболочки в двойных кавычках. Два плюс каждый равняется трем.

sh -c "bash -c \"a=1; echo a\\\$a;\""

Было бы более просто использовать одинарные кавычки для внешней строки, так как Вы не хотите разворачивать что-либо там.

sh -c 'bash -c "a=1; echo a\$a;"'

Так как Вы не хотите разворачивать что-либо, когда Вы звоните bash от sh также, Вы могли использовать одинарные кавычки там также. Вы не можете поместить одинарные кавычки в единственно заключенной в кавычки строке, но существует способ моделировать это: поместить '\''. Официально это завершает единственно заключенный в кавычки литерал, добавляет литеральную одинарную кавычку и запускает новый единственно заключенный в кавычки литерал, но можно думать о четырех последовательностях символов '\'' как являющийся способом поместить одинарную кавычку в единственно заключенной в кавычки строке.

sh -c 'bash -c '\''a=1; echo a$a;'\'''

Можно опустить это '' в конце это менее систематично, но легче на глазах.

sh -c 'bash -c '\''a=1; echo a$a;'\'

Одинарные кавычки не являются специальными внутренними двойными кавычками, поэтому когда Вы пишете "bash -c 'a=1; echo a\$a;'" Вам нужна обратная косая черта перед долларом для предотвращения расширения $a во внешней оболочке.

2
27.01.2020, 20:41

Ну, я нашел пару, которые действительно работают (NB, это - Ubuntu 11.04):

$ sh -c "bash -c 'a=1; echo a\$a \'"
a1
$ sh -c "bash -c 'a=1; echo a\$a;'"
a1

... и это кажется, пока первая одинарная кавычка не завершена, и доллара оставляют - это работает, независимо если заключительной одинарной кавычки оставляют или нет! Который озадачивает меня довольно немного тихий...

1
27.01.2020, 20:41
  • 1
    sh -c "bash -c 'a=1; echo a\$a \'" работы случайностью, но это немного причудливо. Заключительной одинарной кавычки не оставляют: \' сохраняет обратную косую черту в двойных кавычках. Команда передала bash 'a=1; a$a эха', и что заключительная обратная косая черта, оказывается, не имеет никакого эффекта. –  Gilles 'SO- stop being evil' 24.04.2013, 04:22

Теги

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