Używanie zmiennych wewnątrz bash heredoc

Próbuję interpolować zmienne wewnątrz bash heredoc:

var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF

To nie działa tak jak oczekiwałem ($var jest traktowany dosłownie, a nie Rozszerzony).

Muszę użyć sudo tee, ponieważ utworzenie pliku wymaga sudo. Robi 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.

Author: Aaron Hall, 2011-02-08

2 answers

W odpowiedzi na pierwsze pytanie, nie ma podstawienia parametru, ponieważ umieściłeś ogranicznik w cudzysłowach - Instrukcja bash mówi :

Format Dokumentów tutaj jest:

      <<[-]word
              here-document
      delimiter

Brak rozszerzania parametrów, zastępowania poleceń, rozszerzania arytmetycznego lub rozszerzenie pathname jest wykonywane na word. Jeśli dowolne znaki w słowie są quoted, ogranicznik jest wynikiem usuwania cudzysłowu na Wordzie, a linie w dokument tutaj nie jest rozszerzany. Jeśli słowo nie jest cytowane, wszystkie linie dokumentu tutaj są poddawane rozszerzaniu parametrów, zastępowaniu poleceń i rozszerzaniu arytmetycznemu. [...]

Jeśli zmienisz swój pierwszy przykład na <<EOF zamiast << "EOF", przekonasz się, że działa.

W drugim przykładzie powłoka wywołuje sudo tylko z parametrem cat, a przekierowanie dotyczy wyjścia sudo cat jako pierwotnego użytkownika. To zadziała, jeśli try:

sudo sh -c "cat > /path/to/outfile" <<EOT
my text...
EOT
 194
Author: Mark Longair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-19 12:39:16

Nie używaj cudzysłowów z <<EOF:

var=$1
sudo tee "/path/to/outfile" > /dev/null <<EOF
Some text that contains my $var
EOF

Rozszerzanie zmiennych jest domyślnym zachowaniem wewnątrz here-docs. To zachowanie można wyłączyć, cytując etykietę (z pojedynczymi lub podwójnymi cudzysłowami).

 73
Author: mob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-08 20:43:55