22

我在 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

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

4

5 回答 5

28

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

请参阅相关标准文档以获取保证存在于read.

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

printf 'press [ENTER] to continue deleting...'
read _
于 2013-04-01T13:34:04.620 回答
3

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

    echo "press  [ENTER]  to continue deleting line"
    read continue
于 2014-10-10T09:36:41.103 回答
0
read -p " Ici mon texte " continue

它适用于树莓派

于 2016-04-26T09:18:40.997 回答
0

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

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

echo -n "Your prompt"
YOUR_VAR=$(sed 1q)
于 2019-06-18T10:15:06.227 回答
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命令将立即返回从该管道读取的任何内容,因为标准输入已设置为该管道而不是 tty,这解释了为什么命令不等待输入. 在这种情况下,要让命令等待输入,您必须在调用命令之前将 stdin 恢复为 tty。readarrayreadreadreadexec 0< /dev/ttyread

于 2021-05-27T06:22:47.923 回答