我在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被击中(就像一个暂停)。
答案 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