- Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。
一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
一、输出重定向
-
命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向。命令输出重定向的语法为:
$ command > file
-
这样,输出到显示器的内容就可以被重定向到文件。
注:如果重定向的文件不存在,则创建。 -
“>” 重定向会覆盖文件之前的内容,不想覆盖可以使用“>>”进行追加。
$ command >> file
二、输入重定向
-
和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:
$ command < file
这样,本来需要从键盘获取输入的命令会转移到文件读取内容。
三、重定向深入理解
-
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
① 标准输入文件(stdin):stdin 的文件描述符为 0,Unix 程序默认从 stdin 读取数据。
② 标准输出文件(stdout):stdout 的文件描述符为 1,Unix 程序默认向 stdout 输出数据。
③ 标准错误文件(stderr):stderr 的文件描述符为 2,Unix 程序会向 stderr 流中写入错误信
息。 -
默认情况下,command > file 将 stdout 重定向到 file,command < file 将 stdin 重定
向到 file。 -
如果希望 stderr 重定向到 file,可以这样写:
$command 2 > file
-
如果希望 stderr 追加到 file 文件末尾,可以这样写:
$command 2 >> file
2 表示标准错误文件(stderr)。 -
如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
$command > file 2>&1
或
$command >> file 2>&1
-
如果希望对 stdin 和 stdout 都重定向,可以这样写:
$command < file1 >file2
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
Here Document
Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document 是 Shell中的一种特殊的重定向方式,它的基本的形式如下:
command << delimiter
document
delimiter
它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
注意:
① 结尾的 delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空 格和 tab 缩进。
② 开始的 delimiter 前后的空格会被忽略掉。
cat << EOF
This is a simple lookup program
for good (and bad) restaurants
in Cape Town.
EOF
运行结果:
再如
#4、创建profile文件
cat<<\EOF >${ROOTFS_DIR}/etc/profile
USER="id-un"
LOGNAME=$USER
PS1='[\u@\h \w]\# '
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
EOF
注:第一行EOF
加\
是为了将document中的变量(USER、PATH)拓展开来。不然只会是一个字符USER的意思
/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向
到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,
那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到”
禁止输出“的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
四、创建根文件系统脚本 仅供参考
#!/bin/bash
#根据自己环境修改
BUSYBOX_DIR="/opt/rootfs/rootfs_test/"
CROOS_COMPILING_DIR="/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi"
ROOTFS_DIR="/opt/rootfs/rootfs_test/rootfs"
if [ ! $1 ]; then
echo "请输入一个参数:"; exit 0
fi
if [ -f $1 ]; then
echo "$1 文件存在!"
else
echo "文件不存在!"; exit 0
fi
## 解压
package_name=$1
TEMP=${package_name%.*}
dir_name=${TEMP%.*}
if [ -e ${dir_name} ]; then
echo ${dir_name} 已经存在!
elif [ ${package_name##*.} = bz2 ]; then
if [ ${TEMP##*.} = tar ]; then
tar -xvf ${package_name} -C ${BUSYBOX_DIR}
echo ${package_name} 解压成功!
else
echo ${package_name} 解压失败!
exit 0
fi
fi
cd ${BUSYBOX_DIR}/${dir_name}
## busybox配置
read -p "请输入(y/n)select to make menuconfig:" input
case ${input} in
y)make menuconfig
;;
esac
## busybox编译
read -p "请输入(y/n)select to make:" input
case ${input} in
y)
make; make install;
;;
esac
if [ -d ${CROOS_COMPILING_DIR}/lib/ ]; then
cp -rap ${CROOS_COMPILING_DIR}/lib/ ${ROOTFS_DIR}
echo ${CROOS_COMPILING_DIR}/lib/ 复制成功!
rm -rf ${ROOTFS_DIR}/lib/*.a
else
echo ${CROOS_COMPILING_DIR}/lib/ 目录不存在!
fi
arr_test(){
tmp_dir=(dev etc/init.d home proc sys root opt tmp var)
len=${#tmp_dir[*]}
echo $len
for i in `seq ${#tmp_dir[@]}`
do
echo ${tmp_dir[i-1]}
done
}
mkdir -p ${ROOTFS_DIR}/{dev,etc/init.d,home,proc,sys,root,opt,tmp,var}
file=${ROOTFS_DIR}/dev/console
if [ ! -e ${file} ];then
mknod ${file} c 5 1
fi
unset file
##############################################################################
#创建etc目录下的文件
#1、创建fstab文件
if [ ! -e ${ROOTFS_DIR}/etc/fstab ];then
cp /etc/fstab ${ROOTFS_DIR}/etc/
fi
#2、创建inittab文件
cat<<\EOF >${ROOTFS_DIR}/etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
#console:: respawn:-/bin/sh
EOF
#3、创建init.d/rcS文件
file=${ROOTFS_DIR}/etc/init.d/rcS
cat<<\EOF >${file}
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
/bin/hostname xjh
EOF
if [ -e ${file} -a -f ${file} ];then
chmod 7 ${file}
fi
unset file
#4、创建profile文件
cat<<\EOF >${ROOTFS_DIR}/etc/profile
USER="id-un"
LOGNAME=$USER
PS1='[\u@\h \w]\# '
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
EOF
#5、创建passwd、group文件
file_pwd=${ROOTFS_DIR}/etc/passwd
file_group=${ROOTFS_DIR}/etc/group
if [ ! -e ${file_pwd} ]; then
cp /etc/passwd ${ROOTFS_DIR}/etc/
fi
if [ ! -e ${file_group} ]; then
cp /etc/group ${ROOTFS_DIR}/etc/
fi
################################################################################
echo 根文件系统制作成功!