【Linux相識相知】bash的基礎特性

来源:http://www.cnblogs.com/liubinsh/archive/2017/07/09/7141437.html
-Advertisement-
Play Games

命令歷史、文件類查看工具、文件和目錄類管理工具、通配符、IO重定向 ...


命令歷史

shell進程會記錄用戶提交執行過的命令

可以是用history查看:

[root@localhost dev]# history 
    1  ss -tnl
    2  ifconfig
    3  vi /etc/sysconfig/network-scripts/ifcfg-ens33 
    4  reboot 
    5  systemctl stop firewalld
    6  systemctl disable firewalld
    7  ifconfig
    8  ifconfig
    9  startx
   10  ping 114.114.114.114
   11  top
......
  140  who -b
  141  who -r
  142  date
  143  w
  144  history 

 

定製history的功能

HISTSIZE:shell進程可以保留的命令歷史的條數

[root@localhost dev]# echo $HISTSIZE
1000

HISTFILE:持久保存命令歷史的文件,當退出登錄的時候,此次的命令歷史才會被寫入到HISTFILE中

[root@localhost dev]# echo $HISTFILE
/root/.bash_history
[root@localhost dev]# cat /root/.bash_history
ss -tnl
ifconfig
vi /etc/sysconfig/network-scripts/ifcfg-ens33 
reboot 
systemctl stop firewalld
systemctl disable firewalld
ifconfig
ifconfig
startx
ping 114.114.114.114
top
ifconfig
ifconfig --help
type ls
type ifconfig
......
bash
export name
echo $name
bash

HISTFILESIZE:命令歷史文件的大小

[root@localhost dev]# echo $HISTFILESIZE
1000

 

history常用命令用法

-c:清空命令歷史

-d offset:刪除指定命令歷史,offset為指定的行數

-r:從文件讀取命令歷史至歷史列表中

-w:把歷史列表中的命令追加至歷史文件中

history #:顯示最近的#條命令

 

調用命令歷史列表中的命令

!#:再次執行歷史列表中第#條命令

!!:再一次執行上一條命令

!STRING:再一次執行命令歷史列表中最近一個以STRING開頭的命令

 

調用上一條命令的最後一個參數

快捷鍵:按一下ESC再按點.

或者使用字元串:!$

 

控制命令的記錄方式

[root@localhost /]# echo $HISTCONTROL
ignoredups

ignoredups:忽略重覆的命令;

ignorespace:忽略以空白字元開頭的命令;

ignoreboth:以上兩者同時生效;

 

補全功能

命令補全

shell程式在接受到用戶執行命令的請求時,最左側的字元串會被當做命令

命令查找機制:首先查找內部命令,根據PATH環境變數中設定的目錄,自左而右逐個搜索目錄下的文件名

