当たり前なのかもですが (& よくわかってないので迂遠な使い方かもですが) 最近ようやくttyの使い方に気づいたのでメモっておきます。
ターミナルエミュレーターやコンソールでttyってやるとその端末のデバイスファイルが出るわけですが、当然、それに対してechoなどするとそっちに行くわけです。
これ便利だな〜と思いますがイマイチ使いドコロが分からなかったのです、というのも他の端末のウィンドウから特定の端末のウィンドウのttyを知る方法が無いような気がしたわけです。
そこで思いつきました!xfce4-terminalでは(あと他のターミナルでも)-eとかで起動時コマンドを受け付けるわけですよ。
だからデバッグ対象のソフトを立ち上げる前に、xfce4-terminalを立ち上げて起動時にtty > /tmp/ユニークなファイル名 して、それでそのファイルをcat ユニークなファイル名
で変数に受けて、
デバッグ対象のソフト > ユニークなファイル名 2&1
とするとそのソフトの出力が全部そっちにいってprintデバッグですごい便利じゃないですか?
さらにwmctrlを使って、自動でその端末の画面をサブモニタに飛ばしてしまえば超便利だ!!
こんな面倒なことをせず、最初から元のサブモニタに端末を置いて、そっちで起動するというのも最初に思いつきましたが、これだとターゲットのプログラムもサブモニタ側で起動しちゃうのでよろしくないわけです。WMにもよるんでしょうけど…
って今思ったけどターゲットのプログラムをwmctrlでプライマリに飛ばすのもアリか…(汗
そんなわけでMyPaint開発で使ってるシェルスクリプトがこちら
#!/bin/sh branch="my_build" std_err="2>&1" #====================# while [ "$1" != "" ];do case $1 in -b | --branch) branch=$2 shift 1 ;; -c | --current-branch) branch="CURRENT" ;; -e | --no-std-error) std_err="" ;; -o | --remain-open) remain_open=1 ;; * ) echo $1 is unrecognized option ;; esac shift 1 done #--------------------# INSTALLDIR=$HOME/python/others/mypaint_src/mypaint curdate=`date +"%y%m%d-%H%M%S"` cd $INSTALLDIR if [ "$branch" != "CURRENT" ];then result=`git branch | grep "\* ${branch}"` echo $result if [ "$result" = "" ];then shownotify -t mmypaint -m "mypaintのブランチが${branch}ではありません" exit 1 fi fi ttyfile=/tmp/mypaint_${curdate}_tty title=my_mypaint_${curdate} # launch terminal emulator. xfce4-terminal -e "bash -c \"tty > ${ttyfile}\";bash" -H --title="$title" # move terminal window wmctrl -r $title -e 0,1920,-1,-1,-1 ./mypaint > `cat $ttyfile` 2>&1 rm $ttyfile if [ "$remain_open" != "" ];then wmctrl -c $title fi
なんか書き方がださいというか恥ずかしい気もしますがなんというか備忘録的なモノとして…
ちなみに、この手法では何故かpudbとかncurses使ったソフトは2>&1するとアカンっぽい?(なんで?)