ダイアログパッケージを使用してパスワードボックスを作成したいのですが。
#!/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
どうしましたか?
「あいまいなリダイレクト」はフラグメント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行目で変更できます。