Linha 4: $ data: redirecionamento ambíguo ao usar o passwordbox

3

Eu quero criar uma caixa de senha usando o pacote de diálogo.

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

No entanto, recebo este erro quando o executo:

line 4: $data: ambiguous redirect

O que há de errado?

    
por Michael 05.12.2013 / 16:12

2 respostas

5

O "redirecionamento ambíguo" refere-se ao fragmento 2>$data . Isso indica que o valor da variável data não se expande para exatamente uma palavra.

Dada a maneira como você o define, é mais provável que o valor de data esteja vazio porque o comando tempfile falhou. Você está, por algum motivo, ocultando qualquer mensagem de erro emitida por tempfile . Remova o redirecionamento:

data=$(tempfile)

O utilitário tempfile é um utilitário Debian, que você não encontrará fora do Debian e derivados como Ubuntu e Linux Mint. É provável que você esteja executando esse script em um sistema que não tenha esse utilitário. Você pode usar o utilitário similar mktemp , que está amplamente disponível.

data=$(mktemp)

Além disso, como você está armazenando dados confidenciais, é necessário garantir que o arquivo temporário não seja legível.

data=$(umask 077; mktemp)

Dito isto, criar um arquivo temporário é mais complexo do que o necessário. Em vez disso, instrua dialog para imprimir os dados em sua saída padrão e use uma substituição de comando.

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

Sua variável data é nula! você pode ver o conteúdo desta variável com echo $data ... não mostra nada!

Tente isto:

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

Suas informações de entrada serão armazenadas no diretório / tmp no arquivo que chamou dialog.number.number ! Você pode alterá-lo na segunda linha da fonte.

    
por 05.12.2013 / 21:12