Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 读取输入,同时通过标准输入输出脚本_Bash_Shell - Fatal编程技术网

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

我有一个简单的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|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"