ksh I/O

-- Start

ksh 支持如下 I/O。

重定向          描述
> file        标准输出到文件,文件存在则替换
>> file       标准输出到文件,文件存在则添加到末尾
< file        从文件到标准输入
<> file       以读写模式打开文件
cmd1 | cmd2   管道; 把 cmd1 的标准输出作为 cmd2 的标准输入
>| file       Force standard output to file even if noclobber is set
<< label      Here-document
<<- label     Here-document variant
<<< label     Here-string
n> file       把文件描述符 n 输出到文件(1是标准输出,2是标准错误输出)
n< file       输入文件描述符 n (0是标准输入)
<&n           从文件描述符 n重复标准输入
>&n           重复标准输出到文件描述符 n
<&n-          把文件描述符 n作为标准输入
>&n-          把文件描述符 n作为标准输出
<&-           关闭标准输入
>&-           关闭标准输出
|&            Background process with I/O from parent shell
n<&p          Move input from coprocess to file descriptor n
n>&p          Move output to coprocess to file descriptor n

大家对 > file, >> file, < file 和 cmd1 | cmd2 应该都很熟悉, 只要懂一点 Linux 的人不可能没用过。 n> file 和 >&n 看上去挺陌生,其实你肯定也用过,看看下面的命令吧,是不是很熟悉。

cmd > t.log 2>&1
什么是 Here-document (<< label,<<- label) 呢?你肯定也用过,只是不知道它的名字而已。看看下面的代码吧。

#!/bin/ksh

user="[email protected]";

#  << label
mail $user << EOF
Hi $user,

This is a test mail, please ignore.

Regards
EOF


#  <<- label 会忽略前面的 TAB,使代码可读性更好
mail $user << EOF
		Hi $user,
		
		This is a test mail, please ignore.
		
		Regards
		EOF


什么是 Here-string 呢?看看下面的代码吧。

#!/bin/ksh

user="[email protected]";
text="this is a test mail.";

# 使用管道
print $text | mail $user;

#  <<< label
mail $user <<< $text;

通常,Linux 命令只接受一个输入和一个输出,但是通过下面的方式,我们可以接受多个输入和多个输出。

cmd  <(input) <(input)
cmd  >(output) >(output)

下面是一个简单的例子。

#!/bin/ksh  

# 将原始数据test.txt,1)排序后输出test.txt.sort 2) 取第二列输出test.txt.id 3) 保存原始数据 test.txt.raw
cat test.txt | tee >(sort | uniq > test.txt.sort) >(cut -d, -f2 test.txt > test.txt.id) > test.txt.raw


-- 更多参见:ksh 精萃

-- 声 明:转载请注明出处

-- Last Updated on 2015-10-10
-- Written by ShangBo on 2015-10-05
-- End



你可能感兴趣的:(shell,ksh)