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/7/neo4j/3.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 read命令不';不要等待输入_Bash_Wait_Readline - Fatal编程技术网

Bash read命令不';不要等待输入

Bash read命令不';不要等待输入,bash,wait,readline,Bash,Wait,Readline,我在bash中执行简单脚本时遇到问题。脚本如下所示: #! /bin/sh read -p 'press [ENTER] to continue deleting line' sudo sed -ie '$d' /home/hpccuser/.profile press [ENTER] to continue deleting line./script: 3: read: arg count [sudo] password for user 当我用./script执行脚本时,输出如

我在bash中执行简单脚本时遇到问题。脚本如下所示:

#! /bin/sh

read -p 'press  [ENTER]  to continue deleting line'
sudo sed -ie '$d' /home/hpccuser/.profile
press  [ENTER]  to continue deleting line./script: 3: read: arg count
[sudo] password for user
当我用./script执行脚本时,输出如下:

#! /bin/sh

read -p 'press  [ENTER]  to continue deleting line'
sudo sed -ie '$d' /home/hpccuser/.profile
press  [ENTER]  to continue deleting line./script: 3: read: arg count
[sudo] password for user

我直接在终端中运行read命令(从脚本复制并粘贴到终端),效果很好;它等待输入(就像暂停一样)。

因为您的脚本以
开头/bin/sh
而不是
#/bin/bash
,不能保证bash扩展(如
read-p
)可用,只能依赖符合标准的功能

有关保证在
read
中提供的功能列表,请参阅

在这种情况下,您可能需要两行,一行进行打印,另一行进行读取:

printf 'press [ENTER] to continue deleting...'
read _

您也可以使用echo命令执行此操作!:

    echo "press  [ENTER]  to continue deleting line"
    read continue

它在raspbian上起作用

似乎我来晚了,但是
echo-n“Your prompt”和&sed 1q在兼容POSIX的shell上起作用。
这将打印一个提示,并从STDIN中获取一行

或者,您可以将该输入扩展为变量:

echo -n "Your prompt"
YOUR_VAR=$(sed 1q)

如果使用管道将内容重定向到函数/脚本,它将在子shell中运行命令,并将stdin(
0
)设置为管道,可以通过

$ls-l/dev/fd/
lr-x------1根根64五月27日14:08 0->管道:[2033522138]
lrwx------1根根64五月27日14:08 1->/dev/pts/11
lrwx------1根根64五月27日14:08 2->/dev/pts/11
lr-x------1根根64五月27日14:08 3->/proc/49806/fd

如果您调用了
read
/
readarray
/。。。命令在该函数/脚本中,
read
命令将立即返回从该管道读取的任何内容,因为stdin已设置为该管道而不是tty,这解释了为什么
read
命令不等待输入。在这种情况下,要使
read
命令等待输入,您必须在调用
read
命令之前通过
exec 0
将stdin恢复到tty。

我检查了,并且我的$SHELL被bash。因此/bin/sh将启动bash。我错了吗?@mohammadhmontazeri
/bin/sh
启动任何shell,好吧,
/bin/sh
——不是你的
$shell
。此外,将bash启动为
/bin/sh
(在
/bin/sh
bash
的符号链接的情况下)会禁用大量功能。@Mohammadh Montazeri了解更多信息。感谢您教我如何将
$REPLY
作为
read
@CharlesDuffy使用的默认变量!感谢charles,使用/bin/bash更正了脚本。在您发送的上一个链接中也提到了它。如果您的shell是
sh
,这并不能真正解决问题,因为例如Dash不允许您在没有变量名称的情况下调用
read
。使用
echo
(除非您有一个支持
-n
,这是可选功能,shell不需要实现),通过这种方式,你会得到一个额外的换行符,而不是原来的
read-p
代码。这完全没有帮助。回答者,以及这个社区的新手,可能会发现看到否决票背后更彻底的原因是有帮助的。