linux基础:初识shell之系统命令基础

简爱cx 简爱cx     2022-12-01     462

关键词:

一 shell介绍

shell

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

img

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

所以说,shell可以指代两层意思: 1、命令解释器

python语言 《==================》shell命令

python解释器《=================》shell解释器

操作系统《=====================》操作系统

计算机硬件《===================》计算机硬件

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

bash(Bourne-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。


//sh 遵循POSIX规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。
//sh 跟bash的区别,实际上是bash有没开启POSIX模式的区别。
//简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash, /bin/sh 相当于 /bin/bash --posix。
//在Linux系统上/bin/sh往往是指向/bin/bash的符号链接
// ln -s /bin/bash /bin/sh


我们可以SHELL实现对Linux系统的管理例如:

1. 文件管理
2. 用户与权限管理
3. 进程管理
4. 磁盘管理
5. 网络管理
6. 软件管理

 

shell脚本

Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。

 

GUN bash

 Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同,即命令大都通用。当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用。
   
bash是大多数Linux系统以及Mac OS X v10.4默认的shell,bash具有极强的可移植性,它能运行于大多数Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne的内置命令的脚本才需要修改。

bash的命令语法很多来自Korn shell (ksh) C shell (csh)例如命令行编辑,命令历史,目录栈,$RANDOM $PPID 变量,以及POSIX的命令置换语法: $(...)。GNU bash作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名,文件名,变量名等等。

 

POSIX:

// 一:简单来说:
POSIX(Portable Operating System Interface,可移植操作系统接口),是操作系统为应用程序提供的接口标准。
简单的说, POSIX(主要是解决了应用程序在各个操作系统上兼容性这样一个普遍存在的问题。只要一个应用程序的开发是为了在一个实现了POSIX模式的操作系统上运行,那么这个应用程序就可以在所用实现了POSIX模式的操作系统上运行。


// 二:
//1、POSIX定义
POSIX: Portable Operating System Interface of Unix.,可移植操作系统接口。X表示其是对Unix API的传承。
 
POSIX标准由IEEE(电气和电子工程师协会)发布,定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行软件而定义的一系列API标准的总称。

简单可以理解POSIX标准是为操作系统设计API时遵循的规范,一套规范的系统调用集。


//2、POSIX的诞生/解决的问题
POSIX的诞生和Unix的发展是密不可分的。当年最早的Unix,源代码流传出去了,加上早期的Unix不够完善,于是之后出现了好些独立开发的与Unix基本兼容但又不完全兼容的OS,通称Unix-like OS。这样版本混乱的情况导致相互之间的竞争和不兼容之处越来越多,给软件的可移植性带来很大困难,对Unix的发展极为不利。

为了提高兼容性和应用程序的可移植性,结束混乱局面,IEEE提出了POSIX标准,POSIX在源代码级别上定义了一组最小的Unix(类unix)操作系统接口。 这套标准涵盖了很多方面,比如Unix系统调用的C语言接口,shell程序和工具、线程和网络编程等。POSIX标准意在期望获得源代码级别的软件可移植性。为一个POSIX兼容的操作系统编写的程序,可以在任何其他POSIX操作系统上编译执行。

POSIX现在已经发展成为一个非常庞大的标准族,并不局限于Unix, 一些其他的操作系统,如Microsoft windows NT, Linux等都支持或者部分支持POSIX标准。

//3、POSIX标准的思路
问题: 不同操作系统内核为同一功能提供的系统调用(函数)是不同的,例如创建进程,linux下是fork函数,windows下是createprocess函数,如果在Linux下写了一个程序用到了fork函数,要往windows上移植就得把源代码里面的fork通通改成createprocess,然后重新编译。

解决方法: 定义POSIX标准, linux和windows实现基于POSIX标准,提供同样的接口,例如定义创建进程的接口为posix_fork(示例名/非真实名字), 且linux和windows都把各自创建进程的调用封装成posix_fork,都声明在unistd.h里。 这样程序员编写应用时,只需包含unistd.h, 调用这个POSIX标准中定义的API接口: posix_fork函数,即可实现源代码级别的可移植。

 

二、shell交互式环境

登录用户后进入解释器bash的交互式环境,可以敲命令,交互式环境的命令提示符如下

[root@xxx ~]#       #号代表超级管理员用户对应的命令行
[root@xxx ~]$       $号代表普通用户对应的命令行

root ==> 当前登录的用户
@ =====> 分隔符
xxx ==> 主机名
~ ====> 当前所在的路径


// 创建普通系统用户
useradd egon
// 交互式设置密码
passwd egon
// 非交互式设置密码
echo "123" | passwd --stdin egon

 

三、shell命令语法

三部分组成

  • 1、命令:要执行的操作(必选)

  • 2、选项:如何具体执行操作,通常以 -, --, +开头(可选)

  • 3、参数:具体操作的对象(可选)

ps:unix认为命令运行完毕后没有提示便是最好的提示,即结果正确,linux继承unix的优良传统

例1

ls
ls /root
ls -l /root

 

例2

[root@localhost ~]# date
20200812星期三 16:13:08 CST
[root@localhost ~]# date +%F
2020-08-12
[root@localhost ~]# date -s 16:14:00
20200812星期三 16:14:00 CST
[root@localhost ~]# date -s "2022-11-11 11:11:11"
20221111星期五 11:11:11 CST

 

例3

[root@egon ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
[root@egon ~]# uname -r
3.10.0-1127.13.1.el7.x86_64
[root@egon ~]# uname -m
x86_64
[root@egon ~]# uname -a
Linux egon.xxx.com 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@egon ~]#

 

四、bash解释器特性

1.命令和文件自动补全<tab> 注意:Tab只能不全命令和文件

2.快捷键(^代表crtl)

^c 终止前台运行的程序 ^d 退出 等价exit ^l 清屏 ^a 光标移到命令行的最前端 ^e 光标移到命令行的后端 ^r 搜索历史命令,利用关键词 Alt+. 引用上一个命令的最后一个参数,等价于!$

3.历史命令

1、查看历史命令
2、清空历史命令
[root@xxx ~]# history -c

3、历史命令保存文件:cat ~/.bash_history

4、历史命令默认保存1000条,可以修改/etc/profile中的HISTSIZE=2000

5、查找历史命令并运行
(1)光标上下键
(2)^r //搜索历史命令(输入一段某条命令的关键字:必须是连续的)
(3)!220 //执行历史命令中第220条命令
(4)!字符串 //搜索历史命令中最近一个以xxxx字符开头的命令,例如!ser
(5)!$ //引用上一个命令的最后一个参数
[root@xxx home]# ls /root /home
[root@xxx home]# cd !$
cd /home

[root@xxx home]# ls /root /home
[root@xxx home]# touch !$/file1
touch /home/file1

 

4.别名

别名
# alias //查看系统当前的别名
ll=\'ls -l --color=tty\'
# alias egon=\'ls /etc/sysconfig/network-scripts/\' //建立别名
# unalias egon

[root@xxx ~]# grep root /etc/passwd // 默认有颜色
[root@xxx ~]# alias grep
alias grep=\'grep --color=auto\'

 

五、命令查找优先级

bash shell查找命令顺序:
==>以路径(绝对路径,相对路径)开始命令,例如:/bin/ls 或 cd /bin; ./ls
   ==> alias
     ==> Compound Commands
       ==> function
         ==> build_in,如cd,kill,pwd、alias、echo等,可以用"type -a 命令"查看
           ==> hash
             ==> $PATH,环境变量,查看环境变量echo $PATH,例如/bin/ls
               ==> error: command not found

复合命令例如
for((i=0;i<=3;i++))do echo 123;done
函数例如
function f() echo 123; ,注意左右两边有空格
                   
# ps:查看命令的位置:which 命令

 

六、查看帮助信息

1、man手册

// 1、简单使用
man 命令

// 2、详解如下
man 手册名,例如man ls
搜索:/-h   n N


技巧一:按章节来查找,常用的是1(命令用法),5(文本规范),8(系统管理命令)
/usr/bin/passwd         命令,修改用户密码   man 1 passwd
/etc/passwd                 保存用户信息的文件   man 5 passwd
/etc/exports               man exports   man 5 exports

技巧二:按关键字检索(适合记不住手册的全名时使用)
man -k "_selinux"         //手册名或手册描述中包含关键字_selinux
注:从whatis数据库里找(# makewhatis)

技巧三:在所有章节中查询
# man -a passwd
# man -f passwd

2、--help或者help命令

命令 --help
help 命令

// 例1
[root@xxx ~]# ls --help
用法:ls [选项]... [文件]...

ls 常见选项
-a   all,查看目录下的所有文件,包括隐藏文件
-l     长列表显示
-h   human 以人性化方式显示出来  
-d   只列出目录名,不列出其他内容
-t     按修改时间排序
-r     逆序排列
-i     显示文件的inode号(索引号)

3、info 非常详细的显示命令的说明信息

4、官方手册

5、baidu, google

https://man.linuxde.net/
linux.web3.xin

 

七、常用命令

设置主机名

[root@iZm5e59rizbgmmp4net6zbZ ~]# hostnamectl set-hostname aliyun // 退出重新进入即可看到

查看ip地址(设置ip地址会在网络配置章节里详细介绍)

# 查看
ifconfig  # 也可以执行ip address或者简写ip a
ifconfig eth0 # 也可以执行ip a show eth0

设置时间

[root@aliyun ~]# date --help

查看时间
  # date "+%Y_%m_%d %H-%M-%S"

设置时间
  #date -s "2018-05-17 09:51:50"
  或者
  # timedatectl set-time \'16:10:40 2022-11-12 13:14:15\'



// =============》date设置的是系统时间,实际上时间分为硬件时钟与系统时钟两种
#1、硬件时钟:硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,硬件时间存放于CMOS中。
#2、系统时钟:系统时钟则是指kernel中的时钟,当Linux启动时
ps:硬件时间默认比系统时间慢8个小时

// =============》硬件时钟与系统时钟的关系是:
Linux操作系统将时间从CMOS中读到系统时间变量中,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。

linux系统设置硬件时钟时,提供两种时区选择,一种为本地时区,此时硬件时间与系统时间相同;另一种为UTC时区,此时硬件时间存的是UTC时间,系统初始化时会转换为本地时间后再设置为系统时钟的时间。

以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。
如果要确保修改生效可以执行如下命令。
#hwclock –w
这个命令强制把系统时间写入CMOS。

// =============》hwclock命令
hwclock命令,与clock命令是同一个命令,主要用来查询和设置硬件时钟(query and set the hardware clock (RTC))。RTC=Real Time Clock,也就是硬件时钟。在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中
的时钟。所有Linux相关指令与函数都是读取系统时钟的设定。因为存在两种不同的时钟,那么它们之间就会存在差异。根据不同参数设置,hwclock命令既可以将硬件时钟同步到系统时钟,也可以将系统时钟同步到硬件时钟。

// hwclock命令的参数
-r, --show 读取并打印硬件时钟
-s, --hctosys 将硬件时钟同步到系统时钟
-w, --systohc 将系统时钟同步到硬件时钟

// =============》时间服务器
注意:要使系统时间准确,最好还是使用ntp方式,即将Linux系统时钟同步到远程NTP服务器,ps:centos7用chrony替换ntp,此处暂作了解:https://www.cnblogs.com/linhaifeng/articles/13471989.html  
   
NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统时钟。timedatectl实用程序可以自动同步你的Linux系统时钟到使用NTP的远程服务器。
注意,你必须在系统上安装NTP以实现与NTP服务器的自动时间同步。
   
使用ntpdate命令从网络同步时间,再同步到硬件时钟
ntpdate命令是使用NTP协议来从网络同步时间的命令。NTP=Network Time Protocol 网络时间协议。

#系统中默认没有ntpdate命令,需要自行下载安装
[root@localhostt ~]# yum install ntpdate -y

# 与网络时间服务器同步时间
[root@localhost ~]# ntpdate 0.cn.pool.ntp.org
12 Aug 21:04:14 ntpdate[10099]: step time server 203.107.6.88 offset -7826995.450514 sec
[root@localhost ~]# date
[root@localhost ~]# hwclock -w
           
# 注意:
1、必须有 root 权限才能在主机上运行这个命令。
2、如果NTP服务器守护程序在当前主机上运行,命令将拒绝ntpdate设置日期
3、让系统自动同步时间,只需添加一条定时任务即可,后期会介绍到

# ps: 阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址
ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com

要开始自动时间同步到远程NTP服务器,在终端键入以下命令。
# timedatectl set-ntp true
要禁用NTP时间同步,在终端键入以下命令。
# timedatectl set-ntp false

重启时间失效

关闭默认的时间同步,然后再进行设置
# timedatectl set-ntp no

设置时区

查看
timedatectl status

列出可用时区
timedatectl list-timezones

设置
# timedatectl set-timezone "Asia/Shanghai"
# timedatectl set-timezone UTC

重启

shutdown -r 10 // 10分钟后重启
shutdown -r 0 // 立即重启
shutdown -r now // 立即重启
shutdown -r 11:30 // 定点重启
init 6 // 立即重启
reboot // 立即重启

关机

shutdown -h 10 // 10分钟后关机
shutdown -h 0 // 立刻关机
shutdown -h now // 立刻关机
shutdown -h 11:30 // 定点关机
halt // 立即停止系统,需要人工关闭电源
poweroff // 立即停止系统,并且关闭电源

取消正在进行的关机或重启

shoutdown -c

注销登录的账号

exit
logout
ctrl+d

 

浅谈如何学习linux

...Linux经典学习路线,希望对你们有帮助。第一阶段:linux基础入门1.开班课程介绍-规章制度介绍-破冰活动;2.Linux硬件基础/Linux发展历史;3.Linux系统安装/xshell连接/xshell优化/SSH远程连接故障问题排查4.第一关一大波命令及特殊字符知... 查看详情

想学linux应该怎么入手

...果,初学者可以按照以下路线进行学习:第一阶段:linux基础入门1.开班课程介绍-规章制度介绍-破冰活动;2.Linux硬件基础/Linux发展历史;3.Linux系统安装/xshell连接/xshell优化/SSH远程连接故障问题排查4.第一关一大波命令及特殊字符知... 查看详情

python基础之linux基础:系统信息相关命令(代码片段)

系统信息相关命令本节内容主要是为了方便通过远程终端维护服务器时,查看服务器上当前系统日期和时间/磁盘空间占用情况/程序执行情况本小结学习的终端命令基本都是查询命令,通过这些命令对系统资源... 查看详情

linux课程有啥内容?

Linux学习,主要学以下内容:第一阶段:linux基础入门1.开班课程介绍-规章制度介绍-破冰活动;2.Linux硬件基础/Linux发展历史;3.Linux系统安装/xshell连接/xshell优化/SSH远程连接故障问题排查4.第一关一大波命令及特殊字符知识考试题... 查看详情

新手入门linux的步骤

...路线,这样才可以达到事半功倍的效果。第一阶段:linux基础入门1.开班课程介绍-规章制度介绍-破冰活动;2.Linux硬件基础/Linux发展历史;3.Linux系统安装/xshell连接/xshell优化/SSH远程连接故障问题排查4.第一关一大波命令及特殊字... 查看详情

python基础之linux基础:用户权限相关命令(代码片段)

用户权限相关命令目标用户和权限的基本概念用户管理终端命令组管理终端命令修改权限终端命令01.用户和权限的基本概念1.1基本概念用户是Linux系统工作中重要的一环,用户管理包括用户与组管理在Linux系统中,不论是... 查看详情

linux系统基础命令

1.shellLinux系统中运行的一种特殊程序在用户和内核之间之间充当“翻译官”用户登陆Linux系统时,自动加载一个Shell程序Bash是Linux系统中默认使用的Shell程序内核:用于调用计算机硬件资源shell:将用户指令转换成计算机语言让内... 查看详情

linux课程主要讲啥内容?

Linux学习,主要学以下内容:第一阶段:linux基础入门1.开班课程介绍-规章制度介绍-破冰活动;2.Linux硬件基础/Linux发展历史;3.Linux系统安装/xshell连接/xshell优化/SSH远程连接故障问题排查4.第一关一大波命令及特殊字符知识考试题... 查看详情

linux都会学到哪些东西?运维呢?

第一阶段:linux基础入门1.开班课程介绍-规章制度介绍-破冰活动;2.Linux硬件基础/Linux发展历史;3.Linux系统安装/xshell连接/xshell优化/SSH远程连接故障问题排查4.第一关一大波命令及特殊字符知识考试题讲解5.Linux基础优化6.Linux目录... 查看详情

linux的基础命令

...3.1格式3.2编辑Linux命令行3.3获得命令帮助的方法四、Linux基础命令4.1pwd:查看当前的工作目录4.2cd:切换工作目录4.2.1cd格式4.2.2绝对路径4.2.3相对路径一、shell概述1.Linux系统中运行的一种特殊程序2.在用户和内核之间充当“翻译官... 查看详情

linux安全基础:shell及一些基础命令

1.什么是shell?Shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。2.shell的分类(1)bashbashshell是Bourneshell的一个免费版本,它是最早的Unixshell,包括许多附加的特点。Bash有可编辑的命令行,可以回... 查看详情

linux操作基础——shell(代码片段)

Linux操作基础——shell1.什么是shellshell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器),shell接收用户输入的命令并把它送入内核执行,在用户与操作系统之间进行交互。shell在Lin... 查看详情

linux基础命令之关机,重启,注销(代码片段)

shutdown      此命令用来安全关闭或重启Linux系统,系统在关闭之前会通知所有的登录用户,系统即将关闭,此时所有新用户都不可以登录。  以下截取man手册的内容(manshutdown):       NAME      shutdown... 查看详情

一天一个linux基础命令之关机命令shutdown

关机重启命令shutdown1、命令格式shutdown[options][+]TIME2、命令功能shutdown命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息,系统在指定时间关机之前的5分钟会通知所有用户,系统马... 查看详情

⭐️《linux系列》⭐️linux基础命令(代码片段)

...言❤️⭐️Shell命令⭐️内部命令外部命令命令别名☀️基础命令☀️helpsupwdcdlsmkdircat/moretouchrmvicpmv❄️写在最后❄️❤️前言❤️Linux系统,大多数时候是通过命令行模式来使用的,因此熟悉Linux命令是必不可少的。本... 查看详情

⭐️《linux系列》⭐️linux基础命令(代码片段)

...言❤️⭐️Shell命令⭐️内部命令外部命令命令别名☀️基础命令☀️helpsupwdcdlsmkdircat/moretouchrmvicpmv❄️写在最后❄️❤️前言❤️Linux系统,大多数时候是通过命令行模式来使用的,因此熟悉Linux命令是必不可少的。本... 查看详情

linux实验之shell编程基础(代码片段)

...灼,星光杳杳,秋风渐渐,晚风慢慢shell编程基础熟悉shell编程的有关机制,如标准流。学习Linux环境变量设置文件及其内容/etc/profile/etc/bashrc/etc/environment~/.profile~/.bashrc熟悉编程有关基础命令技巧和规则awk(1)按行输... 查看详情

linux基础-常见指令及权限理解(代码片段)

1.常见指令及权限理解初始Linux操作系统初识shell命令,了解若干背景知识。使用常用Linux命令了解Linux权限概念与思想,能深度理解“权限”初步了解Linux目录结构含义文章目录1.常见指令及权限理解1.linux系统及计算机背景2.使用XShel... 查看详情