Bash
Здесь документы и здесь строки
Поиск…
Отступы здесь документы
Вы можете отпечатать текст внутри документов с помощью вкладок, вам нужно использовать оператор <<-
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
Это очень неприятно для чтения, и это становится намного хуже в более сложном реалистическом сценарии.
Здесь строки
Вы можете подать команду, используя следующие строки:
$ 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