1. 程式人生 > >shell介紹/命令歷史/命令補全/通配符/輸出輸入重定向

shell介紹/命令歷史/命令補全/通配符/輸出輸入重定向

時間 ima 顯示 work zsh 之前 img ole cgroup

shell介紹
* shell是一個命令解釋器,提供用戶和機器之間的交互。

* 支持特定語法,比如邏輯判斷、循環。

* 每個用戶都可以有自己特定的shell。

* Centos7默認shell為bash。

* 還有zsh、ksh

命令歷史

我們在終端上敲過的命令,都有它的歷史記錄,比如此時按下向上鍵就會看到你之前最後輸入的一條命令,再按就再往前翻,這裏就開始學習認識命令歷史

使用history命令查看歷史命令;

[root@Ask-02 ~]# history

技術分享圖片

這裏可以看到我已經輸入過429條命令。

歷史命令是有個文件保存的,在root用戶的家目錄下,名為.bash_history

,它是一個隱藏文件所以別忘記小點;

[root@Ask-02 ~]# ls /root/.bash_history
/root/.bash_history
[root@Ask-02 ~]# cat /root/.bash_history

技術分享圖片

該命令歷史環境變量系統設定最大保存1000條命令,可以通過以下命令查看;

[root@Ask-02 ~]# echo $HISTSIZE
1000

在目前中輸入的命令還只是存在內存中,並為已經寫入到命令歷史文件中,通過以下命令,可以將當前輸入過(內存記憶)的命令記錄刪除;

[root@Ask-02 ~]# history -c

這個時候再按向上的方向鍵,你就發現看不到你前面輸入過的命令了,而這個操作是不會刪除掉你命令歷史中的內容。

如果你覺得最大保存一千條命令不夠,可以在以下路徑中的配置文件裏進行修改;

[root@Ask-02 ~]# vi /etc/profile

找到以下圖中這行將數量修改,這裏我將數值改為:5000
技術分享圖片

想要這個數值生效還需要重新進入終端,或者執行以下命令;

[root@Ask-02 ~]# source /etc/profile
[root@Ask-02 ~]# echo $HISTSIZE
5000

可以看到數值已經變為5000
目前當我們輸入history命令的時候,顯示的僅僅是行號和命令,如果想要知道它操作的詳細時間,我們可以更改以下環境變量即可;

[root@Ask-02 ~]# HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "

[root@Ask-02 ~]# history
1 2018/01/10 18:07:50 vi /etc/profile
2 2018/01/10 18:12:13 cat /etc/profile
3 2018/01/10 18:13:55 source /etc/profile
4 2018/01/10 18:14:49 echo $HISTSIZE
5 2018/01/10 18:21:19 HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "
6 2018/01/10 18:21:28 history****

但是這樣的操作僅限於當前,只要退出重進後又恢復原來的樣子,想讓它永久生效,進入到profile配置文件中,在HISTSIZE數量值下面添加上剛才那段參數即可。修改完別忘執行source命令。

[root@Ask-02 ~]# vim /etc/profile
[root@Ask-02 ~]# source /etc/profile

技術分享圖片

如果想要永久保存命令歷史記錄,那麽你可以給文件加上隱藏權限,好比加上a權限,這樣就只能增加不能刪除,這時就算不設置最大數值它也不會被刪除;

[root@Ask-02 ~]# chattr +a ~/.bash_history

如果沒有正常的關閉終端,或者重啟終端,那之前登錄時使用過的命令將不被記錄到命令歷史文件裏。

!!:兩個嘆號為快速執行最後一條命令。
!n:n=(數字),該命令用於執行命令歷史中的第幾個命令,比如!400就是執行命令歷史中第400條的命令
!echo:嘆號後更一個命令你個,會在命令歷史中重復執行一次距離歷史最近的一次(也是該命令最後執行的一次)這裏我們拿echo命令打比方。

命令補全和別名

tab鍵:敲以下補全命令,敲兩下顯示包含當前輸入的字符的多個命令,比如ls敲兩下顯示出含有ls的多個命令,當我輸入lsb按一下tab鍵會補全lsblk這個命令;

[root@Ask-02 ~]# ls
ls lscgroup lsipc lsmcli lsns lsscsi lsusb.py
lsattr lscpu lslocks lsmd lsof lssubsys
lsblk lsinitrd lslogins lsmod lspci lsusb
[root@Ask-02 ~]# lsblk

