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