我有兩個腳本:
install.sh
#!/usr/bin/env bash
./internal_install.sh
internal_install.sh
#!/usr/bin/env bash
set -x
while true; do
read -p "Hello, what's your name? " name
echo $name
done
當我運行時./install.sh,一切都按預期作業:
> ./install.sh
true
read -p 'Hello, what'\''s your name? ' name
Hello, what's your name? Martin
echo Martin
Martin
...
但是,當我使用 運行時cat ./install.sh | bash,該read函式不會阻塞:
cat ./install.sh | bash
true
read -p 'Hello, what'\''s your name? ' name
echo
true
read -p 'Hello, what'\''s your name? ' name
echo
...
這只是 using 的簡化版本,curl會導致相同的問題:
curl -sl https://www.conteso.com/install.sh | bash
如何使用curl/在內部腳本中cat進行阻塞read?
uj5u.com熱心網友回復:
read默認情況下從標準輸入讀取。使用管道時,標準輸入是管道,而不是終端。
如果您想始終從終端讀取,請將read輸入重定向到/dev/tty.
#!/usr/bin/env bash
set -x
while true; do
read -p "Hello, what's your name? " name </dev/tty
echo $name
done
但是您可以通過將腳本作為引數bash而不是管道來解決問題。
bash ./install.sh
使用curl獲取腳本時,可以使用行程替換:
bash <(curl -sl https://www.conteso.com/install.sh)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/334797.html
