zoukankan      html  css  js  c++  java
  • Bash初识与常用命令

    Shell介绍

    Shell在中文的意思是壳,寓意是操作系统的壳。Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,简而言之就是只要能够操作应用程序的接口都能够称之为Shell。狭义的Shell指的是命令行方面的软件,广义的Shell则包括图形界面。

    Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种解释器,也是一种程序设计语言。通常将使用Shell语言写的程序称之为脚本程序(Shell Script)。

    Bash

    sh(Bourne Shell)是一个早期的重要Shell,1978年由史蒂夫•伯恩编写,并同Version 7 Unix一起发布。

    Bash(Bourbon-Again Shell)是一个为GNU计划编写的Unix Shell。1987年由布莱恩•福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对Sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。

    Dash(Debian Almquist Shell)是一种Unix Shell。它比Bash小,只需要较少的磁盘空间,但是它的对话性功能也比较少。它由NetBSD版本的Almquist Shell(Ash)发展而来,于1997年由赫伯特•许(Herbert Xu)移植到Linux上,于2002年改名为Dash。

    在CentOS 7上查看可以使用哪些Shell可以查看/etc/shells这个文件

    [chirou@Chirou ~]$ cat /etc/shells
    /bin/sh
    /bin/bash
    /usr/bin/sh
    /usr/bin/bash
    /bin/tcsh
    /bin/csh
    

    Shell交互式环境

    用户登录后进入解释器Bash的交互式环境,可以输入命令

    [chirou@localhost ~]$     $表示当前登录的是普通用户
    [root@localhost ~]#	   #表示当前登录的是超级用户root
    
    chirou		表示当前登录的用户名
    localhost   表示当前的主机名
    ~			表示当前所在目录为家目录
    

    Shell命令语法

    命令组成格式:
    Command [Option1] [Option1]... [Parameter1] [Parameter2]...
    
    Command: 命令(必选)
    Option: 选项,命令具体某个功能,根据需要可以有多个。
    Parameter:参数,命令操作的对象,也可以有多个。
    
    • Linux对大小写敏感,大多数命令都是小写。

    • 命令选项和参数之间必须要用空格分隔,有多个空格Bash视为一个。

    • 使用选项时,通常会在前面加上横杠 - ,如果使用的是长选项则需要加上两个横杠 --,例如ls -a 和 --all,其实它俩指的是一个意思。多个短选项可以组合起来,只写一个横杠 -

      [root@Chirou ~]# ls -al
      [root@Chirou ~]# ls -a -l
      # 这俩是一个意思
      
    • 命令输入完成后,按下Enter就立即执行。

    命令与路径补全

    在Linux中可以使用Tab键进行命令和路径的补全。

    • 在输入命令的时候使用Tab键,Bash会自动寻找以已键入字符开头的命令。如果有多个相同开头的命令,连按两下Tab键会显示出所有的命令。

    • 对于某些特别长的路径,我们在输入的过程中也可以使用Tab键,Bash会寻找当前路径所有以已输入字符开头的文件补全。

    Bash常用快捷键

    • Ctrl+c:立即停止前台正在运行的程序
    • Ctrl+d:退出,相当于exit命令。删除光标后的字符。
    • Ctrl+l:清屏,相当于clear命令。
    • Ctrl+a:光标移动到命令行的行首
    • Ctrl+e:光标移动到命令行的行尾
    • Ctrl+u:删除光标所在处至行首的字符
    • Ctrl+k:删除光标所在处至行尾的字符
    • Ctrl+r:利用关键字搜索命令历史
    • Alt+. :引用上一个命令的最后一个参数,想当于!$
    • Shift+PageUP/PageDown:如果某些命令的输出特别长,导致前面的内容以不在当前屏幕中,就可以使用这两个快捷键进行上下翻页。

    命令历史

    Bash会记录用户所有的输入,可以通过history命令来查看记录。history是记录在内存中的,当用户退出或登出shell时,会自动保存到~/.bash_history文件中。登录时,又会从文件中读取到内存。在内存中,历史命令默认能够存储1000条命令,数量是由环境变量HISTSIZE进行控制,HISTSIZE变量存在于/etc/profile中。

    • -c:将当前登录shell中的历史记录消除。对history文件没影响。
    • -w:将本次登录的历史记录写入命令历史文件中,默认在用户登出时才会写入文件中。
    • -r:将命令历史文件中的内容读入到目前shell的history记录中。
    • !n :执行历史中第n条命令
    • !字符串:执行命令中最近一个以‘字符串’开头的命令。
    • !$:引用上一个命令的最后一个参数

    命令别名

    Bash中为了简化用户输入,可以将一行命令设置一个别名。

    alias:查看所有别名
    

    alias a_name='ls /etc/sysconfig/network-scripts/'
    #设置别名
    
    unalias a_name
    #取消别名
    
    ls
    #取消ls的别名
    

    alias命令设置别名是临时设置,登出后即消失。若要永久设置,需要将设置的别名写入~/.bashrc配置文件。

    type查看命令类型

    Bash解释器自带有一些内置命令。这些命令通过man命令查询帮助手册时,显示的是Bash解释器的手册页,而非命令的手册页。通过type命令就可以查看命令是否输入内置命令。type会显示命令的路径,和which命令类似。

    [root@Chirou ~]# type [-tpa] command_name
    不加任何选项与参数时,type会显示出name是外部指令还是内置指令
    -t :当加入-t参数时,type会将name以底下这些字符显示出它的意义:
    	file :表示为外部指令; 
        alias :表示该指令为命令别名所设定的名称; 
        builtin :表示该指令为bash内建的指令功能; 
     -p :如果后面接的name为外部指令时,才会显示完整档名; 
     -a :会由PATH变数定义的路径中,将所有含name的指令都列出来,包含alias 
    

    命令查找优先级

    Bash 查找命令的顺序:

    • 1、以绝对路径或相对路径执行命令
    • 2、alias
    • 3、Compound Command (复合命令)
    • 4、function
    • 5、build_in
    • 6、hash
    • 7、PATH环境变量所包含的路径
    • 8、上面都找不到就会报错,command not found

    Linux查询帮助信息

    --help选项

    很多命令可以通过--help选项查看命令的大致用法。

    [root@Chirou ~]# ls --help
    用法:ls [选项]... [文件]...
    List information about the FILEs (the current directory by default).
    Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
    
    Mandatory arguments to long options are mandatory for short options too.
      -a, --all			不隐藏任何以. 开始的项目
      -A, --almost-all		列出除. 及.. 以外的任何项目
          --author			与-l 同时使用时列出每个文件的作者
      -b, --escape			以八进制溢出序列表示不可打印的字符
          --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                                   '--block-size=M' prints sizes in units of
                                   1,048,576 bytes; see SIZE format below
    

    man手册页

    man是manual的简写。

    [root@Chirou ~]# man [-a] command 
    # 不带选项会直接显示该命令的详细文档
    -a:显示所有匹配项
    

    man命令一共有9个章节,通过man 7 man命令可以查看

    • 1 普通用户在shell中可以使用的命令的用法
    • 2 系统内核可调用的函数与工具等
    • 3 一些常用的库文件调用
    • 4 查看一些设备文件,通常是/dev下的文件例如:# man 4 null
    • 5 配置文档的信息
    • 6 内置游戏的玩法
    • 7 一些杂项,比如网络协议等
    • 8 只有管理员能够执行的文件,例如一些系统管理类命令。
    • 9 Linux 内核 API

    常用的是1、5、8章节。

    info命令

    info与man的用途其实差不多,都是用来查询指令详细信息的命令。 但是与man page一口气输出一堆文档不同的是, info page则是将档拆成一个一个的段落,每个段落用自己的页面来撰写,并且在各个页面中还有类似网页的“超链接”来跳到各不同的页面中,每个独立的页面也被称为一个节点(node) 。

    不过你要查询的目标资料的说明文件必须要以info的格式来写成才能够使用info的特殊功能(例如超链接)。而这个支援info指令的文件预设是放置在 /usr/share/info/ 这个目录当中的。

    help命令

    对Bash内置命令无法使用man命令来查看,这时就要使用help命令

    [chirou@duorou ~]$ help cd
    

    参考文件/配置模块文件

    一般而言,命令或者软件制作者,都会将自己的命令或者软件的说明制作成线上说明文件。但是,毕竟不是每个都需要做成线上说明文件,还有相当多的说明需要额外的文件!这些说明文件一般就放在/usr/share/doc这个目录里。

    对于新手用户来说,这些通篇英文的文档可能会大大增加学习Linux的难度,所以一般而言,如果对某些命令不了解,更推荐通过上网找答案。但如果要真正深入理解,还是需要看官方文档才行。

    CentOS 7设置默认启动级别

    Linux的运行等级设定如下:
    0:关机
    1:单用户模式,不需要输入账号密码登录进操作系统后就是管理员账号
    2:无网络支持的多用户模式
    3:有网络支持的多用户模式,命令行界面
    4:保留,未使用
    5:有网络支持有X-Window支持的多用户模式
    6:重新引导系统,即重启

    临时修改运行级别init命令

    [chirou@duorou ~]$ init 3 # 修改为命令行界面
    

    在CentOS 6中设置默认启动级别是修改/etc/inittab文件,在CentOS 7中打开此文件发现与CentOS 6不同

    按照该文件所说的,runlevels被targets所取代,即CentOS7采用加载target的方式来替代之前的启动级别。其中有两个重要的target:multi-user.target(表示运行级别中的3)与graphical.target(表示运行级别中的3与5级别)。

    那么,查看当前运行级别的命令

    systemctl get-default
    

    修改默认启动级别为命令行界面

    systemctl set-default multi-user.target
    

    修改默认启动级别为图形界面

    systemctl set-default graphical.target
    

    重启即生效。

    常用命令

    hostnamectl设置主机名,重启生效

    [root@Chirou ~]# hostnamectl set-hostname chirou
    

    在集群系统中,使用主机名能方便管理员识别每台服务器。

    date

    查看时间
    [chirou@duorou ~]$ date '+%Y-%m-%d %H:%M:%S'
    2020-10-20 19:18:25
    
    设置时间
    [chirou@duorou ~]$ date -s '2222-1-3 22:22:6'
    2222年 01月 03日 星期四 22:22:06 CST
    

    注意,Linux有两个时间,一个是系统时间,是由Linux系统启动后维护的。另一个是硬件时间,硬件时间是指主板上的时钟设备,在BIOS设定的时钟。硬件时间存放于CMOS中。当Linux启动时,Linux系统将时间从CMOS中读到系统时间变量中,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。

    Linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区,中国使用的是东8区,此时硬件时间与系统时间相同。另一种是UTC时区,就是世界标准时间,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间。

    为了保证系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约11分钟)进行的,在我们执行date -s 后,如果马上重启机器,修改时间就有可能没有被写入CMOS。

    将系统时间写入CMOS

    [root@duorou ~]# date -s '2020-2-2 2:2:2'
    2020年 02月 02日 星期日 02:02:02 CST
    [root@duorou ~]# hwclock
    2020年10月20日 星期二 19时54分56秒  -0.416221 秒
    [root@duorou ~]# hwclock -w
    2020年02月02日 星期日 02时02分31秒  -0.056272 秒
    

    将硬件时间同步给系统时间

    [root@duorou ~]# date
    2222年 01月 03日 星期四 22:50:35 CST
    [root@duorou ~]# hwclock
    2020年10月20日 星期二 19时50分19秒  -0.964076 秒
    
    [root@duorou ~]# hwclock -s
    
    [root@duorou ~]# date
    2020年 10月 20日 星期二 19:50:35 CST
    

    为了使系统时间准确,最好还是使用ntp方式。Centos7用chrony替换ntp。

    NTP(Net Time Protocol)网络时间协议。

    使用ntpdate命令从网络同步时间,再同步到硬件时钟。

    [root@duorou ~]# date
    2020年 02月 02日 星期日 02:07:28 CST
    [root@duorou ~]# hwclock
    2020年02月02日 星期日 02时07分19秒  -1.033182 秒
    [root@duorou ~]# ntpdate ntp1.aliyun.com
    20 Oct 20:17:55 ntpdate[2323]: step time server 120.25.115.20 offset 22615794.922528 sec
    [root@duorou ~]# date
    2020年 10月 20日 星期二 20:18:13 CST
    [root@duorou ~]# hwclock -w
    [root@duorou ~]# hwclock
    2020年10月20日 星期二 20时19分06秒  -0.611573 秒
    

    阿里云提供了7个NTP时间服务器。

    ntp1.aliyun.com
    ntp2.aliyun.com
    ntp3.aliyun.com
    ntp4.aliyun.com
    ntp5.aliyun.com
    ntp6.aliyun.com
    ntp7.aliyun.com
    

    重启命令

    init 6 # 将系统级别设置为6,即重启级别
    reboot # 立即重启
    shutdown -r 0 # 立即重启,0相当于now
    shutdown -r 3 # 3分钟后重启,且会显示在登录用户的当前屏幕中
    shutdown -r 8:30 # 会在最近的8点30分重启
    

    关机命令

    init 0 # 将系统级别设置为0,即关机级别
    halt	# 立即关机,但没有切断电源
    poweroff # 立即关机
    shutdown -h 0 # 立即关机,0相当于now
    

    取消已设定的关机或重启任务

    [root@duorou ~]# showdown -c
    

    Linux系统一般作为服务器系统,服务器在生产环境中很少会关机。若要关机,一定要将内存中的数据写入硬盘后再关机。推荐使用shutdown命令,它在关机前会先将内存中的数据写入硬盘,然后再关机。另外只有管理员root权限才能执行关机命令。

    注销或登出账号

    [root@duorou ~]# exit
    [root@duorou ~]# logout
    或使用快捷键 Ctrl+d
    

    查看系统版本

    cat /etc/redhat-release
    CentOS Linux release 7.8.2003 (Core)
    

    查看内核版本

    [chirou@duorou ~]$ uname -r
    3.10.0-1127.19.1.el7.x86_64
    [chirou@duorou ~]$ uname -a
    Linux duorou 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
    
  • 相关阅读:
    嵌入式Linux系统移植(二)——交叉编译工具集
    嵌入式linux系统移植(一)
    C语言常用关键语法精华总结
    ARM汇编常用指令
    嵌入式Linux系统移植——uboot常用命令
    VHDL的参数写在一个vhd文件里
    [PAT] 1077 Kuchiguse (20 分)Java
    [PAT] 1073 Scientific Notation (20 分)Java
    [PAT] 1069 The Black Hole of Numbers (20 分)Java
    [PAT] 1065 A+B and C (64bit) (20 分)Java
  • 原文地址:https://www.cnblogs.com/ChiRou/p/13848721.html
Copyright © 2011-2022 走看看