shell:输入输出重定向 /dev/null (附创建根文件系统脚本 仅供参考)

  • Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。
    一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。
一、输出重定向
  • 命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向。命令输出重定向的语法为:
    $ command > file

  • 这样,输出到显示器的内容就可以被重定向到文件。
    注:如果重定向的文件不存在,则创建。

    在这里插入图片描述

  • “>” 重定向会覆盖文件之前的内容,不想覆盖可以使用“>>”进行追加。
    $ command >> file
    shell:输入输出重定向 /dev/null (附创建根文件系统脚本 仅供参考)_第1张图片

二、输入重定向
  • 和输出重定向一样,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。

shell:输入输出重定向 /dev/null (附创建根文件系统脚本 仅供参考)_第2张图片
shell:输入输出重定向 /dev/null (附创建根文件系统脚本 仅供参考)_第3张图片
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 根文件系统制作成功!




你可能感兴趣的:(Shell&Makefile,shell)