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