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
在 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 即可.
过去一直以为
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 ),幸运的是,题目数据只给出了可行的路
来源: 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
添加以下代码到 ~/.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