Linux
執行從標準輸入管道傳輸的多行 bash 腳本
我正在尋找一種簡單的方法來在文件中包含內聯的多行腳本,以使其每個步驟的作用透明。
這有效
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 程序中設置,並且在退出時將失去。