gpt4 book ai didi

bash - 读取输入,同时通过标准输入管道传输脚本

转载 作者:行者123 更新时间:2023-11-29 09:35:18 28 4
gpt4 key购买 nike

我有一个简单的 Bash 脚本:

#!/usr/bin/env bash
read X
echo "X=$X"

当我用 ./myscript.sh 执行它时,它起作用了。但是当我用 cat myscript.sh | 执行它时bash 它实际上将 echo "X=$X" 放入 $X

所以这个脚本打印了 Hello World executed with cat myscript.sh |庆典:

#!/usr/bin/env bash
read X
hello world
echo "$X"
  • cat myscript.sh 执行脚本有什么好处?庆典?为什么不像我用 ./myscript.sh 执行它那样做呢?
  • 如何避免 Bash 逐行执行但在 STDIN 到达末尾后执行所有行?

最佳答案

不仅仅是运行

read X

...将其替换为...

read X </dev/tty || {
X="some default because we can't read from the TTY here"
}

...如果你想从控制台读取。当然,这仅在您拥有 /dev/tty 时有效,但如果您想做一些稳健的事情,您就不会从 curl< 进行管道传输 进入 shell 。 :)


当然,另一种选择是在命令行中传递您的 X 值。

curl https://some.place/with-untrusted-code-only-idiots-will-run-without-reading \
| bash -s "value of X here"

...并在需要 X 时在脚本中引用 "$1"

(顺便说一句,我当然希望你至少为此使用 SSL,而不是建议人们运行他们通过纯 HTTP 下载的代码,没有带外验证步骤。很多人这样做,当然,但这使得他们下载的网站——比如 rvm.io——成为大目标。大的、易于中间人或 DNS 劫持的目标)。

关于bash - 读取输入,同时通过标准输入管道传输脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27046236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com