4. I/O 重定向(参考)
- 基础概念
- 常用fd: 0(stdin), 1(stdout), 2(stderr)
- 0 是 < 的默认值,因此 < 与 0<是一样的;同理,> 与 1> 是一样的;
- exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除,。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。
- 基本I/O
-
cmd > file 把 stdout 重定向到 file 文件中
cmd >> file 把 stdout 重定向到 file 文件中(追加)
cmd 1> file 把 stdout 重定向到 file 文件中
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中
cmd 2> file 把 stderr 重定向到 file 文件中
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
cat <>file 以读写的方式打开 file
cmd < file cmd 命令以 file 文件作为 stdin
cmd << delimiter Here document从 stdin 中读入,直至遇到delimiter 分界符 - 一个here document就是一段带有特殊目的的代码段.
它使用I/O 重定向的形式将一个命令序列传递到一个交互程序或者命令中, 比如ftp,cat或者ex文本编辑器.
- 进阶I/O
- i>&j 重定向文件描述符i到j, 指向i文件的所有输出都发送到j.
>&n 复制文件描述符n 并把结果用作标准输出(dup(2), 相当于1>&n)
<&n 标准输入复制自文件描述符n
<&- 关闭标准输入
>&- 关闭标准输出
n<&- 表示将 n 号输入关闭
n>&- 表示将 n 号输出关闭 - 2>&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)
- 注意:普通cmd命令的cmd n>&n 和exec n>&n 是有区别的:
exec 0 exec 1>outfilename # 打开文件outfilename作为stdout
exec 2>errfilename # 打开文件 errfilename作为 stderr
exec 0<&- # 关闭 FD0
exec 1>&- # 关闭 FD1
exec 5>&- # 关闭 FD5 - example:
- (ls yes.txt 2>&1;ls no.txt 2>&1) 2>&1|egrep \* >file ##其中()中是一个subshell,在()中的两个命令可以看作一个命令,这里stdout 和stderr 都通过管道送给egrep了.
- exec 3>&1;exec 4>&1
ss=$(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 4>&1)
exec 3>&-;exec 4>&- ##其实这里egrep并没得到任何东西
- cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
- cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
- cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。
- Here string
- here string可以看成是here document的一种定制形式.
除了COMMAND <<<$WORD, 就什么都没有了,
$WORD
将被扩展并且被送入COMMAND
的stdin中. - example:
#!/bin/bash
strings="this is a string of words" read -r -a words <<< "$strings" echo "array words:" echo "${words[0]}, ${words[1]}, ${words[5]}"
exit 0
|
5. expr
- expr命令将把一个算术表达式作为参数,通常形式如下: expr [数字] [操作符] [数字]
- 由于Shell是按字符形式存储变量的,所以用户必须保证参加算术运算的操作数必须为数值。下面是有效的算术操作符:
- + 两个整数相加
- 第一个数减去第二个数
* 两整数相乘
/ 第一个整数除以第二个整数
% 两整数相除,取余数
- example: i=9;expr $i + 8 ##17
- expr 5 \* 6 + 9 ##39, 注意,运算符两边要有空格,而且*要转义!
6. ubuntu中各bash配置文件区别
etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
(ubuntu中并没有该文件)
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
该文件被读取.
在这个里面设置的环境变量仅仅对从终端启动的程序有用。
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.
~/.profile: 只有再这里面设置环境变量才对图形界面启动的程序有用 (用于登录shell的执行,在ubuntu中有用)
具体的可以看以上每个配置文件的说明
阅读(1157) | 评论(0) | 转发(0) |