Bash'read'命令不接受Mac上的-i参数。任何替代品?

时间:2014-03-25 12:04:44

标签: macos bash

我有一个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,它用于建议默认值。为什么?有什么办法可以解决这个问题?

谢谢:)

3 个答案:

答案 0 :(得分:13)

Mac OS X 10.7 Lion(以及此日期的所有更新版本,感谢@kojiro)附带bash 3.2,而read -i附带bash 4.0-alpha(请参阅{{ 3}})。

您可以使用ChangeLog安装更新版本的bash,也可以自行提供非读取默认值,例如

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

答案 1 :(得分:1)

可以编写一个包装函数来检测是否支持-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,它将替换不那么功能的内置函数。

答案 2 :(得分:0)

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

如果未设置$ VAR,则使用参数替换${VAR:-def-value},然后返回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