Linux

執行從標準輸入管道傳輸的多行 bash 腳本

  • March 9, 2020

我正在尋找一種簡單的方法來在文件中包含內聯的多行腳本,以使其每個步驟的作用透明。

這有效

echo "echo 1234" | bash

這也是

echo 'for N in 1 2 3; do echo $N; done' | bash

但是,我想使用這樣的東西(這不起作用):

echo <<EOF | bash
for N in 1 2 3; do
echo "N is ${N}"
done
EOF

更新,到目前為止最接近的工作解決方案是:

cat <<EOF|bash
for N in 1 2 3 4; do
   echo "N is now \$N"
done
EOF

理想情況下,雖然我不想逃避\$N

正確的解決方案不會:

  • 使用未安裝的工具 預設 debian 配置
  • 涉及臨時文件
  • 下載腳本(curl -o - htpp://blah.com/script | bash等)

理想情況下,讀者可以複製粘貼,按輸入,無需進一步操作即可執行。

如果您引用或轉義 here-document 定界符(即<<'EOF'<<\EOF不只是<<EOF),shell 將不會對內容進行(變數等的)擴展。

cat <<'EOF' | bash
for N in 1 2 3; do
echo "N is ${N}"
done
EOF

順便說一句,該cat命令在這裡並沒有真正做任何有用的事情(這就是所謂的“無用的 cat”,或 UUoC)。您可以消除它並將輸入直接發送到bash

bash <<'EOF'
for N in 1 2 3; do
echo "N is ${N}"
done
EOF

如果片段需要讀取輸入,這有點棘手,因為腳本的輸入是……腳本片段本身。在大多數類似 unix 的作業系統上,您可以通過將腳本傳遞給不同的文件描述符並告訴bash“執行”該文件描述符來避免這種情況:

bash /dev/fd/3 3<<'EOF'
read -p "Enter something here: " input
echo "You entered: ${input}"
EOF

但請注意,在這些片段之一中設置的任何變數(如此$input處)僅在該一個 shell 程序中設置,並且在退出時將失去。

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