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 ),幸运的是,题目数据只给出了可行的路
过去一直以为
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 admin under
BASH, Linux, Programming
No Comments »