tab補全用法不僅可以補全命令,還可以補全文件路徑,在centos6的時候系統是不支持補全命令參數的,需要安裝了bash_completion包後,而Centos7是系統支持不全參數;

[root@Ask-02 ~]# yum install -y bash_completion //安裝完後需要重啟以下系統後才會生效。

當你輸入一條命令時你覺得命令很長使用起來降低了效率,那麽你可以使用自定義該命令使用alias命令;

[root@Ask-02 ~]# alias restartnet=‘systemctl restart network.service‘ //比我們將systemctl restart network.service這條命令重命名為restartnet

alias的自定義配置文件在etc下的profile.d裏,還有一個地方在root用戶的家目錄下;

[root@Ask-02 ~]# cd /etc/profile.d/
[root@Ask-02 profile.d]# ls
256term.csh colorgrep.csh flatpak.sh less.sh vte.sh
256term.sh colorgrep.sh lang.csh PackageKit.sh which2.csh
abrt-console-notification.sh colorls.csh lang.sh vim.csh which2.sh
bash_completion.sh colorls.sh less.csh vim.sh
[root@Ask-02 profile.d]# ls /root/.bashrc
/root/.bashrc

unalias:需要自定義的別名

[root@Ask-02 ~]# unalias restartnet

通配符

[*****:]當你使用星號的時候來查看的時候,你會得到含有星號前或後的有關文件,比如;

[root@Ask-02 文檔]# ls ****.txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 測試.txt
或者是
[root@Ask-02 文檔]# ls 測試

測試1.txt 測試2.txt 測試3.txt 測試4.txt 測試.txt

[?:]使用問號查看任意以一個字符為名稱的文件

[root@Ask-02 文檔]# ls ?.txt
1.txt 2.txt 3.txt 4.txt 5.txt 6.txt

[0-9]:使用方括號,可以列出一個範圍內的文件,比如1-3;

[root@Ask-02 文檔]# ls [1-3].txt
1.txt 2.txt 3.txt

{1,2}:使用花括號和方括號的用法相似,只是操作略有不同他是使用“,”來區分開的;

[root@Ask-02 文檔]# ls {1,2}.txt
1.txt 2.txt

輸入輸出重定
[>:]大於號,表示輸出將前者顯示的內容輸出寫入到後面的文件中去(註意寫入到後者的文件中原文件內容將被替換);

[root@Ask-02 文檔]# cat 1.txt
hello world
[root@Ask-02 文檔]# cat 1.txt >2.txt
[root@Ask-02 文檔]# cat 2.txt
hello world

[>>:]兩個大於號,表示追加,即將前者顯示的內容追加到後者文件中去且不會替換掉原文件的內容;

[root@Ask-02 文檔]# cat 1.txt >>2.txt
[root@Ask-02 文檔]# cat 2.txt
hello world
hello world

[2>:]大於號前面加個2表示錯誤輸出,即將前者執行的錯誤結果輸出到後者文件中去;

[root@Ask-02 文檔]# car 1.txt
bash: car: 未找到命令...
相似命令是: ‘sar‘
[root@Ask-02 文檔]# car 1.txt 2>3.txt
[root@Ask-02 文檔]# cat 3.txt
bash: car: 未找到命令...
相似命令是: ‘sar‘

[2>>:]表示追加輸出,即將前者執行的錯誤結果追加輸出到後者文件中去;

[root@Ask-02 文檔]# car 4.txt 2>>3.txt
[root@Ask-02 文檔]# cat 3.txt
bash: car: 未找到命令...
相似命令是: ‘sar‘
bash: car: 未找到命令...
相似命令是: ‘sar‘

[&>:]結合了正確和錯誤輸出的結果,寫入到後者文件中

[root@Ask-02 文檔]# cat 1.txt 8.txt &>5.txt
[root@Ask-02 文檔]# cat 5.txt
hello world
cat: 8.txt: 沒有那個文件或目錄

[>+2>:]可以同時將一條命令的執行結果正確和錯誤輸出寫入不同的文件當中;

[root@Ask-02 文檔]# cat 1.txt 8.txt >2.txt 2>3.txt
[root@Ask-02 文檔]# cat 2.txt
hello world
[root@Ask-02 文檔]# cat 3.txt
cat: 8.txt: 沒有那個文件或目錄

[<:]將後邊的文件輸出到前面的命令中;

[root@Ask-02 文檔]# wc -l <5.txt
2

shell介紹/命令歷史/命令補全/通配符/輸出輸入重定向