在一行上使用兩個 here-document
是否允許在一行上使用兩個 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/3
first 放入cat
的參數中,這與 here-document 重定向出現的順序相反。(如果OTHER_END
出現在 之前STDIN_END
,它不會被辨識為此處文件終止符,因為該此處文件尚未開始。)我懷疑您在另一個問題中連結到的答案是由 zsh 使用者發布的,他沒有意識到它在其他 shell 中不起作用。我已經在那裡留下了評論。