saída do comando pipe para diálogo e permite rolar para cima

3

Eu quero executar um comando arbitrário, por exemplo %código% Eu quero canalizar sua saída para a caixa de diálogo. --tailbox e --progressbox lidar com isso muito bem, exceto que se a saída torna-se muito, você só pode ver, tanto quanto a tela se encaixa.

Eu preciso ser capaz de usar para cima / baixo setas e / ou chaves pg up / pg dn para rolar para cima e ver a saída anterior. Existem outras opções que permitem barras de rolagem, mas nenhuma delas parece permitir a saída de piping para elas.

Editar: Eu encontrei um exemplo que se propõe a fazer isso, mas eu sinceramente não entendo como funciona ou como traduzi-lo para o exemplo de find / -name "a*" .     veja o último exemplo no link

Edit 2:. O único requisito é o diálogo uso (ou algo parecido permitindo ncurses como gui para linha de comando e caixas de interface gráfica nativa se X está disponível

    
por senorsmile 19.06.2013 / 04:59

3 respostas

2

--tailbox and --progressbox handle this well, except that if the output becomes too much, you can only see as much as the screen fits.

Isso não está totalmente correto. Um --tailbox permite rolar para a esquerda e para a direita. Mas não permite rolar para cima e para baixo, o que é uma pena.

Para contornar isso, você pode fornecer o --tailbox com um --extra-button que é acionado, por exemplo, um --textbox . (Então o botão “Sair” se torna um botão “OK”, então você tem que usar --ok-label se você quiser mudar sua legenda.)

Fechar o --textbox pode anular ou retornar ao --tailbox . A seguir, ele retorna para o --tailbox :

(
  log=/tmp/make-kernel.log

  # start process that writes to "$log" here

  exit_status=1

  while [ $exit_status -ne 0 ]
  do
    dialog \
      --ok-label Close \
      --extra-button --extra-label Inspect \
      --tailbox "$log" 21 80

    exit_status=$?

    if [ $exit_status -eq 255 ]; then
      dialog --textbox "$log" 21 80
    fi
  done
)

Edit: I have found an example that purports to do this, but I honestly don't understand how it works or how to translate it to the example of find / -name "a*". see the last example on http://mywiki.wooledge.org/BashFAQ/040

Muito obrigado por se referir a esse exemplo. Por fim, entendo como o --tailboxbg deve funcionar.

No entanto, em contraste com a minha abordagem, este exemplo “como está” não permitirá que você role a saída (nem pretende fazer isso). Além disso, aqui (diálogo 1.3-20160828), nenhum botão é exibido no --tailbox , que por comparação não é amigável ao usuário.

A maneira como "funciona" é a seguinte:

# POSIX
# you cannot tail a nonexistent file, so always ensure it pre-exists!
> dialog-tail.log

"Crie um arquivo vazio dialog-tail.log para que o dialog abaixo possa exibir o arquivo mesmo que nada tenha sido gravado nele ainda."

{
    for i in 1 2 3; do 
        printf '%d\n' "$i"
        sleep 1
    done

    printf 'Done\n'
} > dialog-tail.log &

“Escreva os números de 1 a 3 no arquivo dialog-tail.log , cada um em sua própria linha ( \n ), um número por segundo ( sleep 1 ) e faça isso em segundo plano ( & ) . "

No seu caso, você deve substituir { … } por find / -name 'a*' . Você também pode redirecionar o fluxo de erro padrão de find .

dialog --title "TAIL BOXES" \
       --begin 10 10 --tailboxbg dialog-tail.log 8 58 \
       --and-widget \
       --begin 3 10 --msgbox "Press OK " 5 30

“Exiba o arquivo em uma caixa na linha 10, coluna 10, com o título 'TAIL BOXES' como se fosse tail (1), mas execute essa caixa em segundo plano ( --tailboxbg em vez de --tailbox ) , para que um widget adicional ( --and-widget ) possa ser exibido imediatamente a partir da linha 3, coluna 10 ( --begin 3 10 ; acima da caixa de cauda). Esse widget é um --msgbox com o texto "Pressione OK", altura 5 e largura 30 ".

wait

“Não execute os seguintes comandos até que todos os processos-filhos em segundo plano tenham saído (aqui: o processo que grava no arquivo e dialog ).” (RTFM, respectivamente)

    
por 09.03.2017 / 00:27
0

Simplesmente envie seu comando para more e você poderá usar as teclas de movimento BASH padrão (ou para cima / para baixo) para mover a saída. No seu caso ...

find / -name "a*" | more

... deve fazer o truque.

    
por 19.06.2013 / 05:15
0

Você terá que criar um arquivo temporário para isso:

file=$(mktemp)
cat > "$file"
dialog --textbox "$file" 0 0
rm "$file"
    
por 19.06.2013 / 09:02

Tags