第二十八章 关于zeros和nulls
/dev/zero 和 /dev/null
使用/dev/null
把/dev/null 看作"黑洞"。它非常等价于一个只写文件。所有写入它的内容都会永远丢失。 /dev/null 对命令行和脚本都非常的有用。
禁止标准输出
cat $filename >/dev/null
#文件内容丢失,而不会输出到标准输出.
禁止标准错误
rm $badname 2>/dev/null
#这样错误信息[标准错误]就被丢到黑洞了.
禁止标准输出和标准错误输出
cat $filename 2>/dev/null >/dev/null
#如果"$filename"不存在,将不会有任何错误信息提示.
#如果"$filename"存在, 文件的内容不会打印到标准输出.
#当只想测试命令的退出码而不想有任何输出时非常有用.
cat $filename &>/dev/null
删除一个文件的内容,但是保留文件本身和所有的文件权限
cat /dev/null > /var/log/messages
# : > /var/log/messages 有同样的效果,但不会产生新的进程。(因为:是内建的)
Example 28-1 隐藏cookie而不再使用
#!/bin/bash
#
if [ -f ~/.netscape/cookies ];then
rm -f ~/.netscape/cookies
fi
ln -s /dev/null ~/.netscape/cookies
#现在所有的 cookies 都会丢入黑洞而不会保存在磁盘上了.
使用/dev/zero
像/dev/null 一样,/dev/zero 也是一个伪文件,但它实际上产生连续不断的 null 的流 (二进制的零流,而不是 ASCII 型的)。写入它的输出会丢失不见,而从/dev/zero 读出一连串的 null 也比较困难,虽然这也能通过 od 或一个十六进制编辑器来做到。/dev/zero 主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。
Example 28-2 用/dev/zero创建一个交换临时文件
#!/bin/bash
#
ROOT_UID=0
E_WRONG_USER=65
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
if [ "$UID" -ne "$ROOT_UID" ];then
echo; echo "You must be root to run this script."; echo
exit $E_WRONG_USER
fi
block=${1:-$MINBLOCKS}
if [ "$block" -lt "$MINBLOCKS" ];then
block=$MINBLOCKS
fi
echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks
mkswap $FILE $blocks
swapon $FILE
echo "Swap file created and activated."
exit 0
Example 28-3 创建ramdisk
#!/bin/bash
#
#"ramdisk"是系统RAM内存的一段,它可以被当成是一个文件系统来操作。
#它的优点是存取速度非常快,缺点是易失性,当计算机重启或关机时会丢失数据
E_NON_ROOT_USER=70
ROOTUSER_NAME=root
MOUNTPT=/mnt/ramdisk
SIZE=2000
BLOCKSIZE=1024
DEVICE=/dev/ram0
username=`id -nu`
if [ "$username" != "$ROOTUSER_NAME" ];then
echo "Must be root to run \"`basename $0`\"."
exit $E_NON_ROOT_USER
fi
if [ ! -d "$MPUNTPT" ];then
mkdir $MOUNTPT
fi
dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE
mke2fs $DEVICE
mount $DEVICE $MOUNTPT
chmod 777 $MOUNTPT
echo "\"$MOUNTPT\" now available for use"
exit 0