过去一直以为
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 ),幸运的是,题目数据只给出了可行的路
5月 12th, 2007
8:09 下午
未分类
近日从XChat转到了IRSSI,命令行真是强大...
有消息时响铃,设置 beep 和 bell 的相关选项
awaylog功能可以在你unaway时打出你away时收到的信息
支持滚屏,log,自动登录,高亮等等
详情参看http://irssi.org/

5月 12th, 2007
1:47 下午
Linux
很长时间以来我都在使用xmms这个短小精悍的播放器,虽然有乱码的情况但也不难解决.最近心血来潮尝试了它的第二代:XMMS2.发现虽然没有XMMS这个老东西成熟,但也是很不错的.
XMMS2的源码deb包很容易就Google到,这里就不详述安装了.
由于XMMS2是个C/S程序(音乐播放器弄成C/S..是不是有点变态了),所以有很多的客户选择,但尝试了几个,觉得还是自带的CLI客户端好用,这里是几钟最常用的命令
播放: xmms2 play
停止: xmms2 stop
列出列表: xmms2 list
加入列表: xmms2 add <path>
退出: xmms2 quit
其他的就自己man吧
xmms2有个addpls的加载列表功能,但是并不好用(在我这里出错,可能是某些我不知道的问题),我就用这个来代替:
cat playlist | xargs -I '{}' xmms2 add "{}"
花花提供了另一种方法..分割行很有用:
cat playlist | while read e; do xmms2 add "$e"; done
更多的设置可以使用
xmms2 config <key> <value>
例如我就改了这些设置项
playlist.repeat_all = 1
playlist.repeat_one = 0
output.buffersize = 65536
更多设置项可以用xmms2 config_list查询
此外xmms2虽然有循环播放的功能(playlist.repeat_all = 1),但我找不到乱序播放的选项,虽然有 xmms2 shuffle 的打乱列表命令,但只能手动执行,所以我又写了个脚本:
#!/bin/bash
#
# xmms2-shuffle, shuffle the playlist of xmms2 automatically.
#
while [[ "" != $(ps -e|grep 'xmms2d') ]] ; do
xmms2 shuffle;
#(date;xmms2 list)>> /home/bigsnake-net/MyMusic/xmms2shu.log ; # debug code
$(xmms2 list|tail -1|tr -d ' '|awk -F: '{ print "export Total_Hour="$2 " Total_Minute="$3}');
Total_Minute=$((60 * ${Total_Hour} + ${Total_Minute}));
if ([[ ${Total_Minute}
然后在在xmms2的启动脚本(~/.config/xmms2/startup.d/)和退出脚本(~/config/xmms2/shutdown.d/)加入相应的启动和杀死脚本即可:
.config/xmms2/startup.d/xmms2-shuffle-start.sh
#!/bin/sh
exec ~/bin/xmms2-shuffle
.config/xmms2/shutdown.d/xmms2-shuffle-kill.sh:
#!/bin/sh
killall -9 xmms2-shuffle
看这段代码:
if maxmin[i]<maxmin[ord(caplist[1])] then
begin
caplist:=chr(i);
end;
if maxmin[i]=maxmin[ord(caplist[1])] then
caplist:=caplist+chr(i);
程序的本意是维护一个最优值列表,两个if语句貌似是不可能都执行的,但事实并非如此.
当进入第一个if,caplist被修改后,maxmin[i]=maxmin[ord(caplist[1])]明显成立,所以也会进入第二个if.
问题在于if块中的操作可能会改变判断的条件,因此,遇到这种情况时最好加上else,保证不会进入到多个if块.
if maxmin[i]<maxmin[ord(caplist[1])] then
begin
caplist:=chr(i);
end else
if maxmin[i]=maxmin[ord(caplist[1])] then
caplist:=caplist+chr(i);
不满gnome终端太慢,安装了rxvt
sudo apt-get install rxvt-unicode-ml
配置文件 ~/.Xresources
rxvt.scrollBar_right: True
rxvt.geometry: 80x32
rxvt.font: xft:Courier:size=10,xft:NSimsun:size=12
rxvt.background: black
rxvt.foreground: white
rxvt.cursorBlink: true
rxvt.saveLines: 10000
rxvt.color12: #AAAAFF
rxvt.cursorColor: orange
rxvt.termName: rxvt
