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
-
$a
musi być poprzedzony$a
ucieczki, 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