web-dev-qa-db-ja.com

4行目:$ data:passwordbox使用時のあいまいなリダイレクト

ダイアログパッケージを使用してパスワードボックスを作成したいのですが。

#!/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

ただし、実行すると次のエラーが発生します。

line 4: $data: ambiguous redirect

どうしましたか?

3
TheNiceGuy

「あいまいなリダイレクト」はフラグメント2>$data。これは、変数dataの値が正確に1ワードに拡張されていないことを示しています。

設定方法を考えると、dataコマンドが失敗したため、tempfileの値が空である可能性が高くなります。何らかの理由で、tempfileによって発行されたエラーメッセージを非表示にしています。リダイレクトを削除します。

data=$(tempfile)

tempfileユーティリティはDebianユーティリティであり、DebianやUbuntuやLinuxMintなどの派生物以外にはありません。このユーティリティがないシステムでこのスクリプトを実行している可能性があります。代わりに、広く利用可能な同様のユーティリティmktempを使用できます。

data=$(mktemp)

さらに、機密データを保存している場合は、一時ファイルが読み取れないようにする必要があります。

data=$(umask 077; mktemp)

そうは言っても、一時ファイルの作成は必要以上に複雑です。代わりに、dialogにデータを標準出力に出力するように指示し、コマンド置換を使用します。

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

data変数がnullです!この変数の内容はecho $data...で確認できますが、何も表示されません。

これを試して:

#!/bin/bash
data=/tmp/dialogsh-$$.$RANDOM; > $data
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

入力情報は、dialog.number.number!というファイルの/ tmpディレクトリに保存されます。ソースの2行目で変更できます。

1
Sepahrad Salour