Ssh

在一行上使用兩個 here-document

  • February 7, 2018

是否允許在一行上使用兩個 here-document,如下例所示?我找不到文件,也無法使範例按預期工作 - 查看兩個 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

到目前為止,我發現在同一行上使用兩個 here-document 並沒有出現錯誤,但尚不清楚這是否受支持。

可以使用多個此處文件。你不能做的是將多個東西重定向到標準輸入。試試這個更簡單的命令,例如:

cat </etc/passwd </etc/hostname

它不會讀取這兩個文件。發生的情況是首先打開外殼/etc/passwd並將其放在 fd 0 上,替換之前的 fd 0,然後打開/etc/hostname並將放在 fd 0 上,替換/etc/passwd文件描述符而沒有機會讀取它。

最後一個重定向獲勝。

如果您使用 zsh 執行命令,您的命令可能會按照您的預期工作,當設置了 MULTIOS 選項時,它允許多次重定向到單個文件描述符(預設情況下,它在不模擬另一個 shell 時處於打開狀態)。

在您給出的範例中,stdin 上的 2 個此處文件確實沒有意義。如果您希望將它們連接到單個輸入中,請繼續並在腳本中執行此操作。您需要做的就是刪除第一個 here-document 分隔符和匹配的重定向。我想您必須為真正的應用程序考慮一個更複雜的案例。

作為記錄,以下是單個命令中多個 here-documents 的範例:

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

它將首先列印第二件事,因為我將/dev/fd/3first 放入cat的參數中,這與 here-document 重定向出現的順序相反。(如果OTHER_END出現在 之前STDIN_END,它不會被辨識為此處文件終止符,因為該此處文件尚未開始。)

我懷疑您在另一個問題中連結到的答案是由 zsh 使用者發布的,他沒有意識到它在其他 shell 中不起作用。我已經在那裡留下了評論。

引用自:https://serverfault.com/questions/895987