Назад | Перейти на главную страницу

Используйте два здесь-документа в одной строке

Можно ли использовать два здесь-документа в одной строке, как в примере ниже? Мне не удалось найти документацию, и я не могу заставить пример работать должным образом - я вижу результат обеих команд echo.

$ ssh myhost <<HERE_DOCUMENT_1 <<HERE_DOCUMENT_2
> echo test1
> HERE_DOCUMENT_1
> echo test2
> HERE_DOCUMENT_2
Pseudo-terminal will not be allocated because stdin is not a terminal.
test2

Я пытаюсь вывести обе команды echo для вывода, чтобы попробовать описанное здесь решение: https://unix.stackexchange.com/questions/4770/quoting-in-ssh-host-foo-and-ssh-host-sudo-su-user-c-foo-type-constructs/102840#102840

Пока я вижу, что я не получаю сообщение об ошибке при использовании двух здесь документов в одной строке, но неясно, поддерживается ли это.

Можно использовать несколько документов здесь. Что вы не можете сделать, так это перенаправить несколько вещей на стандартный ввод. Попробуйте, например, эту более простую команду:

cat </etc/passwd </etc/hostname

Он не читает оба файла. Что происходит - сначала открывается оболочка /etc/passwd и помещает его на fd 0, заменяя предыдущий fd 0, затем открывается /etc/hostname и ставит который на fd 0, заменив /etc/passwd дескриптор файла, даже не имея возможности его прочитать.

Последнее перенаправление побеждает.

Ваша команда, вероятно, будет работать так, как вы предполагали, если вы запустите ее с помощью zsh, который позволяет несколько перенаправлений на один дескриптор файла, когда установлена ​​опция MULTIOS (она включена по умолчанию, если не эмулируется другая оболочка).

В приведенном вами примере нет смысла использовать два документа на стандартном вводе. Если вы хотите, чтобы они были объединены в один ввод, просто сделайте это прямо в сценарии. Все, что вам нужно сделать, это удалить первый разделитель здесь-документа и соответствующее перенаправление. Я полагаю, вы должны иметь в виду более сложный вариант использования для реального приложения.

Для записи, вот пример нескольких здесь-документов в одной команде:

cat /dev/fd/3 /dev/fd/0 <<STDIN_END 3<<OTHER_END
this is first
STDIN_END
this is second
OTHER_END

Сначала он напечатает второе, потому что я поставил /dev/fd/3 первый в catАргументы, обратный порядку, в котором появляются перенаправления здесь-документа. (Если OTHER_END пришел до STDIN_END, он не будет распознан как терминатор здесь-документа, потому что этот здесь-документ еще не начался.)

Я подозреваю, что ответ, на который вы указали в другом вопросе, был отправлен пользователем zsh, который не осознавал, что он не работает в других оболочках. Я оставил там комментарий по этому поводу.