スクリプトから新しい端末(すべて)ウィンドウを作成する

スクリプトから新しい端末(すべて)ウィンドウを作成する

htop現在の端末を検出し、シェルコマンド(たとえば)を使用してバックグラウンドで新しい端末ウィンドウを生成するスクリプトを実行したいと思います。

コマンドラインで目的の結果を得ました。

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

すべての端末で動作します。しかし、スクリプトではそうではありません。

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

現在のスクリプト出力:

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

どのようなヒントがありますか?

答え1

あなたのpsコマンドは親プロセスのPID(PPID)を印刷しています。ターミナルエミュレータを実行すると$$(現在のプロセスのPID)がシェルセッションを指し、そのPPIDはそれを開始したターミナルエミュレータになります。

スクリプトは独自の環境で実行されます。サブシェル。これは、スクリプトの親プロセスがこれを開始したシェルであることを意味します。したがって、コマンドを実行してもxterm -e htop実行されませんbash xterm -e htop。表示するには:

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

echo $(echo $cterminal -e "htop")スクリプトとコマンドラインで実行してそれをテストできます。

GUI端末エミュレータでスクリプトを実行するには、PPIDのPPIDを使用できます。

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

$(echo ...)最後に、コマンドの実行には使用しないでください。

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

関連情報