gere nova janela de terminal (qualquer) a partir de um script

1

Eu gostaria de executar um script que detecta o terminal atual e gera uma nova janela de terminal, em segundo plano, com um comando shell (por exemplo, htop )

Eu obtenho o resultado desejado na linha de comando:

cterminal="$(ps -p $(ps -p $$ -o ppid=) o args=)"  
$(echo $cterminal -e "htop")&  

e funciona em todos os terminais. Mas não de um script:

#!/bin/bash  
cterminal="$(ps -p $(ps -p $$ -o ppid=) o args=)"  
echo $cterminal  
"$cterminal" -e "htop" &  

saída de script atual:

$ bash script.sh
/bin/bash  
$ /usr/bin/htop: /usr/bin/htop: cannot execute binary file

Alguma dica?

    
por AJN 11.12.2015 / 00:15

1 resposta

1

Seu comando ps está imprimindo o PID do processo pai (PPID). Quando você estiver executando um emulador de terminal, $$ (o PID do processo atual) estará apontando para sua sessão de shell e seu PPID será o emulador de terminal que o iniciou.

Os scripts são executados em suas próprias subshells . Isso significa que o processo pai de um script é o shell que o lançou. Portanto, quando você executar o comando, não estará executando xterm -e htop , mas bash xterm -e htop . Para ilustrar:

$ bash top  
/sbin/top: /sbin/top: cannot execute binary file

Você pode testar isso executando echo $(echo $cterminal -e "htop") de um script e da linha de comando.

Para executar o script a partir de um emulador de terminal GUI, você pode usar o PPID do PPID:

cterminal="$(ps -p $(ps -p $PPID -o ppid=) o args=)"  

Por fim, não use $(echo ...) para executar seu comando, basta executá-lo:

#!/usr/bin/env bash
$(ps -p $(ps -p $PPID -o ppid=) o args=) -e top
    
por 11.12.2015 / 00:54

Tags