[root@localhost /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 使用Tab鍵補全

 

路徑補全

 在給定的起始路徑下,以對應路徑下的打頭字元串來逐一匹配起始路徑下每個文件

 

目錄管理類命令

mkdir

make directories 創建目錄

mkdir [OPTION]... DIRECTORY...

常用選項:

-p:自動按需創建父目錄

[root@localhost tmp]# mkdir -p /tmp/x/y/z
[root@localhost tmp]# cd /tmp/x/y/z/
[root@localhost z]# 

 -v:顯示詳細過程,verbose

[root@localhost z]# mkdir -pv /tmp/a/b/c
mkdir: created directory ‘/tmp/a’
mkdir: created directory ‘/tmp/a/b’
mkdir: created directory ‘/tmp/a/b/c’

-m MODE:直接給定許可權

註意:路徑基名方為命令的作用對象,基名之前的路徑必須得存在

 

rmdir

remove empty direcories

移除空目錄

常用選項:

-p:刪除某目錄後,如果其父目錄為空,則一併刪除之

-v:顯示過程

[root@localhost b]# rmdir -pv /tmp/a/b/c/
rmdir: removing directory, ‘/tmp/a/b/c/rmdir: removing directory, ‘/tmp/a/b’
rmdir: removing directory, ‘/tmp/a’
rmdir: removing directory, ‘/tmp’
rmdir: failed to remove directory ‘/tmp’: Device or resource busy

 

命令行展開

{}:可承載一個以逗號分隔的路徑,並能夠將其展開為多個路徑

例如:/tmp/{a,b}相當於 /tmp/a  /tmp/b

例子:

如何創建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b?

[root@localhost tmp]# mkdir -p /tmp/x/{y1/{a,b},y2}

如何創建a_c, a_d, b_c, b_d?

[root@localhost tmp]# mkdir -p /tmp/{a,b}_{c,d}

 如何創建如下目錄結構:

            /tmp/mysysroot/
                |-- bin
                |-- etc
                |   `-- sysconfig
                |       `-- network-scripts
                |-- sbin
                |-- usr
                |   |-- bin
                |   |-- lib
                |   |-- lib64
                |   |-- local
                |   |   |-- bin
                |   |   |-- etc
                |   |   |-- lib
                |   |   `-- sbin
                |   `-- sbin
                `-- var
                    |-- cache
                    |-- log
                    `-- run
mkdir -p /tmp/mysysroot/{bin,etc/sysconfig/networkscripts,sbin,usr/{bin,lib,lib64,local/{bin,etc,lib,sbin},sbin},var/{cache,log,run}}

 

 tree

 可使用tree來查看目錄的層級結構

 

-L #,指定要顯示的層級

 

 命令的執行狀態結果

bash通過狀態返回值來輸出此結果:

成功:0

失敗:1-255

命令執行完成之後,其狀態返回值保存於bash的特殊變數$?中

[root@localhost tmp]# ls /tmp/x/
y1  y2
[root@localhost tmp]# echo $?
0
[root@localhost tmp]# ls /tmp/y
ls: cannot access /tmp/y: No such file or directory
[root@localhost tmp]# echo $?
2

 

引用

 引用命令的執行結果:

 $(COMMAND)或者`COMMAND`

 

 強引用,單引號:

[root@localhost ~]# echo '$PATH'
$PATH

 弱引用,雙引號:

[root@localhost ~]# echo "$PATH"
/usr/local/sbin:/usr/loca

 

快捷鍵

ctrl+a:跳轉至命令行行首

ctrl+e:跳轉至命令行行尾

ctrl+u:刪除行首至游標所在處之間的所有字元

ctrl+k:刪除游標所在處至行尾的所有字元

ctrl+l:清屏,相當於clear

 

文件查看類命令

 cat

cat [OPTION]... [FILE]...

查看文件內容,直接顯示到文件底部

常用選項:

-n:可以顯示行數

[root@localhost tmp]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

 

tac

tac [OPTION]... [FILE]...

反向查看文件內容

[root@localhost tmp]# tac /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
......
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

 

more

 分屏查看文件內容

 

head

head  [OPTION]... [FILE]...

查看文件的前n行,預設為前10行

[root@localhost tmp]# head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
常用選項: head -n  #:顯示前#行或者是head -#

 

tail

查看文件的後n行

tail  [OPTION]... [FILE]...

[root@localhost tmp]# tail /etc/passwd
colord:x:992:987:User for colord:/var/lib/colord:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
setroubleshoot:x:991:986::/var/lib/setroubleshoot:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sssd:x:990:985:User for sssd:/:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

常用選項:

tail -n #:顯示最後#行或者是tail -#

-f:查看文件尾部內容,結束後不退出,跟隨顯示新增的行

 

stat

display file or file system status

文件:兩類數據

元數據:metadata,文件的狀態,創建時間,修改時間,大小,許可權等

數據:文件裡面的內容

[root@localhost tmp]# stat /etc/passwd
  File: ‘/etc/passwd’
  Size: 2235          Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 19840519    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2017-07-06 09:25:43.555083116 -0400
Modify: 2017-07-01 08:00:52.140151303 -0400
Change: 2017-07-01 08:00:52.141154779 -0400
 Birth: -

stat顯示的就是文件的元數據,包含文件路徑,大小,blocks數目,IO block,文件類型,inode號,許可權,uid,gid和三個時間戳等

三個時間戳:

access:最近一次訪問的時間

modify:最近一次修改文件的時間

change:文件最近一次改變的時間,即改變元數據的時間

 

touch

change file timestamps  修改時間戳

touch [OPTION]... FILE...

文件不存在則創建文件,當直接使用命令去touch一個文件的時候,修改的是所有的時間戳

常用選項:

-c:指定的文件路徑不存在時不予以創建

-a:僅修改access time

-m:僅修改modify time

-t   STAMP

       [[CC]YY]MMDDhhmm[.ss]

(不能修改change time,只當元數據發生變化時,才會改變)

[root@localhost tmp]# touch -t 201212121200.30  test.txt -m
[root@localhost tmp]# stat test.txt 
  File: ‘test.txt’
  Size: 0             Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 17251556    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:user_tmp_t:s0
Access: 2017-07-07 03:17:12.640883844 -0400
Modify: 2012-12-12 12:00:30.000000000 -0500
Change: 2017-07-07 03:19:17.667997201 -0400
 Birth: -
[root@localhost tmp]# 

 

文件管理工具

cp

複製文件或者目錄

單源複製:

cp [OPTION]... [-T] SOURCE DEST

如果DEST不存在,則先創建此文件,並複製源文件的數據流至DEST文件中

如果DEST存在:

    如果DEST是非目錄文件,則覆蓋DEST文件

    如果DEST是目錄文件,則在DEST目錄下創建一個與源文件同名的文件,並複製其數據

多源複製:

cp [OPTION]... SOURCE... DIRECTORY cp [OPTION]... -t DIRECTORY SOURCE...

如果DIRECTORY不存在,則報錯

如果DIRECTORY存在:

     如果DIRECTORY是非目錄文件,則報錯

     如果DIRECTORY是目錄文件,分別複製每個文件至目標目錄中,並保持原名

常用選項:

-i:互動式複製

-f:強制覆蓋目標文件

-r,-R:遞歸複製目錄

-d:複製符號鏈接文件本身,而非指向的源文件

-a:-dR --preserve=all, archive,用於實現歸檔;

--preserv=

       mode:許可權

        ownership:屬主和屬組

        timestamps: 時間戳

        context:安全標簽

        xattr:擴展屬性

        links:符號鏈接

        all:上述所有屬性

 

mv

move

移動文件,可用來重命名文件

SYNOPSIS        mv [OPTION]... [-T] SOURCE DEST        mv [OPTION]... SOURCE... DIRECTORY        mv [OPTION]... -t DIRECTORY SOURCE...

常用選項:
-i:互動式

-f:強制覆蓋文件

 

rm

remove

移除文件

rm [OPTION]... FILE...

常用選項:

-i:互動式移除文件

-f:強制刪除文件

-r:遞歸刪除

註意:所有不用的文件建議不要直接刪除,可以移動至某個專用的目錄(用來做回收站的目錄)

 

Globbing

文件名通配:是對整體文件名匹配,不是部分匹配

匹配字元:

*:匹配任意長度的任意字元

?:匹配任意單個字元

[ ]:匹配指定範圍內的任意單個字元‘

      [a-z],[A-Z],[0-9],[a-z0-9]   不區分大小寫

      特殊格式:

     [[:upper:]]:所有大寫字母

     [[:lower:]]:所有小寫字母

     [[:alpha:]]:所有字母

     [[:digit:]]:所有數字

     [[:alnum:]]:所有的字母和數字

     [[:space:]]:所有空白字元

     [[:punct:]]:所有標點符號

[^]:中括弧加托字元,匹配指定範圍外的任意單個字元

     [^0-9]:匹配數字之外的任意單個字元  

     [^[:upper:]]:匹配大寫字母以外的任意單個字元

練習:顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現一位任意字元的文件或目錄;

ls -d /var/l?[[:lower:]]

 練習:複製/etc目錄下,所有以.conf結尾,且以m,n,r,p開頭的文件或目錄至/tmp/conf.d/目錄下;

cp -r /etc/[mnrp]*.conf /tmp/conf.d/

 

IO重定向及管道

IO即輸入和輸出設備,可用於輸入的設備一般有鍵盤、文件系統上的常規文件、網卡等,可用於輸出的設備有顯示器、文件系統上的常規文件、網卡等;

程式的三種數據流:

輸入的數據流:標準輸入(stdin),鍵盤;

輸出的數據流:標準輸出(stdout),顯示器;

錯誤的輸出流:錯誤輸出(stderr),顯示器;

文件描述符:fd,file descriptor

標準輸入:0

標準輸出:1

錯誤輸出:2

 

 IO重定向

輸出重定向:

>    覆蓋輸出

>>    追加輸出

小特性:

set -C:禁止覆蓋輸出重定向至已存在的文件

set +C:開啟覆蓋輸出重定向至已存在的文件(預設)

錯誤輸出重定向:

2>    覆蓋輸出

2>>    追加輸出

合併正常輸出流和錯誤輸出流

1.

&>    覆蓋輸出

&>>    追加輸出

2.

COMMADN > /PATH/TO/somefile  2>&1 :如果命令執行成功則覆蓋輸出至somefile,執行不成功也覆蓋輸出至somefile

COMMAND >> /PATH/TO/somefile 2>&1:如果命令執行成功則追加覆蓋至somefile,執行不成功也追加輸出至somefile

註意:特殊設備:/dev/null  當不需要命令的執行結果,只需要知道命令的執行狀態,則可以重定向至/dev/null,/dev/null相當於一個垃圾桶。

輸入重定向:<

Here Document:<<,可以作為指定文件的結束符,常用於shell編程

[root@localhost tmp]# cat <<EOF
> how are you
> my name is Frank
> EOF
how are you
my name is Frank

 

 tr

tr [OPTION]... SET1 [SET2]

把輸入的數據當中的字元,凡是在SET1定義範圍內出現的,通通對位轉換為SET2出現的字元,不修改原文件

用法1: tr SET SET2 < /PATH/FROM/SOMEFILE  

 

用法2:tr -d SET1  <  /PATH/FROM/SOMEFILE     刪除SET1中的字元,區分大小寫

 

 

管道

連接程式,實現將前面一個命令的輸出直接定向後一個程式當做輸出數據流

COMMAND1 | COMMAND2 | COMMAND3 ...

[root@localhost tmp]# echo 'abcd' | tr 'a-z' 'A-Z' | tr -d 'AD' 
BC

 

tee

 顯示程式的輸出並將其複製到一個或多個文件中

[root@localhost tmp]# echo 'abcd' | tee /etc/fstab | tr 'ab' 'AB' 
ABcd
[root@localhost tmp]# cat /etc/fstab 
abcd

 如上例子,使用tee命令輸出到/etc/fstab,又將標準輸入作為了後面tr的輸入。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTML+CSS命名規則 在一個內容較多的HTML頁面中,需要設計許多不同的框架,再為這些不同的框架及內容進行分類,給予相應的名稱,從而使得網頁結構更加清晰,也為工作提供了方便。許多新手朋友在設計一個HTML文件時,可能只會依據自己的想法隨便給一些簡單的名稱,但若是一味的亂起名稱,不僅會讓團隊的伙伴 ...
  • 以下是AngularJS中最重要的核心功能: 數據綁定: 模型和視圖組件之間的數據自動同步。 適用範圍: 這些對象參考模型。它們充當控制器和視圖之間的膠水。 控制器: 這些Javascript函數綁定到特定的範圍。 服務: AngularJS配有多個內置服務,例如 $http 可作為一個XMLHtt ...
  • 1、作為變數 //block 的申明,定義,調用,block快捷方式inline //<#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) { // <#statements#> //}; // blockNam ...
  • 一、準備 組件化 + 隨著業務需求的增長,在單工程 MVC 模式下,app 代碼逐漸變得龐大,面對的高耦合的代碼和複雜的功能模塊,我們或許就需要進行重構了,以組件化的形式,將需要的組件以 pod 私有庫的形式安裝到最後的主工程中,組件間各自獨立、解耦,僅依賴中間件進行通信,這或許就是極好的架構形式。 ...
  • 1. 下載MySQL Yum Repository http://dev.mysql.com/downloads/repo/yum/ 2. 本地安裝MySQL Yum Repository sudo yum localinstall platform-and-version-specific-pac ...
  • MySQL的簡單使用 1. 使用MySQL命令行工具 Windows 用戶使用: MySQL Client, 輸入密碼 Linux: mysql u用戶名 p密碼 mysql uroot p 2. 顯示資料庫命令 show databases; 3. 創建資料庫命令 create database ...
  • 錯誤截圖如下: 步驟1. 打開瀏覽器,輸入http://www.adobe.com/cn/ 步驟2. 點擊菜單,打開下拉的列表,找到並點擊Adobe Flash Player 步驟3. 把可選程式的勾“√”去掉,否則會安裝可選程式,然後點擊立即安裝按鈕 步驟4. 上一步下載的文件還不是Adobe F ...
  • 使用nmcli命令配置網路 NetworkManager是管理和監控網路設置的守護進程,設備既就是網路介面,連接是對網路介面的配置,一個網路介面可以有多個連接配置,但同時只有一個連接配置生效。 1 配置主機名 CentOS6 之前主機配置文件:/etc/sysconfig/network CentO ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...