Linux目录结构、bash的基础特性、I/O重定向及管道

时间:2020-12-11 05:21:08

日期: 20150823

 

Linux目录结构

LSB(Linux StandardsBase)是一套核心标准,它保证了LINUX发行版同LINUX应用程序之间的良好结合规定了一系列标准,其中包括文件系统层级结构标准(FHS Filesystem Hierarchy Standard)

 

Linux系统根目录下有众多子目录,这些目录都参照了FHS协定

 

/

├── bin

├── boot

├── dev

├── etc

├── home

├── lib

├── lib64

├── lost+found

├── media

├── mnt

├── opt

├── proc

├── root

├── sbin

├── selinux

├── srv

├── sys

├── tmp

├── usr

└── var

 

/bin: binary供用户使用的基本命令;OS启动即会用到的程序

/boot:存放系统启动相关的文件,如内核、initrd,以及grub(bootloader)

 

/dev: 存放设备文件

块设备:随机访问,数据块

字符设备:线性访问,按字符为单位

设备号:主设备号(major)和次设备号(minor)

 

/etc: 配置文件的存放目录;

/etc/sysconfig:系统级别的应用配置

/etc/init.d:系统服务脚本

 

/home:用户的家目录,每一个用户的家目录通常默认为/home/USERNAME

 

/lib: 基本共享库;内核模块

/lib/modules:内核模块文件

静态库,  .a

动态库, .dll, .so (shared object)

库文件是不能单独执行的,它因为没有程序的执行入口,只能被调用

/lib64: x86_64系统的库文件

 

/Lost+Found用来存放fsck过程中部分修复的文件的

/media:挂载点目录,通常用于挂载移动设备

/mnt:挂载点目录,通常用于挂载额外的临时文件系统

/opt:可选目录,第三方程序的安装目录(一般不用)

/proc:伪文件系统,内核参数映射文件(用于输出内核与进程的相关信息)

/root:管理员的家目录;

/sbin: 管理类的基本命令

/selinux

/srv: services,系统上运行的服务用到的中间数据

/sys: 伪文件系统,输出内核所识别的当前系统上硬件设备相关的属性映射文件

/tmp

/usr: Universal Shared Read-onlydata 全局共享的只读数据(可独立分区)

/usr/bin:

/usr/sbin:

/usr/lib:

/usr/lib64:

/usr/include:(应用程序的头文件:header files)

/usr/share:结构化的独立数据

doc, man(应用程序的帮助文档)

/usr/local: 现在常用的第三方程序的安装位置

/usr/local/bin

/usr/local/sbin

/usr/local/lib

/usr/local/lib64

/usr/local/etc

/usr/local/share

/var: variable date files(存放经常需要发生变化的数据)

/var/cache: 应用程序缓存数据

/var/lib: 应用程序的状态信息数据

/var/local: 专用于为/usr/local下的应用程序存储可变数据

/var/lock: 锁文件

/var/log: 日志文件

/var/opt: 专用于/opt

/var/spool: 应用程序的数据池

/var/run: 运行中的进程的相关数据:通常用守护进程的pid文件

 

 

Linux的文件类型:

使用ls -l 命令列出目录内文件时,排在每行第一列的第一个字符,表示该文件的类型

[root@CentOS-6tmp]# ll /usr

total124

dr-xr-xr-x.   2 root root 36864 Aug 23 10:15 bin

 

-: 普通文件

d: 目录文件

b: 块设备文件

c: 字符设备文件

l: 符号链接文件(类似快捷方式)

p: 命名管道文件

s: 套接字文件

 

 

 

<<===================================== BASH的基础特性】=====================================>>

bash的基础特性(一)

 

(1)命令历史

bash保存的过去曾经执行过的命令的列表

当前shell进程的命令历史保存在缓冲区中;

缓冲区中的命令会在shell退出时保存至文件中用户家目录 .bash_history

 

history快捷方式:

!#: #为命令历史列表中的命令编号;可用执行第#条命令;

!!: 执行上一条命令;

!-#: 执行命令历史列表中的倒数第#条命令;

