Linux雜記3

junwind發表於2021-02-26
以使用者角度看shell型別:
    登入式shell
        通過某終端登入
        su - username
        su -l username

    非登入式shell
        su xqw
        圖形終端下,開啟的terminal
        自動執行的shell指令碼

bash的一些配置檔案
    全域性
        /etc/profile
        /etc/profile.d/*.sh
        /etc/bashrc

    個人
        ~/.bash_profile
        ~/.bashrc

    相同配置,個人的覆蓋全域性

    profile類檔案
        設定環境變數
        執行命令或指令碼(使用者一登陸,就自動執行某命令或指令碼)
    bashrc類檔案
        設定本地變數
        定義命令別名

登入式shell如何讀取配置檔案?按順序依次讀取配置檔案
    /etc/profile
    /etc/profile.d/*.sh
    ~/.bash_profile
    ~/.bashrc
    /etc/bashrc

非登入式shell的順序
    ~/.bashrc
    /etc/bashrc
    /etc/profile.d/*.sh

su - 使用者   完全切換
su 使用者     半切換


在配置檔案中新增一個命令別名
    全域性 /etc/bashrc
    個人 ~/.bashrc

    vi ~/.bashrc
        alias cls=clear

    改完並不能直接生效,因為shell讀取配置檔案是在登入時
    可以重新登入 或退出當前shell,再進入
    或者使用  source .


如何使用者登入後,顯示出一段歡迎資訊?  echo  xxx
    啟動執行命令---profile類
    ~/.bash_profile 或 /etc/profile

    vi ~/.bash_profile
        ...
        echo "hello,hive,welcome to our system. It is `date`."


umask寫入檔案
    vi ~/.bash_profile
        ...
        umask 027

問:為什麼普通使用者得umask預設是002?
     cat /etc/bashrc
        ...
        if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then
           umask 002
        else
           umask 022
        fi


問:root和普通使用者得$PATH不一樣,是哪裡設定得,怎麼追加新的路徑進去?
    .bash_profile中設定,  PATH=$PATH:/bin/go 或直接檔案中新增


IO:
    stdin  0   標準輸入          預設鍵盤
    stdout 1   標準輸出          預設顯示器    
    stderr 2   標準錯誤輸出        預設顯示器    

IO重定向: 改變資料得輸入輸出來源
    >  輸出重定向,會覆蓋
    >> 追加式

    ls /var > /tmp/var.out
    cat /etc/fstab > /tmp/var.out
    ls /var >> /tmp/var.out

bash有一個內建的set命令,可以設定某些功能開關
    type set
    set -C    禁止對已經存在的檔案使用覆蓋重定向;如果要強制覆蓋,則使用 >|
        ls /usr >| /tmp/var.out  
    set +C    關閉上述功能


問:ls /varr > /tmp/var2.out ,  沒有/varr,會報錯,錯誤資訊會儲存到/tmp/var2.out檔案嗎?
    不會,因為這裡是正確的資訊重定向,是不同的輸出流

2> 重定向錯誤輸出
2>>  追加方式

    ls /varr 2> /tmp/var2.out 

    假如是正常的執行  ls /var 2> /tmp/var2.out , 結果是輸出到螢幕,還是到檔案?
        輸出到螢幕,但是要注意,/tmp/var2.out中會覆蓋為空白

能不能既定向標準輸出,又定向標準錯誤輸出?
    ls /varr > /tmp/var3.out 2> /tmp/err.out

    儲存到同一個檔案   
        ls /var > /tmp/var4.out 2> /tmp/var4.out
        ls /varr > /tmp/var4.out 2> /tmp/var4.out

&> 重定向到標準輸出 或 錯誤輸出  至同一個檔案
    ls /var6 &> /tmp/var5.out
    ls /var &> /tmp/var5.out


<  輸入重定向
    cat   等待輸入
    cat < /etc/fstab
    cat /etc/fstab

    一般的命令接收檔案並顯示出來,就預設帶有輸入重定向的概念
    有些命令是不能接收檔案的

    tr 'a-z' 'A-Z'
    tr 'a-z' 'A-Z' < /etc/fstab 

 << here document
    [root@localhost ~]# cat << END
    > the first line.
    > the second line.
    > END
    the first line.
    the second line.

    結束符:常用 END ,EOF 

[root@localhost ~]# cat >> /tmp/myfile.txt << EOF
    > the first line.
    > the second line.
    > EOF
    [root@localhost ~]# cat /tmp/myfile.txt 
    the first line.
    the second line.
 這個方式可以在指令碼中生成文件檔案


問:既儲存到檔案,又顯示到螢幕??? tee


管道:前一個命令的輸出,當作後一個命令的輸入
    cmd1 | cmd2 | cmd3 | ...

    echo 'hello world' | tr 'a-z' 'A-Z'
    echo 'redhat' | passwd --stdin hive
    cat /etc/passwd | sort
    cut -d: -f1 /etc/passwd | sort
    cut -d: -f3 /etc/passwd | sort -n
    cut -d: -f1 /etc/passwd | sort | tr 'a-z' 'A-Z'

問:將一個目錄下的所有檔案的檔名換成大寫?
    ls /var | tr 'a-z' 'A-Z'


tee 讀取標準輸入,並寫到標準輸出和檔案
    echo 'hello world." | tee /tmp/hello.out

問:顯示一個檔案的行數,只顯示行數,不顯示額外資訊?
    wc -l /etc/passwd | cut -d' ' -f1


1、統計/usr/bin/目錄下的檔案個數;
    ls /usr/bin | wc -l

    ls -l /usr/bin | head -1
    ls -l /usr/bin | wc -l

2、取出當前系統上所有使用者的shell,要求,每種shell只顯示一次,並且按順序進行顯示;
    cut -d: -f7 /etc/passwd | sort -u

    統計每種shell出現的次數?cut -d: -f7 /etc/passwd | sort | uniq -c

3、如何顯示/var/log目錄下每個檔案的內容型別?
    file /var/log/*
    不使用萬用字元,能否實現?
        cd /var/log
        file `ls /var/log`   (其它目錄下執行 file `ls /var/log` 路徑會出問題  )

4、取出/etc/inittab檔案的第6行;
    head -6 /etc/inittab | tail -1

5、取出/etc/passwd檔案中倒數第9個使用者的使用者名稱和shell,顯示到螢幕上並將其儲存至/tmp/users檔案中;
    tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users

6、顯示/etc目錄下所有以pa開頭的檔案,並統計其個數;
    ls -d /etc/pa* | wc -l

7、不使用文字編輯器,將alias cls=clear一行內容新增至當前使用者的.bashrc檔案中;
    echo "alias cls=clear" >> ~/.bashrc

本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風