以使用者角度看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 協議》,轉載必須註明作者和本文連結