Insere a saída do shell script no editor de texto?

1

Meu objetivo é usar a saída de um script bash para inserir a string resultante em um arquivo de texto usando uma tecla de atalho definida pelo sistema.

O script (veja abaixo) funciona bem no terminal. Mas quando eu disparar a partir da minha tecla de atalho (estou usando: super + alt + u , no caso que importa), eu don obter qualquer coisa "fora" do script. O editor (por exemplo, gedit) parece "piscar", mas nada acontece. Eu estou supondo que o script está sendo executado, mas que eu não estou "terminando" o script corretamente para este uso (?).

Este é o script: ele recebe um timestamp unix (saída de date +%s ), converte para base62 e retorna os últimos quatro caracteres da string resultante. (Para os curiosos, eu uso isso para gerar âncoras razoáveis para notas de rodapé no texto "Markdown").

#!/bin/bash
# takes unix timestamp and converts to base62
# HT: https://stackoverflow.com/a/14472352/232251

function u2b {
  v=$(date +%s)
  BASE62=($(echo {0..9} {a..z} {A..Z}))
  for i in $(bc <<< "obase=62; $v"); do echo -n ${BASE62[$(( 10#$i ))]}
  done 
}
r=$(u2b)
echo ${r: -4}

Eu tentei a última linha com printf ${r: -4} , mas isso não ajuda.

Como posso persuadir esse script / combinação de chaves para fornecer "entrada" para meu editor? (Eu estou usando baunilha mais recente Ubuntu, btw.)

    
por Dɑvïd 30.01.2018 / 12:36

2 respostas

0

Encontrei ajuda de Unix.SE e incorporei isso no script com um pouco de atraso ( talvez eu precise de uma rotina mais rápida!) me fornece apenas o resultado necessário para inserir o resultado desse script na janela ativa:

#!/bin/bash
# takes unix timestamp and converts to base62
# HT: https://stackoverflow.com/a/14472352 | https://unix.stackexchange.com/a/393164

function u2b {
  v=$(date +%s)
  BASE62=($(echo {0..9} {a..z} {A..Z}))
  for i in $(bc <<< "obase=62; $v"); do echo -n ${BASE62[$(( 10#$i ))]}
  done 
}
r=$(u2b)
o=$(echo ${r: -4})

windowid=$(xdotool getwindowfocus)
sleep 0.5 && xdotool windowactivate --sync $windowid type "$o"

As alterações da postagem original são todas encontradas nas últimas três linhas, assim:

  • capture a string desejada para uma variável;
  • pegue o ID da janela atual;
  • deixe o script ser executado & amp; "digite" a string de saída na janela atual.

Eu gosto especialmente que isso não precise mexer com um arquivo intermediário, ou usar a área de transferência de qualquer forma.

    
por Dɑvïd 30.01.2018 / 14:21
1

Altere o script original da seguinte forma:

#!/bin/bash
# takes unix timestamp and converts to base62
# HT: https://stackoverflow.com/a/14472352/232251

function u2b {
  v=$(date +%s)
  BASE62=($(echo {0..9} {a..z} {A..Z}))
  for i in $(bc <<< "obase=62; $v"); do echo -n ${BASE62[$(( 10#$i ))]}
  done 
}
r=$(u2b)
result=$(echo ${r: -4})
echo $result # for testing only, this line can be optionally deleted afterwards
gedit - <<< $result # redirect output into gedit 

A segunda à última linha que diz echo $result é usada apenas para testar o script. Pode opcionalmente ser excluído.

    
por karel 30.01.2018 / 13:17