Macos Bash';阅读';命令不接受Mac上的-i参数。还有别的选择吗?

Macos Bash';阅读';命令不接受Mac上的-i参数。还有别的选择吗?,macos,bash,Macos,Bash,我有一个bash脚本,可以在我的Ubuntu机器上正常工作,但很遗憾,当我尝试在我的MacOSX狮子山笔记本电脑上运行它时,它崩溃了。杀死它的线是这样的: 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脚本,可以在我的Ubuntu机器上正常工作,但很遗憾,当我尝试在我的MacOSX狮子山笔记本电脑上运行它时,它崩溃了。杀死它的线是这样的:

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
。为什么?我们可以做些什么来解决这个问题


谢谢:)

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

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

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
Mac OS X 10.7 Lion(以及迄今为止所有最新版本,谢谢@kojiro)随
bash 3.2
发布,而
read-i
bash 4.0-alpha
发布(请参阅)

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

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

可以编写一个包装器函数来检测是否支持
-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
}

注意:如果调用此函数
读取
,它将替换功能不太强大的内置组件。

OS 10.9仍然随bash 3提供。谢谢-这对我来说确实有效,但没有完全相同的行为,因为实际上可以在
读取-i
版本中修改预填充的版本。我想我会把一个
如果[${BASH_VERSION:0:1}<4];然后…
中的消息解释如何使用自制软件或类似软件升级Bash!是的,这就是我说的“非读线”的意思。不幸的是,对于股票期权,你无法移植地模仿这种行为。(FWIW,我会直接使用
${BASH_VERSINFO[0]}
,而不是解析
$BASH_VERSION
。看起来更优雅、更健壮。)很酷,谢谢你的提示。Mac没有提供最新的Bash,这真是个麻烦。用Mac软件包管理器做任何事情都是一首民谣。我希望他们能有像
apt-get
yum
这样的好东西。哦,好吧!我现在也要这么做-为什么要受苦?谢谢你的回答,猜疑,但这对我来说并不管用。无论我输入什么,
$SHFS\u PATH
(sic)都具有
DEFPATH
值。duh!我留下了$SHFS\u PATH-应该是SHFS\u PATH(没有
$
)啊,有道理:)PS,我正试图用自制软件升级,但它似乎试图对一个不存在的Gist文件执行Curl fetch…它说:错误:执行时失败:/usr/bin/Curl-f#LA Homebrew\0.9.3\(Ruby\1.8.7-358;\Mac\OS\X\10.8.4)-o 000-Homebrew.diff
readinput -e -p "This is a test of... " -i "default value" variable
variable=${variable:-default value}