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.
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
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).
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