2012-07-09 65 views
4

我正在編寫一個腳本來自動化工作環境準備。 我需要打開4個終端窗口,排列它們並在其中的每個窗口中執行命令。`xdotool類型` - 隨機重複字符

它的工作原理,但有時我得到討厭失敗 - xdotool type隨機重複一些字符

rvm use [email protected] && rails c 
~/my_src/ruby_apps/ro > rvm use [email protected] && rails c 
ruby-1.99999999999999999999999999999999.3-p194 is not installed. 
To install do: 'rvm install ruby-1.99999999999999999999999999999999.3-p194' 
~/my_src/ruby_apps/ro > 

或在其他窗口:

tail -fn 100 looooooog/thin.0.log 
~/my_src/ruby_apps/ro > tail -fn 100 looooooog/thin.0.log 
tail: could not open «looooooog/thin.0.log» for reading: No such file or directory 
tail: no more files 
~/my_src/ruby_apps/ro > 

我想這取決於CPU加載,因爲我有非常大的ATOM處理的.bashrc,並且在腳本處理過程中它的負載很高。

我在腳本中使用waitsleepopen_lxterminal_execute_hold()函數調用的特殊順序先執行簡單的簡單命令。這可以最大限度地減少錯誤,但不會阻止它們。

無論CPU負載如何,你會如何獲得穩定的結果?同樣可以擺脫sleep也很好。

#!/bin/bash 
# 
# prepares work environment for rails project 

# Opens lxterminal with title if windows with such title 
# doesn't exist, executes command and stays open. 
# Otherwise does nothing. 
# 
function open_lxterminal_execute_hold(){ 
    local winid=`xwininfo -name $title 2>/dev/null |grep 'Window id:' |cut -d" " -f4` 
    if [ -n "$winid" ]; then 
    echo "Window for title '$title' exists with '$winid'" 
    else 
    lxterminal -t $title 
    sleep 1 
    wmctrl -i -a "$winid" # bring the window to front, activate 
    wait 
    xdotool type "$command" 
    wait 
    xdotool key Return # run the command 
    wait 
    fi 
} 

pkill devilspie 
cd ~/my_src/ruby_apps/ro # TODO param 
title='rails-commandline';  command='ls';         open_lxterminal_execute_hold 
title='rails-development.log'; command='tail -fn 100 log/development.log';  open_lxterminal_execute_hold 
title='rails-user_case';  command='tail -fn 100 log/thin.0.log';   open_lxterminal_execute_hold 
sleep 5 
title='rails-console';   command='rvm use [email protected] && rails c'; open_lxterminal_execute_hold 
/usr/bin/devilspie -a 2>/dev/null & # arrange windows 

UPDATE 如何防止xdotool重複charatcers?

回答

2

這裏是另一種解決方案,測試和我的Ubuntu 11.04系統上工作:

#!/bin/bash 

function open_lxterminal_execute_hold() { 
    xwininfo -name $1 > /dev/null 2>&1 
    if [ $? -eq 0 ]; then 
    echo "Window for title '$1' already exists" 
    else 
    t=$(tempfile) 
    echo ". ~/.bashrc" > $t 
    echo "$2" >> $t 
    lxterminal -t $1 -e "$SHELL --rcfile $t" & 
    fi 
} 

#pkill devilspie 
#cd ~/my_src/ruby_apps/ro 
open_lxterminal_execute_hold 'rails-commandline' 'ls' 
open_lxterminal_execute_hold 'rails-development' 'tail -fn 100 log/development.log' 
open_lxterminal_execute_hold 'rails-user_case' 'tail -fn 100 log/thin.0.log' 
#open_lxterminal_execute_hold 'rails-console' 'rvm use [email protected] && rails c' 
#devilspie -a 2>/dev/null & 

正如你可能會注意到,我已經註釋,用於測試一些行,所以你應該刪除尾隨「」從系統上運行腳本之前的註釋行開始。
我使用的訣竅是在每個終端啓動一個帶有「--rcfile」選項的新shell。
這樣就不需要使用「xdotool」,「wait」和「sleep」命令。

+0

Enzino,謝謝您的解答。但$ SHELL在獲取--rcfile參數時不會執行〜/ .bashrc。這就是爲什麼我認爲它不如ubuntu的那麼有吸引力。 – zuba 2012-07-26 11:10:32

+0

我修改了腳本來執行〜/ .bashrc – 2012-07-26 19:06:54

+0

這種方式看起來更直,乾淨,因爲不需要.bashrc編輯。它也適用於lxterminal。謝謝Enzino,謝謝你的Ubuntu!我投票贊成該解決方案。祝你好運! – zuba 2012-07-27 08:53:44

2

這是一個避免xdotool的解決方法。從積極的一面來看,我認爲這很簡單。 不利的一面,它似乎不能與lxterminal一起工作 - 儘管它可以與其他終端(如xterm和gnome-terminal)一起工作。

對於它的價值,這裏的理念是:

讓.bashrc的運行基礎上,title環境變量的值,相應的命令:

您可以通過添加類似下面這樣做你的.bashrc中:

case "$title" in 
rails-development.log) 
    ls 
    ;; 
rails-commandline) 
    tail -fn 100 /var/log/syslog 
    ;; 
*) 
    ;; 
esac 

然後在你的腳本,你可以使用

function open_terminal_execute_hold() { 
    local winid=`xwininfo -name $title 2>/dev/null |grep 'Window id:' |cut -d" " -f4` 
    if [ -n "$winid" ]; then 
    echo "Window for title '$title' exists with '$winid'" 
    else 
    gnome-terminal -t "$title" & 
    fi 
} 

cd /tmp # TODO param 
export title='rails-commandline' && open_terminal_execute_hold & 
export title='rails-blah' && open_terminal_execute_hold & 
export title='rails-development.log' && open_terminal_execute_hold & 

由於某種原因,lxterminal似乎只使用title的第一個值,忽略了對其值的後續更改。

+0

當我使用-e $命令終端執行命令後退出。我需要終端保持開放。 – zuba 2012-07-20 14:03:37

+0

好的,然後試試:'lxterminal -t「$ title」-e「bash -c'$ command; read -n1'」&'。我已經安裝了lxterminal來測試它;它似乎爲我工作。 – unutbu 2012-07-20 15:16:14

+0

我看,它等待按鍵,然後關閉。我需要終端保持打開。 – zuba 2012-07-22 10:29:55

0

其實我找到了anoter解決方案。我發現我從ubuntu deb軟件包中使用了2009年的舊版本。我從源代碼安裝的最新版本xdotool允許一個新的命令行參數--delay <value>,如果與0 --delay 0一起使用可以防止重複字符。所以功能看起來如下:

function open_lxterminal_execute_hold(){ 
    local winid=`xwininfo -name $title 2>/dev/null |grep 'Window id:' |cut -d" " -f4` 
    if [ -n "$winid" ]; then 
    echo "Window for title '$title' exists with '$winid'" 
    else 
    lxterminal -t "$title" 
    sleep 1 
    wmctrl -i -a "$winid" 
    xdotool type --delay 0 "$command" 
    xdotool key Return 
    fi 
} 

祝你好運傢伙!

0

您可以改爲使用xte命令行工具。它做同樣的工作,但沒有隨機密鑰粘性。