Поиск…


Отступы здесь документы

Вы можете отпечатать текст внутри документов с помощью вкладок, вам нужно использовать оператор <<- redirection вместо << :

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

Одно практическое применение этого (как упоминалось в man bash ) - в сценариях оболочки, например:

if cond; then
    cat <<- EOF
    hello
    there
    EOF
fi

Обычно для отрисовки строк в кодовых блоках, как и в этом операторе if , требуется улучшенная читаемость. Без синтаксиса оператора <<- мы будем вынуждены написать приведенный выше код следующим образом:

if cond; then
    cat << EOF
hello
there
EOF
fi

Это очень неприятно для чтения, и это становится намного хуже в более сложном реалистическом сценарии.

Здесь строки

2.05b

Вы можете подать команду, используя следующие строки:

$ awk '{print $2}' <<< "hello world - how are you?"
world

$ awk '{print $1}' <<< "hello how are you
> she is fine"
hello
she

Вы также можете кормить while цикл с здесь строками:

$ while IFS=" " read -r word1 word2 rest
> do
> echo "$word1"
> done <<< "hello how are you - i am fine"
hello

Лимитные строки

Heredoc использует limitstring, чтобы определить, когда прекратить потребление ввода. Конечная конечная строка должна

  • Будьте в начале линии.
  • Будьте единственным текстом в строке. Примечание. Если вы используете <<- limitstring может быть префикс с вкладками \t

Правильный:

cat <<limitstring
line 1
line 2
limitstring

Это приведет к выводу:

line 1
line 2

Неправильное использование:

cat <<limitstring
line 1
line 2
 limitstring

Поскольку limitstring в последней строке не находится точно в начале строки, оболочка будет продолжать ждать ввода, пока не увидит строку, которая начинается с limitstring и не содержит ничего другого. Только тогда он перестанет ждать ввода и продолжит передачу этого документа команде cat .

Обратите внимание, что при префиксе initial limitstring с дефисом любые табуляции в начале строки удаляются перед разбором, поэтому данные и предельная строка могут быть отступом с вкладками (для удобства чтения в сценариях оболочки).

cat <<-limitstring
        line 1    has a tab each before the words line and has
            line 2 has two leading tabs
        limitstring

будет производить

line 1    has a tab each before the words line and has
line 2 has two leading tabs

с удалением ведущих вкладок (но не внутренних вкладок).

Создать файл

Классическое использование здесь документов - это создать файл, набрав его содержимое:

cat > fruits.txt << EOF
apple
orange
lemon
EOF

Здесь-документ представляет собой линии между << EOF и EOF .

Этот документ становится входом команды cat . Команда cat просто выводит свой вход, и с помощью оператора перенаправления вывода > мы перенаправляем файл fruits.txt .

В результате файл fruits.txt будет содержать строки:

apple
orange
lemon

Применяются обычные правила перенаправления вывода: если fruits.txt ранее не существовал, он будет создан. Если он существовал раньше, он будет усечен.

Выполнить команду здесь

ssh -p 21 [email protected] <<EOF
  echo 'printing pwd'
  echo "\$(pwd)"
  ls -a
  find '*.txt'
EOF

$ экранируется, потому что мы не хотим, чтобы он расширялся текущей оболочкой, то есть $(pwd) должен быть выполнен на удаленной оболочке.

По-другому:

ssh -p 21 [email protected] <<'EOF'
  echo 'printing pwd'
  echo "$(pwd)"
  ls -a
  find '*.txt'
EOF    

Примечание : Закрытие EOF должно быть в начале строки (перед пробелом не было пробелов). Если требуется отступ, вкладки могут использоваться, если вы запустите свой heredoc с помощью <<- . Дополнительную информацию см. В документах « Отступы» и « Лимитные строки» .

Запустите несколько команд с помощью sudo

sudo -s <<EOF
  a='var'
  echo 'Running serveral commands with sudo'
  mktemp -d
  echo "\$a"
EOF
  • $a необходимо экранировать, чтобы предотвратить его расширение текущей оболочкой

Или же

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow