【发布时间】:2015-01-18 16:56:51
【问题描述】:
我有一个简单的 Bash 脚本:
#!/usr/bin/env bash
read X
echo "X=$X"
当我使用./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"
- 使用
cat myscript.sh | bash执行脚本有什么好处?为什么不执行与使用./myscript.sh执行相同的操作? - 如何避免 Bash 逐行执行,但在 STDIN 到达末尾后执行所有行?
【问题讨论】:
-
为什么不使用
bash ./myscript.sh -
或只是
./myscript.sh -
因为它实际上更复杂。我想编写一个简单的安装程序来下载带有
curl的shell 脚本,然后将其通过管道传输到bash 以避免创建临时文件,就像Composer 使用PHP (getcomposer.org/download) 那样。但是,如果这种方式不起作用,我还需要使用 PHP 或临时文件。 -
@TheFox 然后看看 Ethan 的回答,完全符合“在此设置中您想从哪里读取数据?您可以手动执行此操作(如果您可以定义这样的地方)”。如果有人在看终端,您可以将
readstdin重定向到/dev/tty,因为查尔斯刚刚回答了这个问题... -
@TheFox 了解为什么某人提出问题有助于确定他们提出的问题是否正确。你想做什么和你应该做什么有时是两件不同的事情。