Chinaunix首页 | 论坛 | 博客
  • 博客访问: 641897
  • 博文数量: 227
  • 博客积分: 8017
  • 博客等级: 中将
  • 技术积分: 2069
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-08 22:50
文章分类

全部博文(227)

文章存档

2011年(10)

2010年(55)

2009年(28)

2008年(134)

我的朋友

分类: LINUX

2008-05-12 10:11:03

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将被扩展并且被送入COMMANDstdin中.
      • 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) |
给主人留下些什么吧!~~