Bash
Tutaj dokumenty i tutaj ciągi znaków
Szukaj…
Wcięcie tutaj dokumentów
Możesz wciąć tekst w tym dokumencie za pomocą kart, musisz użyć operatora <<- przekierowania zamiast << :
$ cat <<- EOF
This is some content indented with tabs `\t`.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
EOF
This is some content indented with tabs _\t_.
You cannot indent with spaces you __have__ to use tabs.
Bash will remove empty space before these lines.
__Note__: Be sure to replace spaces with tabs when copying this example.
Jednym praktycznym przykładem tego zastosowania (jak wspomniano w man bash ) są skrypty powłoki, na przykład:
if cond; then
cat <<- EOF
hello
there
EOF
fi
Zwyczajowo wcina się linie w blokach kodu, jak w tej instrukcji if , dla lepszej czytelności. Bez składni operatora <<- bylibyśmy zmuszeni napisać powyższy kod w następujący sposób:
if cond; then
cat << EOF
hello
there
EOF
fi
To bardzo nieprzyjemne do czytania, a staje się znacznie gorzej w bardziej złożonym realistycznym skrypcie.
Tutaj sznurki
Możesz podać polecenie, używając tutaj takich ciągów:
$ awk '{print $2}' <<< "hello world - how are you?"
world
$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she
Można też karmić while pętlę ze sznurka tutaj:
$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello
Ogranicz ciągi
Heredoc używa limitu, aby określić, kiedy przestać pobierać dane wejściowe. Końcowy łańcuch ograniczający musi
- Bądź na początku linii.
- Bądź jedynym tekstem w linii Uwaga: Jeśli użyjesz
<<-ograniczenie może być poprzedzone tabulatorem\t
Poprawny:
cat <<limitstring
line 1
line 2
limitstring
Spowoduje to wygenerowanie:
line 1 line 2
Niepoprawne użycie:
cat <<limitstring
line 1
line 2
limitstring
Ponieważ limitstring w ostatnim wierszu nie jest dokładnie na początku wiersza, powłoka będzie dalej czekać na dalsze dane wejściowe, dopóki nie zobaczy linii, która zaczyna się od limitstring i nie zawiera niczego innego. Dopiero wtedy przestanie czekać na dane wejściowe i przejdzie dalej do dokumentu cat polecenia cat .
Zauważ, że kiedy poprzedzasz początkowy łańcuch ogranicznika myślnikiem, wszelkie tabulatory na początku linii są usuwane przed parsowaniem, więc dane i łańcuch limitu mogą być wcięte tabulatorami (dla ułatwienia odczytu w skryptach powłoki).
cat <<-limitstring
line 1 has a tab each before the words line and has
line 2 has two leading tabs
limitstring
będzie produkować
line 1 has a tab each before the words line and has line 2 has two leading tabs
z usuniętymi wiodącymi kartami (ale nie wewnętrznymi).
Utwórz plik
Klasycznym zastosowaniem tutaj dokumentów jest utworzenie pliku przez wpisanie jego zawartości:
cat > fruits.txt << EOF
apple
orange
lemon
EOF
Niniejszy dokument to linie między << EOF a EOF .
Ten dokument staje się wejściem polecenia cat . Polecenie cat po prostu wysyła dane wejściowe i za pomocą operatora przekierowania wyjścia > przekierowujemy do pliku fruits.txt .
W rezultacie plik fruits.txt będzie zawierać linie:
apple
orange
lemon
Obowiązują zwykłe zasady przekierowywania danych wyjściowych: jeśli fruits.txt nie istniał wcześniej, zostanie utworzony. Jeśli istniał wcześniej, zostanie obcięty.
Wykonaj polecenie za pomocą tego dokumentu
ssh -p 21 [email protected] <<EOF
echo 'printing pwd'
echo "\$(pwd)"
ls -a
find '*.txt'
EOF
$ ucieka, ponieważ nie chcemy, aby był on rozwijany przez bieżącą powłokę, tzn. $(pwd) ma być wykonywany na zdalnej powłoce.
Inny sposób:
ssh -p 21 [email protected] <<'EOF'
echo 'printing pwd'
echo "$(pwd)"
ls -a
find '*.txt'
EOF
Uwaga : zamykający EOF powinien znajdować się na początku wiersza (wcześniej żadnych białych znaków). Jeśli wymagane jest wcięcie, tabulatory mogą być użyte, jeśli zaczniesz heredoc od <<- . Aby uzyskać więcej informacji, zobacz dokumenty Wcięcia tutaj i przykłady Ogranicz ciągi .
Uruchom kilka poleceń za pomocą sudo
sudo -s <<EOF
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "\$a"
EOF
-
$amusi być poprzedzony$aucieczki, aby zapobiec rozszerzeniu go o bieżącą powłokę
Lub
sudo -s <<'EOF'
a='var'
echo 'Running serveral commands with sudo'
mktemp -d
echo "$a"
EOF