1. I/O重定向
在命令行下,我们使用echo命令输出变量或字串到屏幕,如:
echo Hello World
就会在屏幕输出:Hello World!
echo $HOME
就会将当前用户的根目录输出到屏幕
而I/O重定向就是重新定义输入输出的接受端,这个接收端可以为其他终端,文件或者应用程序
例如:
echo Hello World > hello.txt
就会将Hello World这个字串写入当前目录下名为Hello的txt文件中,注意,如果该目录下已存在该文件,那么它将被重写。
如何将echo参数输出到应用程序呢?下面我们来看一个实例
输入以下程序:
/*******say.c*********/
#include <stdio.h>
#include <malloc.h>
int main()
{
char *str;
str=(char *)malloc(100);
scanf("%s",str);
printf("%s/n",str);
exit(0);
}
编译链接:
cc -o say say.c
这样在当前目录下就生成了可执行文件say,然后输入以下命令:
echo Hello World | ./say
于是屏幕上就输出了:Hello
因为scanf函数以空格分隔扫描参数,所以输出的只有Hello字串。上面我们用到了“|",这种技术称为管道技术,后面我会详细讲解。
事实上,应用程序也可以从文件中接受输入参数。输入以下命令:
./say < hello.txt
我们可以看到与上面同样的结果。
下面的命令类似:
ls | ./say
ps |./say
whoami|./say
我们还可以直接将Shell命令的执行结果输出到文件,如:
ls -l >lsdir.txt
ps -ef >psproc.txt
grep main *.c > gmain.txt
将文件内容输出到屏幕:
more<hello.c
上面我们通过”<“操作符定向输入,”>"操作符定向输出,在Linux中还提供了一些文件描述符辅助我们定向输入输出,如:
0 标准输入
1 标准输出
2 标准出错
举例:
rm lsdir.txt psproc.txt gmain.txt >rmsus.txt 2>rmerr.txt
使用rm命令删除文件时,如果文件不存在就会保错,上面的命令我们将错误信息输出到rmerr.txt这个文件中。
cc -o say say.c >clog.txt 2>&1
上面的命令将标准输出和错误信息都输出到clog.txt这个文件中
ps -ef >> file.txt
上面的命令将输出信息添加到file.txt文件末尾
值得注意的是,在Linux中还有一个空设备/dev/null,任何写到该设备的内容都会被丢弃,如果我们不希望我们的结果有输出,即可将输出定向到这个设备,如:
cc -o say say.c >/dev/null 2>&1
2. 管道技术
在linux中可以利用管道技术来连接不同的进程,例如:
ls -l|grep -v '^d' 列出当前目录下所有非目录文件的详细信息
ps -ef|grep '^root' 列出系统中所有root进程的详细信息
ps|sort|more 列出排序后的用户进程
ps -ef|sort >proc.txt 将当前所有进程排序后输出到文件proc.txt