Linux基礎:初識shell之系統命令基礎


一 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM