IO 重定向是为了改变默认输入、输出的位置,如默认情况下标准输出(STDOUT),标准错误输出(STDERR)都是输出到显示终端,如对标准输出、标准错误输出改变其默认输出位置,可重定向输出到指定的文件中(实际工作中经常这么使用),要重定向就要配合一些语法符号.
文件或目录的访问权限分为只读、只写、可执行三种.
修改文件权限命令:chmod、chgrp、chown.
搞懂「文件所属者更改及权限的赋予」,涉及关于 chown、chmod、chgrp 命令,结合用例零基础理解和掌握使用.
关于linux bash的重定向
所谓I/O重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件,命令,程序,或者脚本.
标准输入通常指键盘的输入
标准输出通常指显示器的输出
标准错误通常也是定向到显示器
请看以下例子,来描述一下他们的关系
#ls /dev
这个命令列出/dev目录下的所有文件,在屏幕上输出结果.
这里 /dev 就是作为命令ls的标准输入(从键盘输入),而打印在屏幕的结果就是标准输出(/dev目录中的内容)
还是回到标题,重定向就是把标准的+输入或者输出更改成其他的方式,请参看如下例子
或者等同于
#ls /dev 1filename #注意:"1"和""中间没有空格
以上命令会把命令的标准输出重新定向到一个文件filename,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 所以呢1可以省略
如果把上面例子重的""改成""则表示把输出追加到filename文件的末尾,如果文件不存在则创建它.如下
#ls /dev filename
也可以把标准错误重新定向到文件
以下命令是把标准输出和错误都定向到文件
""今天这一节代表标准输出和标准错误,这里无论是正常输出还是错误信息都写到filename中了.
重新定义标准输入,输出,和错误的文件标识符
重新定义文件标识符可以用ij命令,表示把文件标识符i重新定向到j,你可以把""理解为"取地址"
请看以下例子
同样标准输入也是可以重新定向的,请参考下面例子
# grep search-word
一般来说grep命令在给定文件中搜索字符串,以上命令把文件filename作为grep命令的标准输入,而不是从键盘输入.
前面曾经提到,系统为每一个打开的文件指定一个文件标识符以便系统对文件进行跟踪,那么默认的文件标识符是什么呢?答案是0,也就是标准输入,或者可以说从键盘输入.当然这个文件标识符也可以自己指定,请参考下面例子
命令jfilename表示把文件打开,并指明文件标识符为j
"-"表示关闭文件标识符
有关关闭文件标识符的操作请参考下面
n- 关闭输入文件标识符n 0-或- 关闭标准输入stdin n- 关闭输出文件标识符n 1-或-关闭标准输出stdout
另外还有一些其他命令,如下参考
表示把文件filename设置成空,也就是清空文件内容,如果文件不存在,则创建一个空文件,(等同于touch命令) :表示一个空输出,两个命令的唯一区别就是filename不是在所有shell都可以正常工作的.
;
用途:不挂断地运行命令.
语法:nohup Command [ Arg ... ] [ ]
无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中.
如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中.
如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用.
退出状态:该命令返回下列出口值:
否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态.
用途:在后台运行
一般两个一起用
用strace可以看到:
这个命令中实现重定向的关键系统调用序列是:
一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
文件描述符为0,小于号表示数据由文件流入命令
usage:
命令 file
#加入输入重定向,对输入文件进行计数
wc -l /etc/passwd
文件描述符为1,大于号表述数据由命令流入文件
所以: echo "hello" t.log 也可以写成 echo "hello" 1 t.log
会把文件的内容清空,再输入到新的文件
会把当前内容保持不变,然后在下一行进行追加
无论内容正确还是错误都会把文件输出到文件中.
默认情况下, command file 将stdout 重定向到 file, command file 将stdin 重定向到 file.
如果希望 stderr 重定向到 file,可以这样写:
如果希望 stderr 追加到 file 文件末尾,可以这样写:
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
如果希望对 stdin 和 stdout 都重定向,可以这样写:
含义:将标准错误输出 重定向到 标准输出.
符号是一个整体,不可分开,分开后就不是上述含义了.