linux 中 /dev/zero和/dev/null的区别

来源:互联网 发布:电脑绑定域名 编辑:程序博客网 时间:2024/06/16 03:13
使用/dev/null
 
  把/dev/null,它是空设备.看作"黑洞",它非常等价于一个只写文件,所有写入它的内容都会永远丢失.而尝试从它那儿读取内容则什么也读不到.然而/dev/null对命令行和脚本都非常的有用.

  一些实例

  禁止标准输出

  1 cat $filename >/dev/null
  2 # 文件内容丢失,而不会输出到标准输出.
 
  禁止标准错误

  1 rm $badname 2>/dev/null  #这样错误信息[标准错误]就被丢到太平洋去了.
 
  禁止标准输出和标准错误的输出

  1 cat $filename 2>/dev/null >/dev/null
  2 # 如果"$filename"不存在,将不会有任何错误信息提示.
  3 # 如果"$filename"存在, 文件的内容不会打印到标准输出.
  4 # 因此Therefore, 上面的代码根本不会输出任何信息.
  5 # 当只想测试命令的退出码而不想有任何输出时非常有用。
    6 # cat $filename &>/dev/null
 
  自动清空日志文件的内容

  1 cat /dev/null > /var/log/messages
  2 #:> /var/log/messages   有同样的效果, 但不会产生新的进程。(因为:是内建的)
  3 cat /dev/null >/var/log/wtmp

  隐藏cookie而不再使用

  1 if [ -f ~/.netscape/cookies ]  # 如果存在则删除.
  2 then
  3   rm -f ~/.netscape/cookies
  4 fi
  5 
  6 ln -s /dev/null ~/.netscape/cookies
  7 # 现在所有的cookies都会丢入黑洞而不会保存在磁盘上了.
 
  使用/dev/zero

  像/dev/null一样,是一个输入设备。/dev/zero也是一个伪文件,但它实际上产生连续不断的null的流(二进制的零流,而不是 ASCII型的)。写入它的输出会丢失不见,而从/dev/zero读出一连串的null也比较困难,虽然这也能通过od或一个十六进制编辑器来做到。 /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.

  一些实例

  用/dev/zero创建一个交换临时文件

  1 #!/bin/bash
  2 # 创建一个交换文件.
  3 
  4 ROOT_UID=0         # Root 用户的 $UID 是 0.
  5 E_WRONG_USER=65    # 不是 root?
  6 
  7 FILE=/swap
  8 BLOCKSIZE=1024
  9 MINBLOCKS=40
  10 SUCCESS=0
  11 
  12 
  13 # 这个脚本必须用root来运行.
  14 if [ "$UID" -ne "$ROOT_UID" ]
  15 then
  16   echo; echo "You must be root to run this script."; echo
  17   exit $E_WRONG_USER
  18 fi  
  19   
  20 
  21 blocks=${1:-$MINBLOCKS}          #  如果命令行没有指定,
  22                                  #+ 则设置为默认的40块.
  23 # 上面这句等同如:
  24 # ————————————————–
  25 # if [ -n "$1" ]
  26 # then
  27 #   blocks=$1
  28 # else
  29 #   blocks=$MINBLOCKS
  30 # fi
  31 # ————————————————–
  32 
  33 
  34 if [ "$blocks" -lt $MINBLOCKS ]
  35 then
  36   blocks=$MINBLOCKS              # 最少要有 40 个块长.
  37 fi  
  38 
  39 
  40 echo "Creating swap file of size $blocks blocks (KB)."
  41 dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks  # 把零写入文件.
  42 
  43 mkswap $FILE $blocks             # 将此文件建为交换文件(或称交换分区).
  44 swapon $FILE                     # 激活交换文件.
  45 
  46 echo "Swap file created and activated."
  47 
  48 exit $SUCCESS

  创建ramdisk

  1 #!/bin/bash
  2 # ramdisk.sh
  3 
  4 #  "ramdisk"是系统RAM内存的一段,
  5 #它可以被当成是一个文件系统来操作.
  6 #它的优点是存取速度非常快 (包括读和写).
  7 #缺点: 易失性, 当计算机重启或关机时会丢失数据.
  8 #会减少系统可用的RAM.
  9 #
  10 #那么ramdisk有什么作用呢?
   11 #保存一个较大的数据集在ramdisk, 比如一张表或字典,
   12 #这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.
   13 
   14 
   15 E_NON_ROOT_USER=70             # 必须用root来运行.
   16 ROOTUSER_NAME=root
   17 
   18 MOUNTPT=/mnt/ramdisk
   19 SIZE=2000                      # 2K 个块 (可以合适的做修改)
   20 BLOCKSIZE=1024                 # 每块有1K (1024 byte) 的大小
   21 DEVICE=/dev/ram0               # 第一个 ram 设备
   22 
   23 username=`id -nu`
   24 if [ "$username" != "$ROOTUSER_NAME" ]
   25 then
   26   echo "Must be root to run ""`basename $0`""."
   27   exit $E_NON_ROOT_USER
   28 fi
   29 
   30 if [ ! -d "$MOUNTPT" ]         #  测试挂载点是否已经存在了,
   31 then                           #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了
   32   mkdir $MOUNTPT               #+ 因为前面已经建立了.
   33 fi
   34 
   35 dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE  # 把RAM设备的内容用零填充.
   36                                                       # 为何需要这么做?
   37 mke2fs $DEVICE                 # 在RAM设备上创建一个ext2文件系统.
   38 mount $DEVICE $MOUNTPT         # 挂载设备.
   39 chmod 777 $MOUNTPT             # 使普通用户也可以存取这个ramdisk.
   40                                # 但是, 只能由root来缷载它.
   41 
   42 echo """$MOUNTPT"" now available for use."
   43 # 现在 ramdisk 即使普通用户也可以用来存取文件了.
   44 
   45 #注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.
   46 #
   47 #拷贝所有你想保存文件到一个常规的磁盘目录下.
   48 
   49 #重启之后, 运行这个脚本再次建立起一个 ramdisk.
   50 #仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.
   51 
   52 #如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,
   53 #以使系统启动时能自动设立一个ramdisk.
   54 #这样很合适速度要求高的数据库服务器.
   55 
   56 exit 0

  细细品味UNIX的数据流重定向
  
  我们经常会在UNIX系统下的一些脚本中看到类似”2>&1″这样的用法,例如“/path/to/prog 2>&1 > /dev/null &”,那么它的具体含义是什么呢?
  
   UNIX有几种输入输出流,它们分别与几个数字有如下的对应关系:0-标准输入流(stdin),1-标准输出流(stdout),2-标准错误流 (stderr)。”2>&1″的意思就是将stderr重定向至stdout,并一起在屏幕上显示出来。如果不加数字,那么默认的重定向 动作是针对stdout(1)的,比如”ls -l > result”就等价于”ls -l 1 > result”。这样便于我们更普遍性的理解重定向过程。
  
  下面举例说明:

  #cat std.sh
  
  #!/bin/sh
  echo “stdout”
  echo “stderr” >&2

  #/bin/sh std.sh 2>&1 > /dev/null
  stderr

  #/bin/sh std.sh > /dev/null 2>&1

  第一条命令的输出结果是stderr,因为stdout和stderr合并后一同重定向到/dev/null,但stderr并未被清除,因此 仍将在屏幕中显示出来;第二条命令无输出,因为当stdout重定向至/dev/null后,stderr又重定向到了stdout,这样stderr也 被输出到了/dev/null。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 烧了电焊眼睛疼怎么办 用了电焊眼睛痛怎么办 烧电焊脸上红痛怎么办 眼睛让电焊晃了怎么办 眼被电焊打了怎么办 眼镜弹簧腿坏了怎么办 眼镜框铰链坏了怎么办 金属眼镜框歪了怎么办 眼镜框螺丝断了怎么办 眼镜被压变形了怎么办 金属眼镜腿断了怎么办 眼镜弹簧腿断了怎么办 眼镜腿螺丝太紧怎么办 眼镜金属柄断了怎么办 金属眼镜腿折了怎么办 眼镜腿中间断了怎么办 塑料眼镜腿断了怎么办 眼镜上的螺丝拧不紧怎么办 眼镜的把坏了怎么办 把眼镜坐坏了怎么办 梦见眼镜腿掉了怎么办 眼镜的腿掉了怎么办 眼镜腿的螺丝掉了怎么办 爱大爱眼镜掉腿了怎么办 合金眼镜腿断了怎么办 手关节复位h疼痛怎么办 我叫mt红色卡牌怎么办 星盟冲突qq登录怎么办 汽车雷达下雨一直响怎么办 火山小视频封火力怎么办 电脑被当成矿机怎么办 哥华有线机顶盒反应慢怎么办 电脑绣花机编码器坏了怎么办? 伺服电机开起没有力怎么办 西门子冰箱排水孔堵塞怎么办 数控车床西门子系统卡顿怎么办 手机系统不支持多屏互动怎么办 伺服驱动器系统错误报警怎么办 防雷接地电阻不符合规范怎么办 微信支付风控了怎么办 伺服电机没有配原点开关怎么办