【问题标题】:Interactive command in command substitution bash script命令替换 bash 脚本中的交互式命令
【发布时间】:2011-10-21 21:38:30
【问题描述】:

我正在编写一个 shell 脚本,它要求一个值,并根据输入的值返回一个值。想象一下它被称为“reve”并且包含类似

read fname
rev << EOF 
$fname
EOF

如果我有一个名为“file.txt”的文件,我会这样做

vi `./reve`

然后等待用户输入。如果我输入“txt.elif”,vi 会打开“file.txt”。正确到现在。但问题是当脚本类似于以下内容时

echo "Enter inverted file name"
read fname
rev << EOF 
$fname
EOF

然后它会尝试打开一个名为“输入反转文件名”的文件。

是否可以通过文本请求值,然后仅使用返回的值?

提前致谢。

【问题讨论】:

    标签: bash scripting


    【解决方案1】:

    如果你真的需要它是交互式的,那么你可以在 stderr 上打印消息。

    echo "Enter inverted file name" > /dev/stderr
    read fname
    rev << EOF 
    $fname
    EOF
    

    【讨论】:

      【解决方案2】:

      除非您使用的是非常旧的 shell,否则 read 应该有一个 -p 选项来提供提示。它会自动将提示发送到 stderr 而不是 stdout,并跳过换行(因此响应与提示在同一行):

      read -p "Enter inverted file name: " fname
      rev << EOF 
      $fname
      EOF
      

      【讨论】:

        【解决方案3】:

        使用/dev/tty 强制向终端写入和读取。

        在您的示例中,这将是:

        echo -e "Enter inverted file name: \c" > /dev/tty
        read fname < /dev/tty
        rev << EOF 
        $fname
        EOF
        

        我使用了echo -e ... \c,因此不会打印换行符,并且您的输入会在同一行输入。

        【讨论】:

          猜你喜欢
          • 2014-05-08
          • 2010-11-29
          • 1970-01-01
          • 2017-03-18
          • 1970-01-01
          • 2012-07-03
          • 2014-08-23
          • 1970-01-01
          • 2019-01-14
          相关资源
          最近更新 更多