Вам нужно только минимальное изменение; одинарная кавычка разделителя здесь-документа после <<
.
cat <<'EOF' >> brightup.sh
или эквивалентно обратная косая черта-escape it:
cat <<\EOF >>brightup.sh
Без цитирования здесь документ будет подвергаться переменной замене , backticks будут оцениваться и т. д., как вы обнаружили.
Если вам нужно развернуть некоторые, но не все значения, вам необходимо индивидуально избежать тех, которые вы хотите предотвратить.
cat <>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF
будет производить
#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"
. Как предложено @fedorqui , вот соответствующий раздел из man bash
:
Здесь Документы
Этот тип перенаправления инструктирует оболочку читать входные данные от текущего источника до тех пор, пока не появится строка, содержащая только разделитель (без конечных пробелов). Все строки, считываемые до этой точки, затем используются в качестве стандартного ввода для команды.
Формат здесь-документов:
<<[-]word here-document delimiter
Нет расширения параметров, команда подстановка, арифметическое расширение или расширение пути по слову. Если какие-либо символы в слове цитируются, разделитель является результатом удаления цитаты в слове, а строки в этом документе не будут расширены. Если слово без кавычек, все строки этого документа подвергаются расширению параметров, подстановке команд и арифметическому расширению. В последнем случае последовательность символов \ игнорируется, а \ должна использоваться для цитирования символов \, $ и `.
blockquote>
ключевые слова с шаблоном __ * являются частными именами классов.
http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers
Цитата:
Имена этой категории, используемые в контексте определения класса, переписываются, чтобы использовать искаженную форму, чтобы избежать конфликтов имен между «частными» атрибутами базового и производного классов
blockquote>Частное имя mangling (выделено мной):
Управление частным именем: когда идентификатор, который имеет текстовое значение в определение класса начинается с двух или более символов подчеркивания и не заканчивается двумя или более символами подчеркивания, оно считается частным именем этого класса. Частные имена преобразуются в более длинную форму до того, как для них генерируется код. Преобразование вставляет имя класса перед именем, с удалением ведущих подчеркиваний и одним подчеркиванием, вставленным перед именем класса. Например, идентификатор
blockquote>__spam
, входящий в класс с именем Ham, будет преобразован в_Ham__spam
. Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор. Если преобразованное имя чрезвычайно длинное (длиннее 255 символов), может быть реализовано определенное усечение. Если имя класса состоит только из символов подчеркивания, преобразование не выполняется.http://docs.python.org/reference/expressions.html#atom-identifiers
Это означает, что за кулисами
B.__a()
преобразуется в нечто вродеB._B__a()
In [1]: class A(object):
...: def __init__(self):
...: self.a()
...: def a(self):
...: print "A.a()"
...:
...: __str__ = a
...:
In [2]: class B(A):
...: def __init__(self):
...: super(B, self).__init__()
...: def a(self):
...: print "B.a()"
...:
...:
In [3]: b = B()
print str(b)
A.a()
Вам нужно будет снова объявить __str__
в B.