Execute comandos separados por ponto-e-vírgula passado para o sinalizador -e de st (Terminal simples)

0

NOTA: st é o nome real do emulador de terminal na minha pergunta - link .

Eu quero criar um atalho que, se pressionado, aparece st e exibe a tradução da palavra na área de transferência.

Eu tentei usar isso, mas sai imediatamente e dá um erro:

$ st -e "trans $(xclip -o) -t en; read"'
child finished with error '256'

Mas o mesmo funciona com xterm como esperado:

$ xterm -e "trans $(xclip -o) -t en; read"

Usando apenas um comando como a opção -e do st funciona, mas eu preciso executar a leitura ou algo assim após o trans para que o terminal não feche imediatamente.

Isso é um bug no st ou estou fazendo algo errado?

    
por IronPig 08.08.2018 / 12:20

2 respostas

2

A opção -e é um mecanismo de compatibilidade no terminal simples . O comando e os argumentos que você passa, com ou sem -e , são executados diretamente, por simples bifurcação de terminal e, em seguida, executando execvp() no processo filho exatamente no comando e nos argumentos que ele recebe. Não há shell envolvido e os argumentos passados para st são enviados exatamente como estão para o programa de destino.

Você passou tudo como um único argumento. Portanto, o terminal simples está realmente tentando executar um comando chamado, literalmente, trans $(xclip -o) -t en; read (se estiver entre aspas simples ou modificado por qualquer que seja o resultado da expansão, se você usar aspas duplas). Obviamente, você não tem nenhum comando chamado assim.

Para usar uma linha de comando do shell - como você tem aqui com expansões, comandos internos do shell e sintaxe de comando do shell - você precisa invocar explicitamente um shell para compreendê-lo:

st -e sh -c 'trans "$(xclip -o)" -t en; read'

Isso executa st , que inicia um shell sh que executa um script de shell curto, que contém seus comandos.

    
por 08.08.2018 / 12:35
1

Olhando a página do manual para st :

st [-aiv] [-c class] [-f font] [-g geometry] [-n name] [-o iofile] [-T title] 
[-t title] [-l line] [-w windowid] [[-e] command [arguments...]]


-e command [ arguments ... ]
      st executes command instead of the shell.  If this is used it must be 
      the last option on the command line, as in xterm / rxvt. This option 
      is only intended for compatibility, and all the remaining arguments 
      are used as a command even without it.

Eu concordaria com @Kusalananda que essa opção se destina apenas a ter um único comando e nada tão complexo quanto o que você está tentando realizar.

Então, para isso, você precisa passar um shell como o argumento -e para st e, em seguida, passar seus comandos como um conjunto secundário de argumentos para o shell com maior capacidade:

$ st <other args> -e sh -c '....'
$ st <other args> -e bash -c '....'

Referências

por 08.08.2018 / 12:50