rcS文件命令解读

1、解读echo "a" 1>&2 2>log

首先,关于文件描述符注意这么一个概念,默认的数字中,
0 表示标准输入(键盘),1 表示标准输出(终端屏幕),2 为标准错误输出(终端屏幕)
更高的 3~9 是未定义的

echo "a"
默认会在标准输出中输出 a
1>&2
将标准输出结果作为标准错误输出,此时的 1 相当于 1 和 2,而 2 不再是 2(标准错误输出)
此时的标准错误输出由文件描述符 3 保存
2>log
将文件描述符的 2 重定向到文件 log 中,非标准错误输出

所以,使用以上的命令无法将 1 和 2 中的流导出到 log 文件中,
习惯上,我们都是这么干的

  1. echo "a" 2> log 1>&2

或者

  1. echo "a" 1>&2 > log

以上两种方法都可以将 标准输出和标准错误输出 都放到 log 里面

2、e2fsck命令:

e2fsck命令用于检查第二扩展文件系统的完整性,通过适当的选项可以尝试修复出现的错误。

e2fsck执行后的传回值及代表意义如下:

  • 0 没有任何错误发生。
  • 1 文件系统发生错误,并且已经修正。
  • 2 文件系统发生错误,并且已经修正。
  • 4 文件系统发生错误,但没有修正。
  • 8 运作时发生错误。
  • 16 使用的语法发生错误。
  • 128 共享的函数库发生错误。

语法

e2fsck(选项)(参数)

选项

-a:不询问使用者意见,便自动修复文件系统;
-b<superblock>:指定superblock,而不使用预设的superblock;
-B<区块大小>:指定区块的大小,单位为字节;
-c:一并执行badblocks,以标示损坏的区块;
-C:将检查过程的信息完整记录在file descriptor中,使得整个检查过程都能完整监控;
-d:显示排错信息;
-f:即使文件系统没有错误迹象,仍强制地检查正确性;
-F:执行前先清除设备的缓冲区;
-l<文件>:将文件中指定的区块加到损坏区块列表;
-L<文件>:先清除损坏区块列表,再将文件中指定的区块加到损坏区块列表。因此损坏区块列表的区块跟文件中指定的区块是一样的;
-n:以只读模式开启文件系统,并采取非互动方式执行,所有的问题对话均设置以"no"回答;
-p:不询问使用者意见,便自动修复文件系统;
-r:此参数只为了兼容性而存在,并无实际作用;
-s:如果文件系统的字节顺序不适当,就交换字节顺序,否则不做任何动作;
-S:不管文件系统的字节顺序,一律交换字节顺序;
-t:显示时间信息;
-v:执行时显示详细的信息;
-V:显示版本信息;
-y:采取非互动方式执行,所有的问题均设置以"yes"回答。

参数

文件系统或者分区:指定文件系统或者分区所对应的设备文件名。

实例

检查/dev/sda1是否有问题,如发现问题便自动修复:

e2fsck -a -y /dev/sda1

执行e2fsck或fsck前请先umount partition,否则有机会令档案系统毁损。如果需要对根目录/进行检查及修复,便需要进入singal user mode执行。

3、tee命令

tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。

存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。

语法

tee(选项)(参数)

选项

-a:向文件中重定向时使用追加模式;
-i:忽略中断(interrupt)信号。

参数

文件:指定输出重定向的文件。

在终端打印stdout同时重定向到文件中:

[XXX tmp]#  ls
aa.c
[XXX tmp]# ls | tee out.txtaa.c
out.txt
[XXX tmp]# ls | tee out.txt | cat 
aa.c
out.txt

4、2>&1解释

shell中可能经常能看到:>/dev/null2>&1
命令的结果可以通过%>的形式来定义输出
分解这个组合:“>/dev/null2>&1”为五部分。
1
>代表重定向到哪里,例如:echo"123" > /home/123.txt
2
/dev/null代表空设备文件
3
2>表示stderr标准错误
4
&表示等同于的意思,2>&1,表示2的输出重定向等同于1
5
1表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
因此,>/dev/null2>&1也可以写成“1>/dev/null 2> &1”
那么本文标题的语句执行过程为:
1>/dev/null
:首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1
:接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
说清楚了吗,大家理解下吧!


最常用的方式有:
command> file 2>file 
command> file 2>&1
它们有什么不同的地方吗?

首先command> file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file.command > file 2>file 这样的写法,stdoutstderr都直接送到file,file会被打开两次,这样stdoutstderr会互相覆盖,这样写相当使用了FD1FD2两个同时去抢占file的管道。

command>file 2>&1这条命令就将stdout直接送向file,stderr继承了FD1管道后,再被送往file,此时,file只被打开了一次,也只使用了一个管道FD1,它包括了stdoutstderr的内容。

IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command> file 2>&1 这样的写法。

5、mkfs.ext2 格式化磁盘或空文件为ext2磁盘格式

mkfs.ext2 -F 磁盘或空文件
格式化前得取消挂载,详见mount命令解释
格式化本地磁盘为ext2分区格式磁盘
mkfs.ext2 -F /dev/ssfdc1
格式化储存卡里的file空文件为ext2文件
mkfs.ext2 -F /mnt/mmc/file
注意,把本地磁盘或储存卡格式化成ext2后机子不能自动挂载,需要手动挂载,方法详见mount命令解释



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页