Archive for the 'BASH' Category

11th Aug 2007

两个小东西: screen 包装脚本 和 GUI 程序启动器

screen 包装脚本, 根据具体情况决定 screen 的启动方式.
Multi display mode 很好玩的说.

#!/bin/sh
# A wrapper for screen,

RUN_DIR='/var/run/screen/S-bigsnake-net'
SCREEN_COMMAND=`which screen`

if ! which screen >/dev/null ; then echo "screen not found" ; exit 1; fi

if [ $# -gt 0 ] ; then
    exec $SCREEN_COMMAND "$@"
else
    if [ -d $RUN_DIR ] ; then
        case `ls $RUN_DIR|wc -l` in
            0)
            exec $SCREEN_COMMAND
            ;;
            1)
            exec $SCREEN_COMMAND -x
            ;;
            *)
            exec $SCREEN_COMMAND -R
            ;;
        esac
    else
        exec $SCREEN_COMMAND
    fi
fi

在 X 终端启动 GUI 程序的小脚本, 其实压住输出和使之后台运行

#!/bin/sh

if  [ $# -gt 0 ] && which $1 > /dev/null ; then
    exec $@ 1>/dev/null 2>/dev/null &
else
    echo -e "gui - A GUI program wrapper.\nUsage: gui COMMAND [OPTION]..."
fi

Posted by Posted by admin under Filed under BASH, Linux, Programming Comments No Comments »

04th Jul 2007

方便的 屏幕截图 -> 贴图 脚本

在 IRC 上贴大段文字有 nopaste, 但贴屏幕截图就比较麻烦.. 于是我就利用前面的 imageshack 脚本写了一个脚本:

依赖: imgshack, scrot, xsel, softbeep(如果你想替换 scrot 的 beep 的话), 还有提示音需要的播放器和声音文件

代码:

#!/bin/sh
# a screen shot script.

PLAYER="aplay" # or esdplay ...
NOTICE_START="/usr/share/sounds/pidgin/receive.wav"
NOTICE_END="/usr/share/sounds/pidgin/send.wav"
IMGFILE="/tmp/shot-`date +%Y%m%d%H%M%S`.jpg"

$PLAYER "$NOTICE_START"
if softbeep scrot -s "$IMGFILE"; then
    (
    echo foo;
    SHOT_URL=`imgshack "$IMGFILE"`;
    echo $SHOT_URL > ${IMGFILE%%jpg}url.txt;
    echo -n $SHOT_URL | xsel # for middle click
    # echo -n $SHOT_URL | xsel -b # for ctrl-v
    )|zenity --progress --text "Uploading ... " --pulsate --auto-close
fi
$PLAYER "$NOTICE_END"

用法: 运行之(或者绑到快捷键, 这样更方便), 听到第一声提示声, 在屏幕上拖框框, 听到第二声提示声(scrot的提示声), 稍等片刻会听到第三声提示声, 此时截图的 URL 已经复制到剪贴板, 可以用中键粘到任何地方.

如果运行了后想取消截图,在拖框框前按 Esc 即可.

Posted by Posted by admin under Filed under BASH, Linux, Programming Comments No Comments »

21st May 2007

换来换去

过去一直以为

foo | bar

bar <(foo)

是一样的,但最近才知道并非如此.

看以下两个命令的输出区别:

bigsnake-net@bigsnake-host:~$ echo <(echo foo)
/dev/fd/63
bigsnake-net@bigsnake-host:~$ echo foo | echo
(a new line)

查了bash的man,发现原来是这样:

<(foo)

就是在一个子shell中运行foo,并用括号中命令的stdout的文件标识替换<(foo),换句话说,这是一个参数替换.

这个代码可以更清楚的显示这一点:

bigsnake-net@bigsnake-host:~$ cat - <(echo bar)
foo(press Enter here)
foo(press Ctrl-D here)
bar

此外还有很多这一类的替换

替换成 foo 的 stdin 标识符:

>(foo)

替换成 foo 的 stdin 输出,跟`foo` 差不多,但可以嵌套:

$(foo)

如果是

$(cat file)

那么等价的

$(< file)

会更高效

加上某些特别命令的帮助我们可以让输入输出流跑来跑去,例如用tee可以将一个标准输入发送到多个命令:

bigsnake-net@bigsnake-host:~$ cat report | tee >(file - > a ) | tee >(wc -l > b ) | tee >(grep '0' - > c ) |cat > /dev/null
bigsnake-net@bigsnake-host:~$ cat a
/dev/stdin: UTF-8 Unicode text
bigsnake-net@bigsnake-host:~$ cat b
41
bigsnake-net@bigsnake-host:~$ cat c
              0 如果X不需执行
如果操作串数量比较小,这个方法可行.但操作串数目最多达100000,所以要作优化
实际上,此图极其稀疏 ( 500000/(10000*10000)=0.005 ),幸运的是,题目数据只给出了可行的路

Posted by Posted by admin under Filed under BASH, Linux, Programming Comments No Comments »

29th Apr 2007

Bash补全bug fix

来源: http://forum.ubuntu.org.cn/viewtopic.php?t=43304

一般来说,source 了 /etc/bash_completion 后即可使用bash强大的补全功能.但在某些情况下,补全功能会意外的失效

for example:

sudo mv foo/bar\ z/<tab>

如果”bar z”下还有东西,就不能自动补全.

解决方法:
修改 /etc/bash_completion 文件,把 _command 函数里的

# split current command line tokens into array
COMP_WORDS=( $cline )

改成

# split current command line tokens into array
for (( i=1 ; i

Posted by Posted by admin under Filed under BASH, Linux Comments No Comments »

27th Apr 2007

彩色Shell

添加以下代码到 ~/.bashrc 尾部

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
linux)
    PS1='${debian_chroot:+($debian_chroot)}\[33[01;36m\]\u\[33[00m\]@\[33[01;32m\]\h\[33[00m\]:\[33[01;33m\]\w\[33[01;39m\]\$\[33[00m\] '
    ;;
xterm)
    PS1='${debian_chroot:+($debian_chroot)}\[33[01;36m\]\u\[33[00m\]@\[33[01;32m\]\h\[33[00m\]:\[33[01;33m\]\w\[33[01;39m\]\$\[33[00m\] '
    ;;
*)
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    ;;
esac

(注:修改了一下,把@的粗体去掉了,所以跟下面的图会有细微差异)

这样就有漂亮的彩色shell了

测试颜色代码可以用这个脚本

#!/bin/sh
############################################################
# Nico Golde <nico(at)ngolde.de> Homepage: http://www.ngolde.de
# Last change: Mon Feb 16 16:24:41 CET 2004
############################################################

for attr in 0 1 4 5 7 ; do
    echo "----------------------------------------------------------------"

    printf "ESC[%s;Foreground;Background - \n" $attr
    for fore in 30 31 32 33 34 35 36 37; do
        for back in 40 41 42 43 44 45 46 47; do
            printf '33[%s;%s;%sm %02s;%02s  ' $attr $fore $back $fore $back
        done
    printf '\n'
    done
    printf '33[0m'
done

更多信息参考
http://www.linuxfocus.org/ChineseGB/May2004/article335.shtml

Posted by Posted by admin under Filed under BASH, Linux Comments No Comments »