Bash read命令不';不要等待输入
我在bash中执行简单脚本时遇到问题。脚本如下所示: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执行脚本时,输出如
#! /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
代码。这完全没有帮助。回答者,以及这个社区的新手,可能会发现看到否决票背后更彻底的原因是有帮助的。