!string: 执行命令历史列表中的最近一次以string开头的命令;

!$: 引用上个命令的最后一个参数; ESC ――> .

 

history命令

-c: 清空列表

-d #: 删除指定的历史命令

-a: 追加当前会话的命令历史至历史文件中去;

-r:读取历史文件内容,并追加当前会话的命令历史至历史文件中去

-w:把当前会话的命令历史追加到文件

 

命令历史相关的环境变量:

HISTSIZE: 命令历史中可以保存的命令的个数;

HISTFILE: 命令历史文件;

HISTFILESIZE: 命令历史文件可以保存的命令的个数;

HISTCONTROL: 控制命令历史的生成;

ignoredups: 忽略记录重复的命令;连续的相同命令才为重复;

ignorespace: 不记录以空白字符开头的命令;

ignoreboth: 同时具有上面两种特性;

 

 

(2)命令补全

在Linux系统中,输入一个命令时如果不记得完整的命令,可先输入该命令的前几个字符,再按两次TAB键,就会列出所有以输入字符开头的可用命令。

[root@CentOS-6 ~]# mkd      // 此处敲两次TAB键盘,显示下列命令

mkdict    mkdir     mkdosfs  mkdumprd 

[root@CentOS-6 ~]# mkdi    // 此处敲两次TAB键盘,则显示下列命令,逐渐缩小命中的范围

mkdict  mkdir  

[root@CentOS-6 ~]#

 

 

bash的命令分为两类:

内部命令:系统内建的命令

外部命令:在系统某路径下有一个可执行程序

 

使用type命令可识别命令属于哪类,使用 -a选项可以查找到该命令的可执行文件

[root@CentOS-6~]# type history

history is a shell builtin

[root@CentOS-6~]#

[root@CentOS-6~]# type -a ls

lsis aliased to `ls --color=auto'

ls is /bin/ls

[root@CentOS-6~]#

 

命令搜索机制:

PATH环境变量:由冒号分割的路径,自左而右搜索

[root@CentOS-6 ~]# echo $PATH

/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

 

命令搜索并非每次都搜索PATH路径,而是通过搜索hash以达到更高的效率。

hash:把此前搜索到的路径缓存到内存中

kv: key-value

ls --> /bin/ls

 

[root@CentOS-6 ~]# hash

hits        command

  5        /bin/cat

  1        /usr/bin/man

  3        /bin/ls

  8        /usr/bin/tree

  3        /usr/bin/clear

 

 

(3)路径补全

路径补全:跟命令补全一样的概念,当用户输入路径名的开头字符,连续敲TAB键,则会搜索指定字符串卡头的目录,并补全路径。

如果该路径名是唯一:直接补全

否则:两次TAB,可列出

 

 

(4)命令行展开的功能

bash命令行展开能够把一个特殊字符换成别的字符

~  展开为当前用户的主目录

~USERNAME  展开为指定用户的家目录

{,}  可承载一个以逗号分割的列表,并其展开为多个路径

 

例如:

/var/{log,cache,run} = /var/log /var/cache /var/run

 

[root@CentOS-6 tmp]# mkdir -pv x/{a,b}_{c,d}

mkdir: created directory `x'

mkdir: created directory `x/a_c'

mkdir: created directory `x/a_d'

mkdir: created directory `x/b_c'

mkdir: created directory `x/b_d'

[root@CentOS-6 tmp]#

 

 

(5)命令的执行状态结果,由bash追踪和保存

命令的执行结果有两种:

命令执行结果的返回值

命令执行后的状态返回值

 

bash使用特殊变量$? 保存最近一条命令的状态结果,可使用 echo $?  显示

 

bash:每个命令,状态返回值。

成功:0

失败:1-255,(其中12127被系统保留)

$?:

 

实例:

[root@CentOS-6 tmp]#

[root@CentOS-6 tmp]# ls /usr

bin  etc games  include  lib lib64  libexec  local sbin  share  src tmp    

                              //以上为命令执行结果的返回值

[root@CentOS-6 tmp]# echo $?

0                                                                      //此为命令执行后的状态返回值,数值0表示命令执行成功

[root@CentOS-6 tmp]#

[root@CentOS-6 tmp]# ls /usrr

ls: cannot access /usrr: Nosuch file or directory

   //以上是故意输错目录名,所以命令执行失败

[root@CentOS-6 tmp]#

[root@CentOS-6 tmp]# echo $?

2                                                                     //此为命令执行后的状态返回值,数值2表示命令执行失败

[root@CentOS-6 tmp]#

 

 

(6)命令别名

命令别名:命令的另一个引用符号,由bash程序维护

直接输入alias可显示当前系统上所有已定义的命令别名

 

定义别名:alias 别名=‘原始命令’  

例如:alias cls='clear'

 

取消定义的别名:unalias 别名

例如:unalias cls

 

如果别名同原命令名:想直接执行原命令,则需在命令前加\,表示使用命令本身,而不是别名

~/.bashrc#如果要使指定的别名永久生效,则修改此文件,把命令别名添加为此文件内容。

 

 

 

bash的基础特性(二)

 

1)globing

bash中的文件名通配

通配符:

*:匹配任意长度的任意字符

?:匹配任意单个字符

[^] #(脱字符)匹配指定范围之外的任意单个字符

[]:匹配指定字符范围内的任意单个字符,不区分大小写

[abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]

[:space:]  空白字符

[:punct:]  标点符号

[:lower:]  小写字母

[:upper:]  大写字母

[:alpha:]  大小写字母

[:digit:]  数字

[:alnum:]  数字和大小写字母

 

# man 7 glob  查看globing帮助手册

 

 

2)组合键

bash中有众多的快捷键,熟练掌握它们将会提高工作效率

光标跳转:

Ctrl+a:跳到命令行首

Ctrl+e:跳到命令行尾

Ctrl+f:光标往前跳一个字符

Ctrl+b:光标往后跳一个字符

删除OR粘贴:

Ctrl+d:删除光标所在字符

Ctrl+u: 剪切光标至命令行首的内容

Ctrl+k: 剪切光标至命令行尾的内容

Ctrl+y:粘贴所剪切的内容

 

Ctrl+l #清屏

Ctrl+c #终止命令

Ctrl+z #暂停命令(把进程放在后台运行) 

输入jobs 查看后台运行命令

输入fg 回到前台运行

Ctrl+r #搜索历史

 

 

3)IO重定向和管道

输入输出重定向

I/O: 设备, 寄存器

 

INPUT:标准输入:stdin, 0

OUPUT:标准输出:stdout, 1

     标准错误:stderr,2

 

输入重定向:<,<<

<: 输入重定向(基本用不上,以下命令 < 都可省略)

cat < /etc/passwd 

tr 'a-z' 'A-Z' < /etc/passwd

<< EOF: 此处创建文件, Here Document

常用于在脚本中创建文件或生成菜单;

 

#!/bin/bash

#

cat > /tmp.menu.txt << EOF

a: a is asshole

b: b is bastard

c: c is cadger

d: d is damn

EOF

 

输出重定向:>,>>

>: 覆盖输出

>>: 追加输出

set -C:禁止使用覆盖重定向至已经存在的文件;

set +C: 关闭上述特性;

>|:在-C特性下,强制使用覆盖重定向;

 

/dev/null: bit bucket,位桶

 

错误重定向:2>,2>>

2>: 覆盖

2>>: 追加

 

 

同时重定标准输出和错误输出:

COMMAND > /path/to/outfile 2> /path/to/errfile

 

重定向标准输出或错误输出至同一个文件

COMMAND &> /path/to/somefile 

COMMAND > /path/to/somefile 2>&1 

 

 

管道

管道:把一个命令的执行结果传递给下一条命令,作为下一条命令的参数

 

COMMAND1 | COMMAND2 | COMMAND3 | ...

不能在管道中传递变量,尤其不能在前面的命令中生成变量

 

tee的用法:

cat /etc/rc.d/rc.sysinit | tee /tmp/a.out | wc -l

分叉输出:tee,命令不会处理,会送到下一个管道