我有一个简单的Bash脚本:
#!/usr/bin/env bash
read X
echo "X=$X"
Run Code Online (Sandbox Code Playgroud)
当我执行它时,./myscript.sh它工作.但是当我执行它时cat myscript.sh | bash,实际上它会echo "X=$X"进入$X.
所以这个脚本打印Hello World执行cat myscript.sh | bash:
#!/usr/bin/env bash
read X
hello world
echo "$X"
Run Code Online (Sandbox Code Playgroud)
cat myscript.sh | bash什么好处?为什么不这样做就像我执行它一样./myscript.sh?而不仅仅是跑步
read X
Run Code Online (Sandbox Code Playgroud)
...而是用...替换它
read X </dev/tty || {
  X="some default because we can't read from the TTY here"
}
Run Code Online (Sandbox Code Playgroud)
...如果你想从控制台读取.当然,这只有在你拥有的情况下才有效/dev/tty,但是如果你想做一些强健的东西,你就不会curl进入外壳.:)
当然,另一种选择是X在命令行中传递您的值.
curl https://some.place/with-untrusted-code-only-idiots-will-run-without-reading \
  | bash -s "value of X here"
Run Code Online (Sandbox Code Playgroud)
...并"$1"在您想要的时候在脚本中引用X.
(顺便说一句,我当然希望你至少使用SSL,而不是建议人们运行他们通过普通HTTP下载的代码而没有带外验证步骤.很多人都这样做,当然,但那是制作他们下载的网站 - 比如rvm.io- 大目标.大,易于中间或DNS劫持目标).