read命令不等待输入

时间:2013-04-01 13:30:05

标签: bash wait readline

我在bash中执行一个简单的脚本时遇到问题。脚本是这样的:

#! /bin/sh

read -p 'press  [ENTER]  to continue deleting line'
sudo sed -ie '$d' /home/hpccuser/.profile

当我用./script执行脚本时,输出如下:

press  [ENTER]  to continue deleting line./script: 3: read: arg count
[sudo] password for user

我直接在终端中运行read命令(从脚本复制并粘贴到终端),它工作正常;它等待一个ENTER被击中(就像一个暂停)。

5 个答案:

答案 0 :(得分:21)

由于您的脚本以#!/bin/sh而不是#!/bin/bash开头,因此您无法保证可以使用bash扩展(例如read -p),并且只能依赖符合标准的功能

请参阅the relevant standards document,了解read中确保存在的功能列表。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

似乎我参加聚会迟到了,但是echo -n "Your prompt" && sed 1q在符合POSIX的shell上成功了。 这样会显示提示,并从STDIN抓取一行。

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

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

答案 3 :(得分:0)

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

$ ls -l /dev/fd/
lr-x------ 1 root root 64 May 27 14:08 0 -> pipe:[2033522138]
lrwx------ 1 root root 64 May 27 14:08 1 -> /dev/pts/11
lrwx------ 1 root root 64 May 27 14:08 2 -> /dev/pts/11
lr-x------ 1 root root 64 May 27 14:08 3 -> /proc/49806/fd

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

答案 4 :(得分:-1)

read -p " Ici mon texte " continue

它适用于raspbian