Potrzebujesz tylko minimalnej zmiany; Cudzysłów separator dokumentu znajdującego się tutaj po <<
.
cat <<'EOF' >> brightup.sh
lub równoważnie z ukośnikiem odwrotnym:
cat <<\EOF >>brightup.sh
Bez cytowania, dokument w tym miejscu zostanie zastąpiony zmiennymi, znaki odwrotne zostaną ocenione itd., Tak jak odkryłeś.
Jeśli potrzebujesz poszerzyć niektóre wartości, ale nie wszystkie, musisz indywidualnie uciec od tych, którym chcesz zapobiec.
cat <<EOF >>brightup.sh
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF
będzie produkować
#!/bin/sh
echo "$HOME will not be evaluated because it is backslash-escaped"
Zgodnie z sugestią @fedorqui , oto odpowiednia sekcja z man bash
:
Tutaj Dokumenty
Ten typ przekierowania instruuje powłokę, aby odczytywała dane wejściowe z bieżącego źródła, aż do wyświetlenia wiersza zawierającego tylko separator (bez końcowych spacji). Wszystkie wiersze odczytane do tego momentu są następnie używane jako standardowe wejście polecenia.
Format dokumentów tutaj:
<<[-]word
here-document
delimiter
Na słowie nie jest wykonywana interpretacja parametrów, podstawianie poleceń, interpretacja wyrażeń arytmetycznych ani rozwijanie nazw plików. Jeśli jakiekolwiek znaki w słowie są cytowane, separator jest wynikiem usunięcia cudzysłowu w słowie, a wiersze w dokumencie włączonym nie są rozwijane. Jeśli słowo nie jest cytowane, wszystkie wiersze dokumentu włączonego podlegają interpretacji parametrów, podstawianiu poleceń i interpretacji wyrażeń arytmetycznych . W tym drugim przypadku sekwencja znaków \ jest ignorowana, a \ należy użyć do cytowania znaków \, $ i `.
#!/bin/bash
i nic więcej -#!
to właśnie sprawia, że jest to poprawna linia shebang, a to, co następuje po niej, to ścieżka do tłumacza.