【问题标题】:Bash 'read' command does not accept -i parameter on Mac. Any alternatives?Bash 'read' 命令在 Mac 上不接受 -i 参数。有什么选择吗?
【发布时间】:2014-03-25 12:04:44
【问题描述】:

我有一个 bash 脚本,可以在我的工作 Ubuntu 机器上正常运行,但是当我尝试在我的 Mac OSX Lion Mountain Lion 笔记本电脑上运行它时,很遗憾地中断了。杀死它的行是这样的:

while [[ -z "$SSHFS_PATH" ]] ; do
  read -e -p "Please enter the path on which to mount your file system: `echo -e $'\n > '`" -i "~/aws-dev" SSHFS_PATH;
done

它抛出这个错误:

-bash: read: -i: invalid option
read: usage: read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...]

所以看起来 OSX 版本的 read 命令不接受 -i,它用于建议默认值。为什么?可以做些什么来解决这个问题?

谢谢:)

【问题讨论】:

    标签: macos bash


    【解决方案1】:

    Mac OS X 10.7 Lion(以及迄今为止的所有最新版本,感谢@kojiro)附带bash 3.2,而read -i 是通过bash 4.0-alpha 引入的(请参阅ChangeLog)。

    您可以使用homebrew 安装更新版本的bash 或自己提供非readline 默认值,例如

    read -p "Path? (default: /bar): " var
    [ -z "${var}" ] && var='/bar'
    

    【讨论】:

    • Here's evidence OS 10.9 仍然附带 bash 3。
    • 谢谢 - 这确实对我有用,但没有完全相同的行为,因为实际上可以修改 read -i 版本中的预填充版本。我想我会在其中添加一条 if [[ ${BASH_VERSION:0:1} < 4 ]] ; then ... 消息,说明使用 Homebrew 等升级 Bash!
    • 是的,这就是我所说的“非阅读线”。不幸的是,对于股票期权,您无法以便携方式模拟这种行为。
    • (FWIW,我会直接使用${BASH_VERSINFO[0]} 而不是解析$BASH_VERSION。看起来更优雅、更健壮。)
    • 酷,感谢您的提示。 Mac 没有随最新的 Bash 一起提供,这真是个麻烦。使用 Mac 包管理器做任何事情总是很麻烦。我希望他们能拥有像apt-getyum 这样好的和可靠的东西。哦,好吧!
    【解决方案2】:

    可以编写一个包装函数来检测是否支持-i 并使用适当的语法:

    function readinput() {
      local CLEAN_ARGS=""
      while [[ $# -gt 0 ]]; do
        local i="$1"
        case "$i" in
          "-i")
            if read -i "default" 2>/dev/null <<< "test"; then 
              CLEAN_ARGS="$CLEAN_ARGS -i \"$2\""
            fi
            shift
            shift
            ;;
          "-p")
            CLEAN_ARGS="$CLEAN_ARGS -p \"$2\""
            shift
            shift
            ;;
          *)
            CLEAN_ARGS="$CLEAN_ARGS $1"
            shift
            ;;
        esac
      done
      eval read $CLEAN_ARGS
    }
    

    然后

    readinput -e -p "This is a test of... " -i "default value" variable
    variable=${variable:-default value}
    

    注意:如果您调用此函数read,它将替换功能不那么强大的内置函数。

    【讨论】:

      【解决方案3】:

      OSX bash 是版本 3。Linux 用户享受 bash 版本 4 的附加功能。

      使用参数替换 ${VAR:-def-value} 如果 $VAR 未设置,则返回 def-value。

      DEFPATH="~/aws-dev"
      while [[ -z "$SHFS_PATH" ]] ; do
          echo "Please enter the path on which to mount your file system"
          read -p "default is $DEFPATH " SHFS_PATH
          SHFS_PATH=${SHFS_PATH:-~/aws-dev}
          echo $SHFS_PATH
      done
      

      【讨论】:

      • 我现在也要这样做——为什么要受苦?
      • 感谢您的回答,嫌疑人,但它实际上并没有为我工作。无论我输入什么,$SHFS_PATH(原文如此)都有 DEFPATH 值。
      • 呃!我离开了 $SHFS_PATH - 应该是 SHFS_PATH(没有 $
      • 啊,有道理:) PS,我正在尝试使用 Homebrew 进行升级,但它似乎正在尝试对不存在的 Gist 文件进行 Curl 提取...
      • 它说:错误:执行时失败:/usr/bin/curl -f#LA Homebrew\ 0.9.3\ (Ruby\ 1.8.7-358;\ Mac\ OS\ X\ 10.8 .4) raw.github.com/gist/4008180/… -o 000-homebrew.diff
      猜你喜欢
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多