Próbuję interpolować zmienne w heredoc bash:
var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF
To nie działa, jak się spodziewałem ( $var
jest traktowane dosłownie, a nie rozszerzone).
Muszę użyć, sudo tee
ponieważ utworzenie pliku wymaga sudo. Robiąc coś takiego:
sudo cat > /path/to/outfile <<EOT
my text...
EOT
Nie działa, ponieważ >outfile
otwiera plik w bieżącej powłoce, która nie używa sudo.
''
), ale nie cytowanie separatora włącza ekspansję (tak jakby to było""
). Jednak intuicja jest poprawna w Perl, gdzie heredoc z pojedynczymi cytowany zachowuje się identyfikatorów jakby to było w apostrofach, jedna z podwójnym cytowany identyfikatora jakby w cudzysłowach, a jeden z tyłu zaznaczonych identyfikatora jakby backticks ! Patrz: perlop: << EOFOdpowiedzi:
W odpowiedzi na twoje pierwsze pytanie nie ma podstawienia parametru, ponieważ umieściłeś separator w cudzysłowach - instrukcja bash mówi :
Jeśli zmienisz swój pierwszy przykład, aby użyć
<<EOF
zamiast<< "EOF"
, przekonasz się, że to działa.W drugim przykładzie powłoka wywołuje
sudo
tylko parametrcat
, a przekierowanie dotyczy danych wyjściowychsudo cat
jako pierwotny użytkownik. Będzie działać, jeśli spróbujesz:źródło
(cat > /path/to/outfile) <<EOF
zamiastsudo sh -c ... <<EOF
Nie używaj cytatów z
<<EOF
:Zmienna ekspansja jest domyślnym zachowaniem w tych dokumentach. Wyłączasz to zachowanie, cytując etykietę (z pojedynczymi lub podwójnymi cudzysłowami).
źródło
Jako późne następstwo wcześniejszych odpowiedzi, prawdopodobnie trafiasz w sytuacje, w których chcesz interpolować niektóre, ale nie wszystkie zmienne. Możesz to rozwiązać za pomocą ukośników odwrotnych, aby uniknąć znaków dolara i odwrotnych znaków; lub możesz umieścić tekst statyczny w zmiennej.
Demo: https://ideone.com/rMF2XA
Zauważ, że którykolwiek z mechanizmów cytowania -
\____HERE
lub"____HERE"
lub'____HERE'
- wyłączy całą interpolację zmiennych i zamieni dokument tutaj w fragment dosłownego tekstu.Częstym zadaniem jest łączenie zmiennych lokalnych ze skryptem, które powinny być oceniane przez inną powłokę, język programowania lub host zdalny.
źródło