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

2.05b

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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow