Linux中shell基础、重定向、管道符、环境变量

1、什么是shell

  Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器)。它接收用户输入的命令并把它送入内核去执行。起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。

  Shell在Linux系统上具有极其重要的地位

  

 2、命令解释过程

  Shell可以执行:内部命令、应用程序、shell脚本

  

3、Shell的种类

  常见的各种版本的shell:

 Bash(Bourne Again Shell)

 bash是大多数Linux系统的默认Shell。bash与bsh完全向后兼容,并且在bsh的基础上增加和增强了很多特性。bash也包含了很多C Shell和Korn Shell中的有点。bash有很多灵活和强大的变成接口,同时又有很友好的用户界面。

Ksh(Korn Shell) 

Korn Shell(ksh)由Dave Korn所写。它是UNIX系统上的标准Shell。在Linux环境下有一个专门为Linux系统写的Korn Shell的扩展版本,即Public Domain Korn(pdksh) 

tcsh(csh 的扩展)   tcsh是C Shell的扩展。tcsh与csh完全向后兼容,但它包含了更多的使用户感觉方便的新特性。其最大的提高是在命令行编辑和历史浏览方面。

4、Linux的元字符

  在Shell中有一些具有特殊意义的字符,称为Shell 元字符(shell metacharacters)。

  若不以特殊方式(使用转义字符)指明,Shell 并不会把它们当作普通文字符使用。

字符 含义 字符 含义
' 强引用 *、?、! 通配符
" 弱引用 <、>、>> 重定向
\ 转义字符 - 选项标志
$ 变量引用 # 注释符
; 命令分隔符 空格、换行符 命令分隔符

5、Bash的基本功能

  历史命令(history)

  命  令:history 命令可以用来显示曾执行过的命令,也可以根据显示的治疗来重新执行需要的命令

  语  法:history(选项)(参数)

  选  项:n 显示n个最近的记录

  参  数:-a 添加记录

       -r 读取记录,但不会添加内容记录

       -w 覆盖原有的history 文件

       -c 清除记录

       -d<编号>[n] 删除指定n条记录

       -n<文件> 读取指定文件

       -r<文件> 读取文件但不记录

       -w<文件> 覆盖原有文件

  使用上下箭头---调用以前的历史命令

  使用 "!n" 的方式---重复执行第n条历史命令

  使用 "!!" 的方式---重复执行上一条命令

  使用 "!字符串" 的方式---重复执行最后一条以该字符串开头的命令

  使用 "!$" 的方式---重复执行上一条命令的最后一个参数

  

   历史命令存放在当前用户家目录下的 .bash_history 隐藏文件中。

  

  .bash_history 文件存放命令是在系统退出时写入的,在下次登录后能查到上次操作所用到的命令。如果使用 history -w 表示将缓存中的命令立即写入历史文件中。

  

   history 命令查看的历史命令可以用 history -c 进行删除,但是.bash_history 文件的内容是需要通过 vim 编辑器进入文件中删除,或者使用重定向删除(echo > /root/.bash_history )。

  bash中常用的快捷键

  移动:

  Ctrl+A:  移动到当前编辑的命令行首

  Ctrl+E:  移动到当前编辑的命令行尾

  Ctrl+F 或 -> :按字符右移(往命令行尾部方向,前移)

  Ctrl+B 或 <- :按字符左移(往命令行尾部方向,后移)

  Alt+F:  按单词右移(往命令行尾部方向,前移)

  Alt+B:  按单词左移(往命令行尾部方向,后移)

  编辑:

  Ctrl+D:退出终端,等价于exit

  Ctrl+U:  删除光标左边的所有字符串

  Ctrl+K:  删除光标右边的所有字符串

  Ctrl+L:  相当于clear命令---清屏

  Ctrl+C:  强行终止当前操作

6、重定向

  6.1、标准输入输出

  执行一个shell 程序时通常会自动打开三个标准文件

  标准输入(STDIN,文件描述符为0):通常对应终端的键盘,也可以从其他文件或命令或者文件内容中输入。

  标准输出(STDOUT,文件描述符为1):默认输出到屏幕。

  错误输出(STDERR,文件描述符为2):默认输出到屏幕

  文件名称(filename,文件描述符为3+)

  进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。进程使用文件描述符(file descriptors)来管理打开的文件。

  

  6.2、输入重定向

  输入重定向:是指不适用系统提供的标准输入端口,进行重新的指定。换言之,输入重定向就是不适用标准输入端口输入文件,二十使用指定的文件作为标准输入设备。(重定向简单理解就是使用 "<" 符来修改标准输入设备)  4)输入重定向

  语法1:command < file

  

   cat  /etc/passwd 它是以键盘作为标准输入设备,并将文件内容显示到控制台

  而输入重定向 cat < /etc/passwd 是将passwd文件指定为输如设备,并将内容显示到控制台。

  语法2:command << file

  

   cat << file (这个字符串字符是任意的,没有任何含义),他的作用是将file 字符之间的内容(document)作为输入传递给cat 碰到file 将自动结束输入,并将输入的内容显示出来;

  语法3:cat /root/aa < a.txt >b.txt :将文件passwd输入重定向到 a.txt,输出重定向到 b.txt 文件

  

  6.3、输出重定向

  在Linux中,默认的标准输出设备是控制台(或称为显示器),用户输出的信息默认情况下都会显示到控制台。

  比如:cat /etc/aa.txt,它是使用控制台显示内容。默认情况下,标准输出设备是控制台,所以cat命令将文件信息输出到控制台,但是,我们可以使用 ">" 修饰符修改标准输出设备,使用指定的文件作为标准输出设备,来显示文件。输出重定向的概念就出现了。

   3.1、对于两个终端 /dev/pts/0    /dev/pts/1

    

  在设备 /dev/pts/0 给设备 /dev/pts/1 发出 Hello!,那么在 /dev/pts/1 设备上就能显示 /dev/pts/0发过来的消息。

  命令:echo Hello! > /dev/pts/1

  

   使用重定向将查询的文件信息发送到其他控制台,在其他控制台就能接收到信息。

   

   3.2、标准输出重定向(覆盖)

  命令:echo > aa

  标准输出重定向,先清空后写入,如果文件不存在则创建,echo后面没有接内容,则是清空文件。

  

   3.3、标准输出重定向(追加)

  命令:echo "但是在冬季之后迎来的是春暖花开" >> aa

  标准追加输出重定向,想配置文件末尾追加内容

  

   3.4、禁止覆盖

  如果在工作中,我们想要在文件中追加内容时 ">>",却不小心写入 ">" 就执行了,那么我们的我呢见就覆盖了,这时候就需要禁止覆盖了,命令:set -C

  

   强制覆盖 ">|"

  

   禁止覆盖命令:set -C ,解除禁制覆盖命令:set +C

  3.5、错误输出从定向

  命令:ls /root /error 1>a 2>b

  将标准输出和标准错误输出从定向到不同文件

   

   3.6、正确和错误都输入到相同位置

  命令:find /root -name "*.txt" &>ab

  将标准输出和标准错误输出重定向到同一个文件,混合输出

  

   命令:cat a aa > ab

  合并两个文件内容至一个文件

  

   3.7、重定向到空设备/dev/null    

  命令:ls /root /error >ab 2>/dev/null

  空设备,即将产生的输出丢掉 

  

   如果 /dev/null 设备被删除

  命令:rm -f /dev/null   //删除/dev/null设备

  1、手动创建

  命令:mkmod -m 666 /dev/null c 1 3

  2、重启自动创建

7、进程管道技术

  管道操作符号 "|" 连接左右两个命令,将右侧的命令的标准输出,交给右侧命令的标准输入

  

   格式:cmd1 | cmd2 [...|cmdn]

  将/etc/passwd 中的用户按UID大小排序

  命令:sort -t ":" -k3 -n /etc/passwd -r | head

  

   命令:ip a|grep 'inet ' | awk '{print $2}' | awk -F "/" '{print $1}'

  查看本地IP,打印以 "inet "开头的行,以空格为分隔符截取第二段(默认以空格为分隔符),再以 "/" 为分隔符截取第一段。

  

   

  

   7.1、tee 管道技术

  功能:tee 指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件或显示。

  

  命令:ip a|grep 'inet '|tee ip.txt | awk '{print $2}' | awk -F "/" '{print $1}'

  将前一个程序产生的结果保存在指定文件中,并送至下一个程序。

  

   7.2、参数传递 xargs

   功能:将参数列表转换成小块分段传递给其他命令,读入stdin的数据转换为参数添加至命令行中,让一些不支持管道的命令可以使用管道。

  有些命令不支持管道技术,但是可以通过xargs来实现

  

8、shell 环境变量

    1)环境变量定义shell的运行环境,保证shell 命令的正确执行;

  2)Shell 用环境变量类确定查找路线、注册目录、终端类型、终端名称、用户名等;

  3)所有环境变量都是全局变量(既可以传递给Shell 的子进程)。

  8.1、常见的Shell 环境变量

变量名 含义
HOME 用户主目录
LOGNAME 登录名
USER 用户名、与登录名相同
PWD 当前目录/工作目录名
MAIL 用户的邮箱路径名
HOSTNAME 计算机的主机名
INPUTRC 默认的键盘映像
SHELL 用户所使用的shell的路径名
LANG 默认语言
HISTSIZE history所能记住的命令的最多个数
PATH shell查找用户输入命令的路径(目录列表)
PS1、PS2 shell一级、二级命令提示符

  8.2、查看环境变量

  Linux中set、env和 export 都可以查看环境变量

  1)set 命令显示当前shell 的变量,包括当前用户的变量,set 主要用来显示shell 的参数和选项

  2)env 命令显示当前用户的变量,env 用来再构建的幻剑中运行命令

  3)export 命令显示当前导出成用户变量的shell 变量

  每个shell 都有自己特有的变量(set显示的变量),这个和用户变量不同,当前用户变量和你用什么shell 无关,不管你用神那么shell 都在,比如HOME、SHELL等这些变量;但是shell 自己的变量不同,不如BASH_ARGC、BASH等这些变量只有set 才会显示,时bash特有的;export 不加参数的时候,显示哪些变量被导出了用户变量,因为一个shell自己的变量可以通过 export "导出"变成一个用户变量。

  8.3、Linux下环境变量的设置

  8.3.1、新建 /root/test/aa.sh 文件,并赋于可执行权限

  

  

  

  自定义命令脚本,只需要把脚本目录添加到环境变量中,就可以在任意目录下执行该脚本。

    8.3.2、定义系统提示符的变量

  PS1:定义系统提示符的变量

  \d:显示日期,格式为“星期 月 日”

  \h:显示简写主机名。默认主机名“localhost”

  \t:显示24小时制时间,格式为"HH:MM:SS"

  \T:显示12小时制时间,格式为"HH:MM:SS"

  \A:显示12小时制时间,格式为"HH:MM"

  \u:显示当前用户名

  \w:显示当前所在目录的完整名称

  \W:显示当前所在目录的最后一个目录

  \#:执行的第几个命令

  \$:提示符。如果时root用户会显示为"#",如果时普通用户显示"$"

  如:PS1='[\u@\h \w]\$'    //将W改成小写

  

 

   8.3.4、预定义变量

预定义变量 作用
$?

最后一次执行的命令的返回状态。如果这个变量的值为0,

证明上一个命令正确执行;如果这个变量的值为非0(具体时那个数,

由命令自己来决定),则证明上一个命令执行不正确了。

$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)

    

 

  8.3.5、用户工作环境 

  用户登录系统时,shell 为用户自动定义唯一的工作环境并对该环境进行维护直至用户注销。该环境将定义如身份、工作场所和正在运行的进程的特性。这些特性由指定的环境变量值定义。

  用户工作环境分为登录环境和非登录环境:1、登录环境是指用户登录系统时的工作环境,此时的shell 对登录环境而言时主shell;2、非登录环境是指用户在调用子shell 时所使用的用户环境。

  设置用户工作环境

  对所有用户惊醒设置:

    /etc/profile

    /etc/bashrc

  只对当前用户进行设置

    ~/.bash_profile

    ~/.bashrc

  通常,个人bash 环境设置都定义在~/.bashrc文件里。

posted @ 2019-12-04 14:25  秋语  阅读(1683)  评论(1编辑  收藏  举报