1. 程式人生 > 其它 >Linux基礎:初識shell之系統命令基礎

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

一 shell介紹

shell

Shell 中文意思貝殼,寓意類似核心的殼。Shell是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務,簡而言之就是隻要能夠操作應用程式的介面都能夠稱為SHELL。狹義的shell指的是命令列方面的軟體,廣義的SHELL則包括圖形介面。

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