Bash 使用 cat 和 pipe 读取命令
Bash read command with cat and pipe
我有两个脚本:
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
...
这只是使用 curl
的简化版本,它会导致相同的问题:
curl -sl https://www.conteso.com/install.sh | bash
如何使用 curl
/cat
在内部脚本中阻止 read
?
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)
我有两个脚本:
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
...
这只是使用 curl
的简化版本,它会导致相同的问题:
curl -sl https://www.conteso.com/install.sh | bash
如何使用 curl
/cat
在内部脚本中阻止 read
?
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)