第 4 行:$data:使用密码框时的歧义重定向

The*_*Guy 3 io-redirection shell-script dialog

我想使用对话框包创建一个密码框。

#!/bin/bash
data=$(tempfile 2>/dev/null)
trap "rm -f $data" 0 1 2 5 15
dialog --title "Password" \
--clear \
--passwordbox "Enter your password" 10 30 2> $data

ret=$?

case $ret in
  0)
    echo "Password is $(cat $data)";;
  1)
    echo "Cancel pressed.";;
  255)
    [ -s $data ] &&  cat $data || echo "ESC pressed.";;
esac
Run Code Online (Sandbox Code Playgroud)

但是,当我执行它时出现此错误:

line 4: $data: ambiguous redirect
Run Code Online (Sandbox Code Playgroud)

怎么了?

Gil*_*il' 5

“模糊重定向”涉及片段2>$data。这表明变量的值data没有扩展到一个词。

鉴于您设置它的方式,很可能data是因为tempfile命令失败而导致的值为空。由于某种原因,您隐藏了tempfile. 删除重定向:

data=$(tempfile)
Run Code Online (Sandbox Code Playgroud)

tempfile实用程序是一个 Debian 实用程序,您在 Debian 和衍生产品(如 Ubuntu 和 Linux Mint)之外找不到它。您很可能在没有此实用程序的系统上运行此脚本。您可以改用类似的实用程序mktemp,该实用程序广泛可用。

data=$(mktemp)
Run Code Online (Sandbox Code Playgroud)

此外,鉴于您正在存储机密数据,您需要确保临时文件不可读。

data=$(umask 077; mktemp)
Run Code Online (Sandbox Code Playgroud)

话虽如此,创建临时文件比必要的要复杂。相反,指示dialog将数据打印到其标准输出,并使用命令替换。

#!/bin/bash
password=$(dialog --title "Password" \
                  --clear \
                  --passwordbox "Enter your password" 10 30 \
                  --stdout)
ret=$?
…
Run Code Online (Sandbox Code Playgroud)