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

Разрешено ли использовать два документа здесь в одной строке, как в примере ниже? Мне не удалось найти документацию и я не могу заставить пример работать так, как ожидалось, - увидев вывод обеих команд 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

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

1 ответ

Решение

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

cat </etc/passwd </etc/hostname

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

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

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

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

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

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, который не понимал, что он не работает в других оболочках. Я оставил там комментарий об этом.

Другие вопросы по тегам