Bash 读取输入,同时通过标准输入输出脚本
我有一个简单的Bash脚本:Bash 读取输入,同时通过标准输入输出脚本,bash,shell,Bash,Shell,我有一个简单的Bash脚本: #!/usr/bin/env bash read X echo "X=$X" 当我使用/myscript.sh执行它时,它会工作。但是当我使用catmyscript.sh | bash执行它时,它实际上将echo“X=$X”放入$X中 因此,此脚本打印使用cat myscript.sh|bash执行的Hello World: #!/usr/bin/env bash read X hello world echo "$X" 使用cat myscript.sh|b
#!/usr/bin/env bash
read X
echo "X=$X"
当我使用/myscript.sh
执行它时,它会工作。但是当我使用catmyscript.sh | bash执行它时,它实际上将echo“X=$X”
放入$X
中
因此,此脚本打印使用cat myscript.sh|bash执行的Hello World
:
#!/usr/bin/env bash
read X
hello world
echo "$X"
- 使用
cat myscript.sh|bash
执行脚本有什么好处?为什么不像我用/myscript.sh
执行它一样执行它呢
- 如何避免Bash逐行执行,但在STDIN到达末尾后执行所有行
当您cat
要执行的bash代码的脚本来自标准输入
从哪里读取
从哪里读取?这是正确的,也是标准输入。这就是为什么您可以将cat
输入到采用标准输入的程序(如sed
、awk
等)
因此,在执行此操作时,您并不是在运行“脚本”。您正在运行一系列输入行
在此设置中,您希望从哪里读取数据
您可以手动执行此操作(如果可以定义这样的位置)。或者,您可以停止像这样运行脚本。而不是只运行脚本
read X
…取而代之的是
read X </dev/tty || {
X="some default because we can't read from the TTY here"
}
…如果需要X
,请参阅脚本中的“$1”
(顺便说一句,我当然希望你至少在这方面使用SSL,而不是建议人们在没有带外验证步骤的情况下通过普通HTTP运行他们下载的代码。当然,很多人这样做,但这让他们下载的网站——如rvm.io
——成为大目标。大目标,中间人容易操作或DNS劫持目标).为什么不使用bash./myscript.sh
或只使用/myscript.sh
,因为它实际上更复杂。我想编写一个简单的安装程序,用curl
下载一个shell脚本,然后通过管道将其传输到bash,以避免创建临时文件,就像Composer用PHP()所做的那样。但是,如果这种方法不起作用,我还需要用PHP或临时文件来做。@TheFox然后看看Ethan的答案,就是“在这个设置中,你想从哪里读取数据?你可以手动这样做(如果你能定义这样一个位置)。”如果有人看着终端,您可以将read
stdin
重定向到/dev/tty
,正如Charles刚才所回答的那样…@了解某人提出问题的原因有助于确定他们提出的问题是否正确。你想做什么和你应该做什么有时是两码事。
curl https://some.place/with-untrusted-code-only-idiots-will-run-without-reading \
| bash -s "value of X here"