web-dev-qa-db-ja.com

新しいターミナルウィンドウでスクリプトを実行する

現在のウィンドウを使用可能な状態に保ちながら、親スクリプトとは別のスクリプトを別のターミナルウィンドウで実行したいと考えています。

これの背後にある理由は、ディレクトリの変更が行われたときに監視する監視スクリプトをユーザーが実行できるようにすることです。

これは私の機能です

function watchFunction ()
{
  ./watch.sh &
}    

ただし、これは現在のウィンドウのバックグラウンドでのみ実行され続けます。

Linuxディストリビューションが原因で、次のいずれも使用またはインストールできません。genone-terminal; xterm;スクリーン; konsole;端末またはその他のインストール可能なツール!

私がbashスクリプトから始めたばかりなので、どんなアドバイスでも素晴らしいでしょう!

スクリプトからの出力を監視したいだけの場合は、スクリプトからの出力をファイルにリダイレクトし、そのファイルを別のウィンドウで監視できます。

# Run the script and log all output to a file
./watch.sh &> /var/log/watch.log &

# Watch the file, possibly in another terminal window
tail -f /var/log/watch.log

私の経験では、この動作(ログファイルへの書き込み)はかなり典型的です。他のターミナルウィンドウを起動し始めたコマンドラインアプリケーションを使用したことはありません。

つまり、コマンドラインから新しいターミナルウィンドウを本当に開きたい場合は、ターミナルアプリケーションによって異なります。これについては、AskUbuntu StackExchangeサイトに良い投稿があります。

特に この答え を参照してください。たとえば、Gnome端末の場合、次のようなコマンドを使用できます。

gnome-terminal -x sh -c "./watch.sh; bash"

使用されているターミナルアプリケーションをプログラムで確認する場合は、次のAskUbuntuの投稿を参照してください。

そこで受け入れられているソリューションは、次の関数を定義しています。

which_term(){
    term=$(Perl -lpe 's/\0/ /g' \
           /proc/$(xdotool getwindowpid $(xdotool getactivewindow))/cmdline)

    ## Enable extended globbing patterns
    shopt -s extglob
    case $term in
        ## If this terminal is a python or Perl program,
        ## then the emulator's name is likely the second 
        ## part of it
        */python*|*/Perl*    )
         term=$(basename "$(readlink -f $(echo "$term" | cut -d ' ' -f 2))")
         version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
         ;;
        ## The special case of gnome-terminal
        *gnome-terminal-server* )
          term="gnome-terminal"
        ;;
        ## For other cases, just take the 1st
        ## field of $term
        * )
          term=${term/% */}
        ;;
     esac
     version=$(dpkg -l "$term" | awk '/^ii/{print $3}')
     echo "$term  $version"
}
2
igal

コメントのとおり、xfce4-terminalを使用しています。 man page から、次のオプションを確認できます

−x, −−execute
Execute the remainder of the command line inside the terminal

したがって、これを./watch.shの前に追加するだけです。

function watchFunction ()
{
  xfce4-terminal -x ./watch.sh &
}  
1
Sparhawk

ええ、私はそれをスクリプトで行いました。コマンドを実行する前に、ターミナルウィンドウを起動する必要があります。

xterm -e sh -c path/yo/your/script &;

私が書いたスクリプトでは、次のようなものを使用しています。

terminal="xterm"

run () {
    cmd="$terminal -e sh -c $1"
    [ -n "$1" ] && (eval "$cmd") > /dev/null 2>&1 &
}

run $VISUAL example/file/name

それはあなたのプログラムを実行するターミナルを起動します。また、最初の端末が新しいウィンドウからstderr/stdoutメッセージでいっぱいになるのを防ぎます。

terminal変数を、使用する/好きな変数に置き換えるだけです。

0
Luis Lavaire