本文主要介紹「linux 發行版本」、「cpu 架構」、「Linux 目錄結構」、「vi 和 vim」、「使用者管理」、「檔案目錄指令」、「docker 安裝 ubuntu20.04」。
注:筆者使用的是 ubuntu 20.04 桌面版。
linux 主要發行版有 ubuntu、redhat、centos等等,都是linux 核心,其他的可能就不同了。不同發行版的很多指令都類似,比如你學會了 ubuntu,在 centos 上也能快速上手。
首先有 unix,但它的價格昂貴,不能執行於 x86 的 PC。
有個荷蘭的教授寫了一個叫 MINIX 的作業系統,向學生展示作業系統的內部原理,並將其程式碼開源。全世界學計算機的學生都通過鑽研 MINIX 來作業系統,其中有一位芬蘭大學學生,於 1991 年寫出了 Linux 0.01。
Tip:更多介紹請看百度百科
cpu 架構有 aarch64
、loongarch64
、mips64
、x86_64
(也是AMD64
)
不同的架構可以簡單理解為指令集不同。
windows 分 C槽、D槽,而 linux 已經幫我們分好了,例如我們在 /
目錄下檢視檔案資訊:
pjl@pjl:/$ ls
bin boot cdrom data dev etc home lib lib32 lib64 libx32 lost+found media mnt opt proc root run sbin snap srv swapfile sys tmp usr var
每個目錄的作用請看下文。
/bin
,存放最經常使用的命令。例如裡面有 whoami
、su
、sudo
等命令
pjl@pjl:/$ ll /bin
lrwxrwxrwx 1 root root 7 12月 7 2021 /bin -> usr/bin/
pjl@pjl:/$ ll usr/bin/ |grep 'whoami'
-rwxr-xr-x 1 root root 39256 9月 5 2019 whoami*
/home
,存放普通使用者的主目錄。例如我增加一個使用者 pjl,home目錄下也會增加一個 pjl 的目錄。請看範例:
pjl@pjl:/$ sudo adduser pjl
[sudo] pjl 的密碼:
正在新增使用者"pjl"...
正在新增新組"pjl" (1004)...
正在新增新使用者"pjl" (1004) 到組"pjl"...
建立主目錄"/home/pjl"...
正在從"/etc/skel"複製檔案...
新的 密碼:
重新輸入新的 密碼:
passwd:已成功更新密碼
正在改變 pjl 的使用者資訊
請輸入新值,或直接敲確認鍵以使用預設值
全名 []:
房間號碼 []:
工作電話 []:
家庭電話 []:
其它 []:
這些資訊是否正確? [Y/n] pjl@pjl:/$
home 目錄下增加使用者 pjl 同名的家目錄:
pjl@pjl:/$ ll /home
總用量 32
drwxr-xr-x 8 root root 4096 6月 8 20:22 ./
drwxr-xr-x 23 root root 4096 6月 8 10:48 ../
drwxr-xr-x 2 pjl pjl 4096 6月 8 20:22 pjl/
/root
,超級許可權者的使用者主目錄。普通使用者不能檢視:
pjl@pjl:/$ ll /root
ls: 無法開啟目錄 '/root': 許可權不夠
切換 root 使用者後檢視:
pjl@pjl:/$ su
密碼:
su: 認證失敗
pjl@pjl:/$ su
密碼:
root@pjl:/# ll /root
總用量 2012
drwx------ 28 root root 4096 6月 8 11:18 ./
drwxr-xr-x 23 root root 4096 6月 8 10:48 ../
drwxr-xr-x 2 root root 4096 6月 6 10:52 公共的/
drwxr-xr-x 2 root root 4096 6月 6 10:52 模板/
drwxr-xr-x 2 root root 4096 6月 6 10:52 視訊/
drwxr-xr-x 2 root root 4096 6月 6 10:52 圖片/
drwxr-xr-x 2 root root 4096 6月 6 10:52 檔案/
drwxr-xr-x 2 root root 4096 6月 6 10:52 下載/
drwxr-xr-x 2 root root 4096 6月 6 10:52 音樂/
drwxr-xr-x 2 root root 4096 6月 6 10:52 桌面/
...
/lib
,系統開機所需要的最基本的動態連結共用庫,類似 windows 中 DLL 檔案。幾乎所有應用程式都需要用到這些共用庫
/lost+found
,通常為空,系統非法關機後,就存放一些檔案
pjl@pjl:~$ ls /lost+found/
ls: 無法開啟目錄 '/lost+found/': 許可權不夠
pjl@pjl:~$ sudo ls /lost+found/
[sudo] pjl 的密碼:
/etc
,系統管理所需的組態檔和子目錄。例如 nginx、mysql、python、docker:
pjl@pjl:~$ ls /etc |grep -E 'mysql|nginx|docker|python'
docker
mysql
nginx
python2.7
python3
python3.8
nginx 的組態檔:
pjl@pjl:~$ ls /etc/nginx | grep '.conf'
fastcgi.conf
nginx.conf
/usr
,使用者很多的應用程式和檔案都在此,類似 windows 下的 Program Files
:
pjl@pjl:~$ ls /usr
bin games include lib lib32 lib64 libexec libx32 local sbin share src
/boot
,存放啟動 linux 時使用的一些核心檔案。包括一些連結檔案和映象檔案:
pjl@pjl:~$ ls /boot
config-5.13.0-41-generic efi initrd.img-5.13.0-41-generic initrd.img.old memtest86+_multiboot.bin System.map-5.13.0-48-generic vmlinuz-5.13.0-44-generic
config-5.13.0-44-generic grub initrd.img-5.13.0-44-generic memtest86+.bin System.map-5.13.0-41-generic vmlinuz vmlinuz-5.13.0-48-generic
config-5.13.0-48-generic initrd.img initrd.img-5.13.0-48-generic memtest86+.elf System.map-5.13.0-44-generic vmlinuz-5.13.0-41-generic vmlinuz.old
/proc
,虛擬目錄,它是系統記憶體的對映,存取這個目錄獲取系統資訊
root@97342c74a502:/# ls /proc
1 cmdline dma ioports kpagecgroup modules schedstat thread-self zoneinfo
10 config.gz driver irq kpagecount mounts self timer_list
160 consoles execdomains kallsyms kpageflags mtrr softirqs tty
acpi cpuinfo filesystems kcore loadavg net stat uptime
buddyinfo crypto fs key-users locks pagetypeinfo swaps version
bus devices interrupts keys meminfo partitions sys vmallocinfo
cgroups diskstats iomem kmsg misc sched_debug sysvipc vmstat
/srv
,service縮寫,存放一些服務啟動之後需要提取的資料
pjl@pjl:~$ ls /srv
ftp
/sys
,這是 linux 2.6 核心的一個很大的變化
pjl@pjl:~$ ls /sys
block bus class dev devices firmware fs hypervisor kernel module power
/tmp
,存放一些臨時檔案
/dev
,類似 windows 的裝置管理器,把所有硬體用檔案儲存。比如筆者 cpu 有 4 核
pjl@pjl:~$ ls /dev/cpu
0 1 2 3 microcode
/media
,linux 會自動識別一些裝置,例如 U 盤,識別後將會把該裝置掛載到這個目錄下。
/mnt
,用於讓使用者臨時掛載別的檔案系統
/opt
,給主機額外安裝軟體的目錄。例如安裝資料庫,預設為空。筆者安裝了百度網路硬碟
pjl@pjl:~$ ls /opt
baidunetdisk google sogoupinyin teamviewer
/usr/local
,另一個給主機額外安裝軟體的目錄。一般通過編譯原始碼方式安裝的程式
pjl@pjl:~$ ls /usr/local
bin etc games include lib man rvm sbin share src
/var
,存放不斷擴充的東西,習慣將經常修改的目錄放在這裡,例如紀錄檔檔案
pjl@pjl:~$ ls /var
backups cache crash lib local lock log mail metrics opt run snap spool tmp www
linux 會內建 vi 文字編輯器。vim 是增強版。
編輯器有三種模式:
Tip:通過 vim 預設進去的就是正常模式,退出(:q!
)或儲存退出(:wq
)屬於命令模式,通過輸入 i
進入編輯模式。
模式切換:
i
進入編輯模式esc
進入正常模式:
或 /
進入命令模式esc
進入正常模式Tip:退出有以下三種:
:wq
儲存退出:q
退出。有時退出失敗,提示我們使用強制退出:E37: 已修改但尚未儲存 (可用 ! 強制執行)
:q!
強制退出,不儲存複製一行 yy
,複製 5 行 5yy
,貼上輸入 p
。需要在正常模式下進行。
在正常模式,遊標在第一行,輸入 yy,接著輸入 p:
a
b
c
d
e
檔案內容變為:
a
a
b
c
d
e
刪除當前行 dd
,刪除當前行向下3行,輸入 3dd
即可。需在正常模式下進行。
正常模式輸入 /
進入命令模式,輸入要找的單詞,例如 test,然後輸入回車,接著輸入 n
就能匹配下一個,到底了會提示「已查詢到檔案結尾,再從開頭繼續查詢」,繼續輸入 n
就會從頭開始。
如果需要找其他單詞,輸入 /
,在輸入其他單詞例如 apple,如果要編輯找到的這個 apple,輸入 i
進入編輯模式即可。
命令列下輸入 :set nu
,顯示行號。如下所示:
...
7 # the default umask is set in /etc/profile; for setting the umask
8 # for ssh logins, install and configure the libpam-umask package.
9 #umask 022
Tip:輸入 :set nonu
隱藏行號
正常模式下,gg
首行,G
末行。
比如輸入在某行輸入 aa bb cc
,想撤回,回到正常模式,輸入 u
即可。對刪除的某行(dd)等操作同樣適用
一般模式下輸入行號,例如 99,然後輸入 shift+g
即可
linux 是多使用者,多工的作業系統。
通過 adduser
建立使用者。請看範例:
root@pjl:/# adduser test11
正在新增使用者"test11"...
正在新增新組"test11" (1007)...
正在新增新使用者"test11" (1007) 到組"test11"...
建立主目錄"/home/test11"...
正在從"/etc/skel"複製檔案...
新的 密碼:
重新輸入新的 密碼:
passwd:已成功更新密碼
正在改變 test11 的使用者資訊
請輸入新值,或直接敲確認鍵以使用預設值
全名 []:
房間號碼 []:
工作電話 []:
家庭電話 []:
其它 []:
這些資訊是否正確? [Y/n]
家目錄下已增加新增使用者 test11:
root@pjl:/# ll /home
總用量 40
drwxr-xr-x 10 root root 4096 6月 14 16:40 ./
drwxr-xr-x 23 root root 4096 6月 8 10:48 ../
drwxr-xr-x 2 test11 test11 4096 6月 14 16:40 test11/
通過 passwd 可以修改使用者密碼。請看範例:
test11@pjl:/$ passwd test11
更改 test11 的密碼。
Current password:
新的 密碼:
重新輸入新的 密碼:
passwd:已成功更新密碼
Tip:遠端工具通過 test11 登入成功後,預設會進入該使用者的家目錄:
test11@pjl:~$ pwd
/home/test11
test11@pjl:~$
通過 su -
切換使用者。例如切換到 root 使用者:
test10@pjl:~$ su - root
密碼:
root@pjl:~# su - test10
test10@pjl:~$ su - test11
密碼:
su: 認證失敗
test10@pjl:~$ su - test11
密碼:
Tip:許可權高的使用者切換到許可權低的無需輸入密碼。反之卻需要輸入密碼。
通過 userdel
可以刪除使用者。比如刪除使用者 test200,但保留家目錄:
root@pjl:/home# userdel test200
root@pjl:/home# ls
test200
通過 -r
刪除使用者,同時刪除其家目錄:
root@pjl:/home# ls
test201 vncuser
root@pjl:/home# userdel -r test201
userdel:test201 信件池 (/var/mail/test201) 未找到
test201 使用者的家目錄已刪除:
root@pjl:/home# ls
vncuser
Tip:比如張三離職,一般情況保留其家目錄,萬一留有重要成果。更多介紹請通過 -h 檢視:
root@pjl:/home# userdel -h
用法:userdel [選項] 登入名
選項:
-f, --force 即使不屬於此使用者,也強制刪除檔案
-h, --help 顯示此幫助資訊並退出
-r, --remove 刪除主目錄和信件池
-R, --root CHROOT_DIR chroot 到的目錄
-P, --prefix PREFIX_DIR prefix directory where are located the /etc/* files
--extrausers Use the extra users database
-Z, --selinux-user 為使用者刪除所有的 SELinux 使用者對映
通過 id 可查詢使用者資訊。請看範例:
root@pjl:/home# id root
使用者id=0(root) 組id=0(root) 組=0(root)
root@pjl:/home# id test10
使用者id=1006(test10) 組id=1006(test10) 組=1006(test10)
root@pjl:/home# id test111
id: 「test111」:無此使用者
whoami
,查詢當前使用者:
root@pjl:/home# whoami
root
Tip:通過 who am i
可以檢視什麼時間(2022-06-14 16:46),從哪臺機器(192.168.1.225),什麼使用者(test11)登入這個 linux 終端。
root@pjl:/home# who am i
test11 pts/6 2022-06-14 16:46 (192.168.1.225)
使用者組類似角色,方便管理。
增加組使用 groupadd
,刪除組使用 groupde
。請看範例:
# 增加組 agroup
root@pjl:/home# groupadd agroup
# 刪除組 agroup
root@pjl:/home# groupdel agroup
建立使用者 test30 並放入 agroup 組中:
root@pjl:/home# useradd -g agroup test30
test30 確實已經屬於 agroup 組:
root@pjl:/home# id test30
使用者id=1010(test30) 組id=1010(agroup) 組=1010(agroup)
注:如果建立使用者時不指定組,系統會建立一個與使用者同名的組:
root@pjl:/home# adduser test40
root@pjl:/home# id test40
使用者id=1011(test40) 組id=1011(test40) 組=1011(test40)
usermod
切換使用者所屬組。例如將 test40 放入 bgroup 組:
root@pjl:/home# groupadd bgroup
root@pjl:/home# usermod -g bgroup test40
root@pjl:/home# id test40
使用者id=1011(test40) 組id=1012(bgroup) 組=1012(bgroup)
使用者和組相關的有三個檔案:
使用者的組態檔,記錄使用者的各種資訊。請看範例:
test11@pjl:~$ cat /etc/passwd
// 使用者名稱:口令:使用者id:組id:註釋性描述:家目錄:使用的shell
test40:x:1011:1012:,,,:/home/test40:/bin/bash
...
口令組態檔:
root@pjl:/home/test11# cat /etc/shadow
// ! 這裡是密碼
// 19157 等資訊都是處理過,看不懂的
test40:!:19157:0:99999:7:::
比如給 test40 設定密碼(比如123456
)
root@pjl:/home/test11# passwd test40
新的 密碼:
重新輸入新的 密碼:
passwd:已成功更新密碼
再次檢視 /etc/shadow
,發現密碼加密顯示了:
test40:$6$JF.ed3d.S9RHucx.$13bXH9Ji3P8AGB2tsCnjRI8AFhp301F3HWzquzKCBTQWzS3..D6lvgKTsOLWuY1nwogtBcGdiZp5mGN69Ar7E.:19158:0:99999:7:::
組的組態檔:
root@pjl:/home/test11# cat /etc/group
bgroup:x:1012:
上面我們將 test40 使用者放入 bgroup。這裡的 1012 與使用者組態檔中的組 id 相對應。
比如通過 man
檢視 ls
命名。請看範例:
root@pjl:/home/test11# man ls
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
...
-l use a long listing format
點選空格
能翻頁,輸入 q
就能退出:
Tip:筆者使用 mobaxterm 能通過滑鼠向上向下捲動。
root@pjl:/home/test11#
ls 較常用的兩個引數, a
顯示所有檔案檔案。linux 中,隱藏檔案以 .
開頭:
root@pjl:/home/test11# ls
root@pjl:/home/test11# ls -a
. .. .bash_history .bash_logout .bashrc .cache .config .local .profile .Xauthority
l
是以列表的形式顯示資訊。引數可以組合使用,不要求順序:
root@pjl:/home/test11# ls -l
總用量 0
root@pjl:/home/test11# ls -la
總用量 40
drwxr-xr-x 5 test11 test11 4096 6月 15 18:55 .
drwxr-xr-x 12 root root 4096 6月 14 17:21 ..
-rw------- 1 test11 test11 86 6月 14 17:27 .bash_history
-rw-r--r-- 1 test11 test11 220 6月 14 16:40 .bash_logout
-rw-r--r-- 1 test11 test11 3771 6月 14 16:40 .bashrc
drwx------ 4 test11 test11 4096 6月 14 16:46 .cache
drwx------ 4 test11 test11 4096 6月 14 16:46 .config
drwxr-xr-x 3 test11 test11 4096 6月 14 16:46 .local
-rw-r--r-- 1 test11 test11 807 6月 14 16:40 .profile
-rw------- 1 test11 test11 108 6月 15 18:55 .Xauthority
help 能檢視 shell 內建命令。例如 cd
,請看範例:
root@pjl:/home/test11# help cd
cd: cd [-L|[-P [-e]] [-@]] [目錄]
改變 shell 工作目錄。
改變當前目錄至 DIR 目錄。預設的 DIR 目錄是 shell 變數 HOME
的值。
變數 CDPATH 定義了含有 DIR 的目錄的搜尋路徑,其中不同的目錄名稱由冒號 (:)分隔。
一個空的目錄名稱表示當前目錄。如果要切換到的 DIR 由斜槓 (/) 開頭,則 CDPATH
不會用上變數。
如果路徑找不到,並且 shell 選項 `cdable_vars' 被設定,則引數詞被假定為一個
變數名。如果該變數有值,則它的值被當作 DIR 目錄。
選項:
-L 強制跟隨符號連結: 在處理 `..' 之後解析 DIR 中的符號連結。
-P 使用物理目錄結構而不跟隨符號連結: 在處理 `..' 之前解析 DIR 中的符號連結。
-e 如果使用了 -P 引數,但不能成功確定當前工作目錄時,返回非零的返回值。
-@ 在支援拓展屬性的系統上,將一個有這些屬性的檔案當作有檔案屬性的目錄。
預設情況下跟隨符號連結,如同指定 `-L'。
`..' 使用移除向前相鄰目錄名成員直到 DIR 開始或一個斜槓的方式處理。
退出狀態:
如果目錄改變,或在使用 -P 選項時 $PWD 修改成功時返回 0,否則非零。
注:man 檢視 cd 失敗;help 檢視 ls 也失敗。請看範例:
root@pjl:/home/test11# man cd
沒有 cd 的手冊頁條目
root@pjl:/home/test11# help ls
bash: help: 沒有與「ls」匹配的幫助主題。嘗試使用「help help」、「man -k ls」或「info ls」。
pwd
用這兩個幫助指令都可以。
如果覺得 ls --help
不詳細,可以使用 info ls
:
root@97342c74a502:/# info ls
Next: dir invocation, Up: Directory listing
10.1 'ls': List directory contents
==================================
The 'ls' program lists information about files (of any type, including
directories). Options and file arguments can be intermixed arbitrarily,
as usual.
...
pwd
,檢視當前目錄所在的絕對路徑。請看範例:
root@pjl:/home/test11# pwd
/home/test11
cd ~
回到家目錄。請看範例
// 目前在 tmp
test11@pjl:~/tmp$ pwd
/home/test11/tmp
test11@pjl:~/tmp$ cd ~
// 已回到test11 使用者的家目錄
test11@pjl:~$ pwd
/home/test11
cd ..
返回上一層目錄。
mkdir
,建立目錄,預設建立一級目錄,多級目錄需要使用 -p
引數。例如建立 e、f、g 三個目錄:
test11@pjl:/tmp$ mkdir -p e/f/g
test11@pjl:/tmp$ cd e/f/g/
test11@pjl:/tmp/e/f/g$
rmdir
,刪除空目錄。非空目錄可以使用 rm -rf
。請看範例:
test11@pjl:~/tmp$ rmdir e
rmdir: 刪除 'e' 失敗: 目錄非空
test11@pjl:~/tmp$ rm -rf e
通過 rm --help
知道:r 表示遞迴,f 指強制刪除
。
rm 也能刪除檔案,或同時刪除非空目錄 a 和 a.txt 檔案。請看範例:
test11@pjl:~/tmp$ rm -rf a a.txt
touch
建立一個空檔案。
test11@pjl:~/tmp$ touch b.txt
test11@pjl:~/tmp$ ls
b.txt
cp
拷貝檔案或目錄。例如將 b.txt 拷貝到 資料夾 c 中:
# 建立多級目錄
test11@pjl:~/tmp$ mkdir -p a/b/c
# 將 b.txt 拷貝到資料夾 c 中
test11@pjl:~/tmp$ cp b.txt a/b/c
test11@pjl:~/tmp$ ls a/b/c
b.txt
通過引數 -r
將非空目錄 a 整個拷貝到上層目錄。請看範例:
# 拷貝非空目錄失敗
test11@pjl:~/tmp$ cp a ../
cp: 未指定 -r;略過目錄'a'
test11@pjl:~/tmp$ cp a -r ../
test11@pjl:~/tmp$ ls ../
a tmp
多次執行拷貝,未提示是否需要覆蓋。
test11@pjl:~/tmp$ cp a -r ../
Tip:筆者是ubuntu20.04,並且也修改了 a/b/c/b.txt 這個檔案。
mv
移動目錄或檔案,也可以重新命名。請看範例:
test11@pjl:~$ ls
a tmp
# 將 a 重新命名為 a2
test11@pjl:~$ mv a a2
test11@pjl:~$ ls
a2 tmp
移動並重新命名。將 b.txt 移動到上一層目錄,並重新命名:
test11@pjl:~/tmp$ mv b.txt ../b-rename.txt
test11@pjl:~/tmp$ ls ../
b-rename.txt tmp
移動 a 資料夾,並重新命名:
test11@pjl:~/tmp$ mv a ../a-rename
test11@pjl:~/tmp$ cd ../a-rename/b
# 檢驗:a中有b
test11@pjl:~/a-rename/b$
cat
檢視檔案內容。唯讀,更安全。請看範例:
# n 顯示行號
test11@pjl:~/a-rename/b$ cat -n /etc/profile
...
10 fi
11 else
12 if [ "`id -u`" -eq 0 ]; then
13 PS1='# '
14 else
15 PS1='$ '
16 fi
17 fi
可配合 more
使用:
test11@pjl:~/a-rename/b$ cat -n /etc/profile | more
1 # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
2 # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
3
4 if [ "${PS1-}" ]; then
5 if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
6 # The file bash.bashrc already sets the default PS1.
7 # PS1='\h:\w\$ '
8 if [ -f /etc/bash.bashrc ]; then
9 . /etc/bash.bashrc
10 fi
11 else
12 if [ "`id -u`" -eq 0 ]; then
13 PS1='# '
14 else
15 PS1='$ '
16 fi
17 fi
18 fi
19
20 if [ -d /etc/profile.d ]; then
21 for i in /etc/profile.d/*.sh; do
22 if [ -r $i ]; then
23 . $i
--更多--
more
,適合螢幕檢視的檔案閱讀輸出工具。基於 vi
編輯器的文字過濾器,以全螢幕幕的方式顯示檔案內容。可以配合管道使用,也可以單獨使用。
例如檢視檔案:
test11@pjl:~/a-rename/b$ more /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
--更多--(77%)
內建許多快捷鍵:
q
- 退出 more空格
- 向下翻頁回車
- 向下一行ctrl + f
- 向下一屏ctrl + b
- 向上一屏=
- 輸出當前行號:f
- 輸出檔名和當前行號less
,功能與 more
類似,功能比 more 更強大。less 顯示檔案內容時,不是一次將整個檔案載入之後才顯示,對顯示大型檔案有較好的效率。
內建許多快捷鍵:
q
- 退出空格
- 向下翻頁page down
- 向下翻頁page up
- 向上翻頁/字串
- 向下搜尋字串。n
向下查詢;N
向上查詢。echo
,輸出內容到控制檯。請看範例:
# 輸出字串
root@97342c74a502:/# echo 'hello world'
hello world
# 輸出內建變數
root@97342c74a502:/# echo $SHELL
/bin/bash
head
,用於顯示檔案開頭部分,預設前 10 行。請看範例:
test11@pjl:~/a-rename/b$ head /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
假如只要顯示前 5 行,可以使用引數 n
。請看範例:
test11@pjl:~/a-rename/b$ head /etc/profile -n 5
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "${PS1-}" ]; then
if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
tail
, 與 head 對應,預設顯示檔案末尾 10 行。也能指定顯示末尾 5 行。
test11@pjl:~/a-rename/b$ tail /etc/profile
if [ -r $i ]; then
. $i
fi
done
unset i
fi
export ANDROID_HOME=/home/pjl/software/android-studio-2021.1.1.22-linux/android-studio/bin
export PATH=$PATH:$ANDROID_HOME
tail -f filename
,隨檔案增長即時輸出新增資料,也就是能監聽檔案。請看範例:
# 新建檔案 a.txt
test11@pjl:~/a-rename/b$ touch a.txt
# 監聽檔案輸出。此刻終端不會結束,一直監聽著
test11@pjl:~/a-rename/b$ tail -f a.txt
另開一個終端,將字串(apple
)輸出(或重定向)到 a.txt 檔案中:
test11@pjl:~/a-rename/b$ echo 'apple' > a.txt
立刻監聽到並輸出:
test11@pjl:~/a-rename/b$ tail -f a.txt
apple
>
輸出重定向。例如將 pwd 結果輸出到 a.txt,這是一個覆蓋操作:
test11@pjl:~/tmp$ touch a.txt
test11@pjl:~/tmp$ pwd > a.txt
test11@pjl:~/tmp$ cat a.txt
/home/test11/tmp
test11@pjl:~/tmp$ ls > a.txt
test11@pjl:~/tmp$ cat a.txt
a.txt
>>
則是追加。例如將 pwd 的結果追加到 a.txt 檔案中:
test11@pjl:~/tmp$ pwd >> a.txt
test11@pjl:~/tmp$ cat a.txt
a.txt
/home/test11/tmp
ln -s
建立軟連結,類似 windows 下快捷鍵。
語法:
ln -s 檔案或目錄 軟連線名
例如給 a 建立一個軟連結 ln-a:
test11@pjl:~/tmp$ ln -s a ln-a
test11@pjl:~/tmp$ ll
總用量 16
drwxrwxr-x 3 test11 test11 4096 6月 17 14:22 ./
drwxr-xr-x 8 test11 test11 4096 6月 17 14:13 ../
drwxrwxr-x 3 test11 test11 4096 6月 17 14:22 a/
lrwxrwxrwx 1 test11 test11 1 6月 17 14:22 ln-a -> a/
刪除軟連線可以使用 rm
,類似刪除一個檔案:
test11@pjl:~/tmp$ ls
a ln-a
# 刪除軟連結
test11@pjl:~/tmp$ rm ln-a
# 軟連結已被刪除
test11@pjl:~/tmp$ ls
a
Tip:為什麼要加 -s
,通過 ln --help
有這麼一段資訊:-s, --symbolic 建立符號連結而非硬連結
,也就是說加上 s
就是建立軟連結。
history
檢視已執行過的歷史命令,也可以執行歷史命令。
檢視所有歷史命令:
$ history
...
170 ls
171 cd ..
172 ls
173 rm ln-a
174 ls
175 history
176 history |more
177 ls
178 history
檢視最近 5 條歷史命令:
test11@pjl:~/tmp$ history 5
176 history |more
177 ls
178 history
179 ls
180 history 5
執行第 177(這裡是 ls
命名) 條歷史命令:
test11@pjl:~/tmp$ !177
ls
a a.txt
常用的執行級別有 3
和 5
:
可以通過 init
來切換執行級別,例如 init 0
等於關機。
Tip:可以通過 --help
檢視 init
命名。
root@pjl:/home/test11# init --help
init [OPTIONS...] COMMAND
Send control commands to the init daemon.
Commands:
0 Power-off the machine
6 Reboot the machine
2, 3, 4, 5 Start runlevelX.target unit
1, s, S Enter rescue mode
q, Q Reload init daemon configuration
u, U Reexecute init daemon
Options:
--help Show this help
--no-wall Don't send wall message before halt/power-off/reboot
See the telinit(8) man page for details.
當前執行級別是圖形化。請看範例:
root@pjl:/home/test11# systemctl get-default
graphical.target
比如將執行級別設定為 3:
root@pjl:/home/test11# systemctl set-default multi-user.target
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.
root@pjl:/home/test11# systemctl get-default
multi-user.target
注:如果這麼做,重啟(reboot
)後直接進入級別 3,能夠節省資源。
筆者不想安裝虛擬機器器,為圖方便,直接在筆電中安裝 ubuntu。
筆者已經在 win10 中安裝 Docker Desktop。
Tip: 有關 docker 的介紹請看 初步認識 docker。
下載映象:
$ docker pull ubuntu:22.04
建立一個名為 ubuntu-test 的容器:
PS C:\Users\78614> docker run -itd --name ubuntu-test ubuntu:20.04
通過 exec 命令進入 ubuntu 容器,指定通過 bash 進行互動:
PS C:\Users\78614> docker exec -it ubuntu-test /bin/bash
root@5dbf1344541e:/# whoami
root
docker 下的 ubuntu 映象沒有 vi 命令。
root@5dbf1344541e:/# vi
bash: vi: command not found
root@5dbf1344541e:/# vim
bash: vim: command not found
如果需要 vi ,我們需要安裝它。
據網友介紹:
apt-get
/dpkg
:適用於Debian、Ubuntu等平臺rpm/yum
:適用於 Redhat、CentOS、Suse等平臺zypper
:適合於Suse平臺筆者依次輸入 rpm
、yum
、apt-get
,發現 apt-get
生效:
root@9b385d9791f6:~# rpm
bash: rpm: command not found
root@9b385d9791f6:~# yum
bash: yum: command not found
root@9b385d9791f6:~# apt-get
apt 2.0.8 (amd64)
Usage: apt-get [options] command
apt-get [options] install|remove pkg1 [pkg2 ...]
apt-get [options] source pkg1 [pkg2 ...]
通過 --help
檢視 apt-get
:
root@5dbf1344541e:/# apt-get --help
apt 2.0.8 (amd64)
Usage: apt-get [options] command
apt-get [options] install|remove pkg1 [pkg2 ...]
apt-get [options] source pkg1 [pkg2 ...]
apt-get is a command line interface for retrieval of packages
and information about them from authenticated sources and
for installation, upgrade and removal of packages together
with their dependencies.
Most used commands:
update - Retrieve new lists of packages
upgrade - Perform an upgrade
install - Install new packages (pkg is libc6 not libc6.deb)
reinstall - Reinstall packages (pkg is libc6 not libc6.deb)
remove - Remove packages
purge - Remove packages and config files
autoremove - Remove automatically all unused packages
dist-upgrade - Distribution upgrade, see apt-get(8)
dselect-upgrade - Follow dselect selections
build-dep - Configure build-dependencies for source packages
satisfy - Satisfy dependency strings
clean - Erase downloaded archive files
autoclean - Erase old downloaded archive files
check - Verify that there are no broken dependencies
source - Download source archives
download - Download the binary package into the current directory
changelog - Download and display the changelog for the given package
See apt-get(8) for more information about the available commands.
Configuration options and syntax is detailed in apt.conf(5).
Information about how to configure sources can be found in sources.list(5).
Package and version choices can be expressed via apt_preferences(5).
Security details are available in apt-secure(8).
This APT has Super Cow Powers.
使用 apt-get
安裝 vi,報錯:
root@9b385d9791f6:~# apt-get install vi
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vi
通過apt-get update
檢索新的包列表:
root@9b385d9791f6:~# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1324 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:8 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [30.3 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1404 kB]
Get:12 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1170 kB]
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2407 kB]
Get:14 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [54.2 kB]
Get:15 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [27.1 kB]
Get:16 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1974 kB]
91% [16 Packages 710 kB/1974 kB 36%]
...
Reading package lists... 80%
Reading package lists... Done
再次通過 apt-get 安裝 vi,依然失敗:
root@9b385d9791f6:~# apt-get install vi
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vi
嘗試安裝 vim,成功:
root@9b385d9791f6:~# apt-get install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
alsa-topology-conf alsa-ucm-conf file libasound2 libasound2-data libcanberra0 libexpat1 libgpm2 libltdl7 libmagic-mgc libmagic1 libmpdec2 libogg0 libpython3.8 libpython3.8-minimal libpython3.8-stdlib
libreadline8 libsqlite3-0 libssl1.1 libtdb1 libvorbis0a libvorbisfile3 mime-support readline-common sound-theme-freedesktop vim-common vim-runtime xxd xz-utils
Suggested packages:
libasound2-plugins alsa-utils libcanberra-gtk0 libcanberra-pulse gpm readline-doc ctags vim-doc vim-scripts
The following NEW packages will be installed:
alsa-topology-conf alsa-ucm-conf file libasound2 libasound2-data libcanberra0 libexpat1 libgpm2 libltdl7 libmagic-mgc libmagic1 libmpdec2 libogg0 libpython3.8 libpython3.8-minimal libpython3.8-stdlib
libreadline8 libsqlite3-0 libssl1.1 libtdb1 libvorbis0a libvorbisfile3 mime-support readline-common sound-theme-freedesktop vim vim-common vim-runtime xxd xz-utils
0 upgraded, 30 newly installed, 0 to remove and 7 not upgraded.
Need to get 14.9 MB of archives.
After this operation, 70.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libmagic-mgc amd64 1:5.38-4 [218 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 libmagic1 amd64 1:5.38-4 [75.9 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal/main amd64 file amd64 1:5.38-4 [23.3 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libexpat1 amd64 2.2.9-1ubuntu0.4 [74.4 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal/main amd64 libmpdec2 amd64 2.4.2-3 [81.1 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libssl1.1 amd64 1.1.1f-1ubuntu2.13 [1321 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libpython3.8-minimal amd64 3.8.10-0ubuntu1~20.04.4 [717 kB]
Get:8 http://archive.ubuntu.com/ubuntu focal/main amd64 mime-support all 3.64ubuntu1 [30.6 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 readline-common all 8.0-4 [53.5 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal/main amd64 libreadline8 amd64 8.0-4 [131 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 libsqlite3-0 amd64 3.31.1-4ubuntu0.3 [549 kB]
22% [11 libsqlite3-0 158 kB/549 kB
...
update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/vim.1.gz (of link group editor) doesn't exist
Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
命令列輸入 vi 或 vim,發現 vi 和 vim 都已安裝成功。
注:vi 和 vim 只在這個容器中安裝,如果通過 unbuntu 映象執行另一個容器,需要重新安裝 vi。我們可以通過停止和啟動這個安裝好 vi 的容器,反覆使用它即可。