Как передать документ здесь через команду и записать результат в переменную?
В настоящее время это выводит значение, которое мне нужно на stdout. Как я могу записать его в переменную, чтобы я мог использовать ее в остальной части script?
Требования:
- script должен быть всем в одном файле.
- Я бы предпочел не писать временные файлы, если это возможно.
.
#!/bin/bash
cat << EOF | xsltproc - ../pom.xml | tail -1
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"><xsl:value-of select="/project/version"/></xsl:template>
</xsl:stylesheet>
EOF
Ответы
Ответ 1
Кажется, что это работает (на основе ответа Игнасио). Используя подоболочку, здесь-документ правильно передается в xsltproc, все еще проходя через хвост после.
VERSION=$((xsltproc - ../pom.xml | tail -1) << EOF
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"><xsl:value-of select="/project/version"/></xsl:template>
</xsl:stylesheet>
EOF
)
Ответ 2
cat ... |
не требуется.
foo=$(sed 's/-/_/g' << EOF
1-2
3-4
EOF
)
Ответ 3
Я играю с heredocs
в течение недели или двух. Вот отрывок из моего ответа на Есть ли способ получить фактические (неинтерпретированные) аргументы оболочки в функции или script? в Unix Stack Exchange, которые могут помочь проиллюстрировать их немного используйте для своего случая:
...
ВЫПИСКА:
...
Вероятно, вы заметили разницу между двумя heredocs во втором примере. Терминатор heredoc EOF внутри функции не кавыдается, а тот, который подается на чтение, цитируется одинарными кавычками. Таким образом, оболочке дается указание выполнить расширение на heredoc с некотируемым терминатором, но не делать этого, когда его терминатор цитируется. Он не прерывается при расширении некотируемого heredoc в функции, потому что значение переменной, которую он расширяет, уже задано как строка с кавычками и не анализирует его дважды.
Вероятно, то, что вы хотите сделать, связано с тем, что динамический путь вашей очереди Windows выводит одну команду на вход другой. Замена команды в heredoc делает это возможным:
% _stupid_mspath_fix() {
> sed -e '[email protected]\\@/@g' -e '[email protected]\(.\):\(.*\)@/drive/\1\[email protected]' <<_EOF_
>> ${1}
>> _EOF_
> }
% read -r _stupid_mspath_arg <<'_EOF_'
> c:\some\stupid\windows\place
> _EOF_
% _stupid_mspath_fix ${_stupid_mspath_arg}
/drive/c/some/stupid/windows/place
% read -r _second_stupid_mspath_arg <<_EOF_
> $(printf ${_stupid_mspath_arg})
> _EOF_
% _stupid_mspath_fix ${_second_stupid_mspath_arg}
/drive/c/some/stupid/windows/place
Таким образом, в основном, если вы можете надежно выводить обратную косую черту из какого-либо приложения (я использовал printf выше), то выполнение этой команды в $(...) и включение этого в некотируемое heredoc передано другому приложению, которое может надежно принять обратную косую черту так как ввод (например, чтение и sed выше) обойдется без разбора оболочки вашей обратной косой черты. Независимо от того, смогут ли приложения обрабатывать обратную косую черту, поскольку ввод/вывод - это то, что вам нужно будет выяснить для себя.
-Mike