01. Linux嵌入式系統學習筆記(一)(linux基礎指令)

一. linux基礎操作指令

1. 新建文件和目錄

(1) 新建文件

  • touch 命令:用于創建空文件。

touch filename.txt
  • 如果文件已存在,touch 會更新文件的訪問時間和修改時間。

(2) 新建目錄

  • mkdir 命令:用于創建目錄。

mkdir directoryname
  • 使用 -p 選項可以遞歸創建多級目錄?

mkdir -p parent/child/grandchild

2. 刪除文件和目錄

(1) 刪除文件

  • rm 命令:用于刪除文件。

rm filename.txt
  • 使用 -f 選項可以強制刪除文件,不提示確認。

rm -f filename.txt

(2) 刪除目錄

  • rmdir 命令:用于刪除空目錄。

rmdir directoryname
  • 如果目錄不為空,需要使用 rm -rrm -rf

rm -r directoryname  # 遞歸刪除目錄及其內容,但會提示確認
rm -rf directoryname # 強制遞歸刪除目錄及其內容,不提示確認

3. 查找文件和目錄

(1) 查找文件

  • find 命令:用于在指定目錄及其子目錄中查找文件。-name 選項用于指定文件名。

find /path/to/search -name "filename.txt"
  • 可以使用通配符(如 *.txt)來匹配特定模式的文件。

find /path/to/search -name "*.txt"

(2) 查找目錄

  • 使用 find 命令查找目錄。-type d 表示只查找目錄。

find /path/to/search -type d -name "directoryname"

4. 修改文件和目錄

(1) 修改文件內容

  • nanovim:使用文本編輯器直接編輯文件內容。

nano filename.txt    # nano
vim filename.txt     # vim

?(2) 修改文件權限

  • chmod 命令:用于修改文件或目錄的權限。

chmod 644 filename.txt  # 設置文件權限為所有者讀寫,組和其他用戶只讀
chmod -R 755 directoryname  # 遞歸設置目錄權限

(3) 修改文件所有者

  • chown 命令:用于修改文件或目錄的所有者。

chown newowner filename.txt

(4) 修改文件所屬組

  • chgrp 命令:用于修改文件或目錄的所屬組。

(4) 修改文件所屬組
chgrp 命令:用于修改文件或目錄的所屬組。

5. 拷貝文件和目錄

(1) 拷貝文件

  • cp 命令:用于拷貝文件。

cp sourcefile destinationfile

(2) 拷貝目錄

  • 使用 -r-R 選項遞歸拷貝目錄。

cp -r sourcedirectory destinationdirectory

6. 移動文件和目錄

(1) 移動文件

  • mv 命令:用于移動文件或重命名文件。

mv sourcefile destinationfile

(2) 移動目錄

  • 同樣使用 mv 命令。

mv sourcedirectory destinationdirectory

7. 查看文件內容

(1) 查看文件內容

  • cat 命令:用于查看文件內容。

cat filename.txt

(2) 查看文件前幾行

  • head 命令:用于查看文件的前幾行(默認顯示前10行)。

head filename.txt

(3) 查看文件后幾行

  • tail 命令:用于查看文件的后幾行(默認顯示后10行)。

tail filename.txt

8. 總結

????????這些是 Linux 終端中常用的文件和目錄操作命令。通過掌握這些命令,你可以高效地管理文件和目錄。以下是這些命令的簡要總結:

操作類型命令說明
新建文件touch創建空文件
新建目錄mkdir創建目錄
刪除文件rm刪除文件
刪除目錄rm -r?或?rmdir刪除目錄
查找文件find查找文件或目錄
修改文件內容nano?或?vim編輯文件內容
修改文件權限chmod修改文件或目錄的權限
修改文件所有者chown修改文件或目錄的所有者
修改文件所屬組chgrp修改文件或目錄的所屬組
拷貝文件cp拷貝文件或目錄
移動文件mv移動文件或重命名文件
查看文件內容cat查看文件內容
查看文件前幾行head查看文件的前幾行
查看文件后幾行tail查看文件的后幾行

二. 熟悉文件操作指令

1. 建立一個目錄~/work/test,在此目錄下用 echo 命令建立一個文件 mytext,輸 入以下內容:

Hello there !

There are things we know we know.

And things we know we don’t know.

Still there are things we don’t know we don’t know.

# 創建目錄
mkdir -p ~/work/test
# 進入目錄
cd ~/work/test
# 使用 echo 命令創建文件并寫入內容 -e 是讓echo識別轉義字符
echo -e "Hello there ! \nThere are things we know we know. \nAnd thing we know we don't know. \nStill there are things we don't know we don't know." > mytext

2. 用 vi 打開 mytext 進行編輯修改,練習主要 vi 命令的使用。

# 打開 mytext 文件
vi mytext
在?vi 編輯器中,你可以練習以下常用命令:
  • i:進入插入模式

  • Esc:退出插入模式,回到命令模式

  • :wq:保存并退出

  • :q!:不保存并退出

  • dd:刪除當前行

  • yy:復制當前行

  • p:粘貼

  • /pattern:搜索?pattern

3. 用 echo 命令為 mytext 增加一行文本 “Add a new line”。

# 使用 echo 追加一行內容
echo "Add a new line" >> mytext

# 注意: ?>? ?是覆蓋寫入
#? ? ? ? ? ?>> 是追加寫入?

4. 用 grep 命令搜索 mytext 中“there”,不分大小寫。然后統計包含”there”字 串的行數。

# 搜索 "there",忽略大小寫
grep -i "there" mytext
# 統計包含 "there" 的行數
grep -i "there" mytext | wc -l

?grep是文本搜索工具,用于在文件或文本流中搜索符合特定模式的行。global/regular expression/print的縮寫,表示全局正則表達式打印

1. 基本搜索

grep "pattern" filename
# 在文件 filename 中搜索包含字符串 pattern 的行,并打印這些行。

2. 忽略大小寫

grep -i "pattern" filename
# -i 選項表示忽略大小寫,搜索時不區分大小寫。

3. 反向匹配

grep -v "pattern" filename
# -v 選項表示反向匹配,打印不包含指定模式的行。

4. 顯示行號

grep -n "pattern" filename
# -n 選項會在匹配的行前顯示行號。

5. 遞歸搜索

grep -r "pattern" directory/
# -r 或 -R 選項表示遞歸搜索,會在指定目錄及其子目錄中搜索匹配的文件。

6. 顯示匹配的上下文

grep -C 2 "pattern" filename
# -C 選項表示上下文(Context),會顯示匹配行的上下各2行。
# 類似地,-A 顯示匹配行之后的行,-B 顯示匹配行之前的行。

7. 使用正則表達式

grep "^[a-z]" filename
# grep 默認支持基本正則表達式(BRE)。例如,^ 表示行首,[a-z] 表示任意小寫字母。
# 使用 -E 或 egrep 可以啟用擴展正則表達式(ERE),支持更復雜的表達式。

8. 統計匹配的行數

grep -c "pattern" filename
# -c 選項統計匹配的行數,而不是顯示匹配的行。

9. 只顯示匹配的部分

grep -o "pattern" filename
# -o 選項只顯示匹配的部分,而不是整行。

5. 用 file mytext 查看文件類型。

# 查看文件類型
file mytext

6. 用 chmod 命令修改 mytext 讓所有用戶可讀寫。

# 修改文件權限為所有用戶可讀寫
chmod a+rw mytext

?`chmod`(change mode)是 Linux 和 Unix 系統中用于更改文件或目錄權限的命令。它允許用戶修改文件或目錄的訪問權限,以控制誰可以讀取、寫入或執行這些資源。

1. 權限概述
在 Linux 系統中,文件和目錄的權限分為三類:
????????所有者(Owner)? ? :文件或目錄的所有者。
????????所屬組(Group)? ? ?:文件或目錄所屬的用戶組。
????????其他用戶(Others):不屬于上述兩類的其他用戶。

每類用戶可以有以下三種權限:
????????讀權限(r)? ? :允許查看文件內容或列出目錄內容。
????????寫權限(w)? ?:允許修改文件內容或刪除/修改目錄中的文件。
????????執行權限(x):允許運行文件(如可執行腳本)或進入目錄。

2. 查看權限
使用 `ls -l` 命令可以查看文件或目錄的權限:

ls -l filename

輸出示例:
-rw-r--r-- 1 user group 123 Mar 18 10:00 filename
解釋:
- `-rw-r--r--`:權限部分。

? - 第一個字符 `-` 表示文件類型(`-` 表示普通文件,`d` 表示目錄)。- 接下來的三個字符 `rw-` 表示所有者的權限(讀寫權限)。- 接下來的三個字符 `r--` 表示所屬組的權限(只讀權限)。- 最后三個字符 `r--` 表示其他用戶的權限(只讀權限)。

3. 修改權限
`chmod` 命令可以通過兩種方式修改權限:符號模式 和 數字模式。

(1) 符號模式
符號模式使用符號(`+`、`-`、`=`)來修改權限。

????????`+` :添加權限。
????????`-` :移除權限。
????????`=` :設置權限。

用戶類別:
????????`u` :所有者(user)。
????????`g` :所屬組(group)。
????????`o` :其他用戶(others)。
????????`a` :所有類別(all)。

權限類型:
????????`r`? ?:讀權限。
????????`w` :寫權限。
????????`x`? :執行權限。

示例:
給文件所有者添加執行權限:

chmod u+x filename

移除文件所屬組的寫權限:

chmod g-w filename

設置文件對所有用戶為只讀:

chmod a=r filename

(2) 數字模式
數字模式使用八進制數字表示權限。每個權限類型對應一個數字:
????????讀權限(r)? ? ?:4
????????寫權限(w)? ?:2
????????執行權限(x):1

權限組合:
????????`rwx` :7(4 + 2 + 1)
????????`rw-`? :6(4 + 2)
????????`r-x`? ?:5(4 + 1)
????????`r--`? ?:4
????????`w-`? ?:2
????????`wx`? :3(2 + 1)
????????`---`? ?:0

示例:
- 設置文件權限為所有者讀寫執行,所屬組只讀,其他用戶無權限:

chmod 740 filename

設置目錄權限為所有者讀寫執行,所屬組和他人只讀執行:

chmod 755 directoryname

4. 常用命令
以下是一些常用的 `chmod` 命令:

(1) 修改文件權限
設置文件所有者為讀寫權限,所屬組和其他用戶為只讀權限:
?

chmod 644 filename

(2) 修改目錄權限
設置目錄所有者為讀寫執行權限,所屬組和其他用戶為讀執行權限:
?

chmod 755 directoryname

(3) 遞歸修改權限
對目錄及其所有子文件和子目錄遞歸設置權限:
?

chmod -R 755 directoryname

(4) 添加或移除權限
給文件所有者添加執行權限:

chmod u+x filename

移除文件所屬組的寫權限:
?

chmod g-w filename

(5) 設置特殊權限
設置用戶ID(SetUID):允許用戶以文件所有者的身份運行文件:

chmod u+s filename

設置組ID(SetGID):允許用戶以文件所屬組的身份運行文件:

chmod g+s filename

設置粘滯位(Sticky Bit)**:防止用戶刪除或移動不屬于自己的文件(常用于共享目錄):
?

chmod +t directoryname

5. 總結
`chmod` 是一個強大的命令,用于管理文件和目錄的權限。通過符號模式和數字模式,可以靈活地設置權限,以滿足不同的安全需求。以下是一些關鍵點:
????????符號模式:適合快速修改權限。
????????數字模式:適合設置復雜的權限組合。
????????遞歸修改權限:(`-R`)可以批量設置目錄及其內容的權限。
????????特殊權限:(如 SetUID、SetGID 和 Sticky Bit)可以實現更高級的權限管理。

7. 建立文件連接: mytext 的硬連接 yourtext,mytext 的軟連接 thetext。

# 創建硬連接
ln mytext yourtext
# 創建軟連接
ln -s mytext thetext

?在 Linux 系統中,ln 命令用于創建鏈接(Link),包括硬鏈接(Hard Link)軟鏈接(Soft Link,也稱為符號鏈接或 Symbolic Link)。鏈接是一種特殊的文件,它指向另一個文件或目錄。

1. 硬鏈接(Hard Link)

硬鏈接是文件系統中的一種機制,它允許一個文件在文件系統中擁有多個名稱。硬鏈接直接指向文件的 inode(索引節點),而不是文件的路徑。

特點:

  • 硬鏈接不能跨文件系統。

  • 硬鏈接不能鏈接到目錄(出于安全和文件系統結構的考慮)。

  • 硬鏈接和原始文件共享同一個 inode,因此對文件的修改會反映在所有鏈接上。

  • 刪除硬鏈接不會刪除原始文件,只有當所有鏈接都被刪除時,文件才會被真正刪除。

創建硬鏈接:

ln [源文件] [硬鏈接名]
# 示例
ln file.txt link_to_file.txt
# file.txt 是原始文件,link_to_file.txt 是硬鏈接。
# 修改 file.txt 或 link_to_file.txt 的內容,另一個文件也會相應變化。

2. 軟鏈接(Soft Link / Symbolic Link)

軟鏈接是一種特殊的文件,它包含了一個指向目標文件或目錄的路徑。軟鏈接類似于 Windows 系統中的快捷方式。

特點:

  • 軟鏈接可以跨文件系統。

  • 軟鏈接可以鏈接到目錄。

  • 軟鏈接有自己的 inode,與目標文件或目錄的 inode 不同。

  • 如果目標文件被刪除,軟鏈接會變成“死鏈接”(無效鏈接)。

創建軟鏈接:

#軟連接多了 -s
ln -s [目標文件或目錄] [軟鏈接名]
# 示例
ln -s /path/to/file.txt link_to_file.txt
# /path/to/file.txt 是目標文件,link_to_file.txt 是軟鏈接。
# 如果目標文件被刪除,link_to_file.txt 會變成無效鏈接。

3. 常用選項

  • -s:創建軟鏈接(符號鏈接)。

  • -f:強制創建鏈接。如果目標鏈接已經存在,會先刪除舊鏈接再創建新鏈接。

  • -i:交互模式。如果目標鏈接已經存在,會提示用戶是否覆蓋。

  • -n:當創建指向目錄的軟鏈接時,避免覆蓋已存在的軟鏈接。

示例:

(1)強制創建軟鏈接

ln -sf /path/to/new_file.txt link_to_file.txt
# 如果 link_to_file.txt 已經存在,會先刪除舊鏈接,再創建指向 /path/to/new_file.txt 的新鏈接。

(2)創建指向目錄的軟鏈接

ln -s /path/to/directory link_to_directory
# 創建一個軟鏈接 link_to_directory,指向 /path/to/directory。

5. 使用場景

(1) 硬鏈接

  • 用于在文件系統內為文件創建別名,方便訪問。

  • 用于備份文件,節省存儲空間(因為硬鏈接不占用額外的磁盤空間)。

(2) 軟鏈接

  • 用于創建跨文件系統的鏈接。

  • 用于創建指向目錄的鏈接。

  • 用于創建指向文件或目錄的快捷方式。

  • 用于在開發環境中快速切換配置文件或版本。

6. 總結

ln 命令在 Linux 系統中用于創建鏈接,包括硬鏈接和軟鏈接。它們的主要區別在于:

  • 硬鏈接直接指向文件的 inode,不能跨文件系統,不能鏈接到目錄。

  • 軟鏈接包含目標文件或目錄的路徑,可以跨文件系統,可以鏈接到目錄。

8. ls –l 觀察文件屬性,引用次數?

# 查看文件屬性
ls -l
# 輸出示例
# -rw-rw-rw- 2 user user 200 Oct 10 12:00 mytext
# -rw-rw-rw- 2 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user   6 Oct 10 12:00 thetext -> mytext
# mytext 和 yourtext 的引用次數為 2,表示它們共享相同的 inode。
# thetext 是軟連接,指向 mytext。

ls(list)是 Linux 和 Unix 系統中最基本的命令之一,用于列出目錄中的文件和子目錄。它提供了多種選項,可以用來顯示文件的詳細信息、排序文件、過濾文件等。

1. 基本功能

ls 命令的主要功能是列出指定目錄中的文件和子目錄。如果沒有指定目錄,默認會列出當前工作目錄的內容。

2. 基本用法

ls [選項] [目錄或文件]

3. 常見選項

以下是一些常用的 ls 選項及其功能:

(1)?-l:長格式顯示

以長格式顯示文件和目錄的詳細信息,包括權限、所有者、所屬組、大小、修改時間等。

ls -l
# 輸出示例
# drwxr-xr-x 2 user group 4096 Mar 18 10:00 directory
# -rw-r--r-- 1 user group 1234 Mar 18 09:00 file.txt

(2)?-a:顯示所有文件

顯示所有文件和目錄,包括以 . 開頭的隱藏文件。

ls -a
# 輸出示例
# .  ..  .hiddenfile  file.txt  directory
# . 表示當前目錄。
# .. 表示父目錄。
# .hiddenfile 是隱藏文件。

(3)?-h:以易讀格式顯示文件大小

以更易讀的格式(如 KB、MB、GB)顯示文件大小。

ls -lh
# 輸出示例
# drwxr-xr-x 2 user group 4.0K Mar 18 10:00 directory
# -rw-r--r-- 1 user group 1.2M Mar 18 09:00 file.txt

(4)?-t:按修改時間排序

按修改時間排序,最近修改的文件或目錄會顯示在前面。

ls -lt

(5)?-r:反向排序

對排序結果進行反向排序。

ls -ltr
# 按修改時間反向排序

(6)?-S:按文件大小排序

按文件大小排序,較大的文件會顯示在前面。

ls -lS

(7)?-R:遞歸顯示

遞歸顯示目錄及其子目錄中的內容。

ls -R

(8)?-1(數字1):每行顯示一個文件或目錄

每行顯示一個文件或目錄名稱,而不是按列顯示。

ls -1

4. 組合使用選項

ls 命令支持組合使用多個選項,以滿足不同的需求。例如:

ls -lath
# -l:長格式顯示。
# -a:顯示所有文件(包括隱藏文件)。
# -t:按修改時間排序。
# -h:以易讀格式顯示文件大小。

5. 示例

# (1) 列出當前目錄的內容
ls
# (2) 列出當前目錄的詳細信息
ls -l
# (3) 列出包括隱藏文件的所有內容
ls -la
# (4) 列出按修改時間排序的內容
ls -lt
# (5) 列出按文件大小排序的內容
ls -lS
# (6) 遞歸列出目錄內容
ls -R
# (7) 列出指定目錄的內容
ls /path/to/directory

9. 用 chmod 修改連接屬性 yourtext 和 thetext 的屬性為只讀,用 ls –l 觀察

# 修改硬連接 yourtext 為只讀
chmod a-w yourtext
# 修改軟連接 thetext 為只讀
chmod a-w thetext
# 查看文件屬性
ls -l# 輸出示例
# -rw-rw-rw- 2 user user 200 Oct 10 12:00 mytext
# -r--r--r-- 2 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user   6 Oct 10 12:00 thetext -> mytext
# yourtext 的權限變為只讀。
# thetext 是軟連接,其權限不受 chmod 影響。

10. 刪除 mytext,用 ls –l 觀察

# 刪除 mytext
rm mytext
# 查看文件屬性
ls -l# 輸出示例
# -r--r--r-- 1 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user   6 Oct 10 12:00 thetext -> mytext# mytext 被刪除后,yourtext 仍然存在,因為它是硬連接。
# thetext 仍然存在,但指向的文件 mytext 已被刪除,因此 thetext 會顯示為紅色或提示文件不存在。

11. cp yourtext mytext,用 ls –l 觀察

# 復制 yourtext 到 mytext
cp yourtext mytext
# 查看文件屬性
ls -l# 輸出示例
# -r--r--r-- 1 user user 200 Oct 10 12:00 mytext
# -r--r--r-- 1 user user 200 Oct 10 12:00 yourtext
# lrwxrwxrwx 1 user user   6 Oct 10 12:00 thetext -> mytext# mytext 被重新創建,內容與 yourtext 相同。
# thetext 現在指向新的 mytext 文件。

三. 練習文檔建立和壓縮/解壓操作

????????練習用 tar 命令和各種壓縮方式將 test 目錄打壓縮包和解壓縮。

1. 創建測試目錄

假設當前目錄下已存在?test?目錄。若沒有,可通過以下命令創建:

mkdir test && touch test/file{1..3}.txt  # 創建 test 目錄及三個測試文件

2. 壓縮操作

(1)使用 gzip 壓縮(.tar.gz 或 .tgz)

tar -czvf test.tar.gz test/      # 打包并壓縮為 .tar.gz
# 或
tar -czvf test.tgz test/         # 等效寫法

(2)使用 bzip2 壓縮(.tar.bz2)

tar -cjvf test.tar.bz2 test/     # 打包并壓縮為 .tar.bz2

(3)使用 xz 壓縮(.tar.xz 或 .txz)

tar -cJvf test.tar.xz test/      # 打包并壓縮為 .tar.xz
# 或
tar -cJvf test.txz test/         # 等效寫法

(4)僅打包不壓縮(.tar)

tar -cvf test.tar test/          # 僅打包,不壓縮

3. 解壓操作

(1)解壓 .tar.gz 或 .tgz

tar -xzvf test.tar.gz           # 指定解壓參數
# 或
tar -xvf test.tar.gz            # 自動檢測壓縮類型(推薦)

(2)解壓 .tar.bz2

tar -xjvf test.tar.bz2          # 指定解壓參數
# 或
tar -xvf test.tar.bz2           # 自動檢測壓縮類型(推薦)

(3)解壓 .tar.xz 或 .txz

tar -xJvf test.tar.xz           # 指定解壓參數
# 或
tar -xvf test.tar.xz            # 自動檢測壓縮類型(推薦)

(4)解壓 .tar

tar -xvf test.tar               # 解壓未壓縮的 tar 包

(可選)解壓到指定目錄

tar -xvf test.tar.gz -C /path/to/target_dir  # 將內容解壓到 target_dir

4. 常用參數說明

參數作用
c創建壓縮包
x解壓
z使用 gzip 壓縮/解壓
j使用 bzip2 壓縮/解壓
J使用 xz 壓縮/解壓
v顯示操作過程(詳細信息)
f指定文件名(必須緊跟文件名)
C指定解壓目錄

5. 驗證壓縮/解壓結果

  • 查看壓縮包內容

tar -tf test.tar.gz  # 列出 .tar.gz 中的文件
  • 檢查解壓后的目錄

ls test/             # 確認文件與原始目錄一致

四. 練習編寫和運行簡單的 bash 腳本

1. 將課上 PPT 上的簡單腳本例子用 vi 編輯為 test.sh

(1).使用 vi 創建并編輯腳本

vi test.sh

(2).在 vi 中輸入以下內容(按 i 進入編輯模式)

#!/bin/bash
# 這是一個簡單的 Bash 腳本示例
echo "Hello World!"
date  # 顯示當前時間

(3).保存并退出 vi(按 Esc 退出編輯模式;輸入 :wq 保存并退出)

2. 用兩種方法執行這個腳本:sh test.sh ./test.sh

(1). 方法一: 直接使用 sh 命令

sh test.sh

(2).方法二:賦予執行權限后通過路徑運行

# 1. 添加可執行權限
chmod +x test.sh# 2. 通過相對路徑執行
./test.sh

兩種方法的區別:

? ? ? ? sh test.sh :顯示指定使用 sh 解釋器執行腳本,即使腳本中沒有 #!/bin/bash 也能運行。

? ? ? ? ./test.sh? ? :依賴腳本首行的 ( #!/bin/bash )指定解釋器,需先賦予執行權限。?

3. 編寫一個腳本設置自己需要的環境變量,例如設置程序別名,增加可執行路徑。

? ? ? ? 創建一個腳本 set_env.sh ,用于設置別名和添加可執行路徑:

步驟:

(1). 編輯腳本

vi set_env.sh

(2). 輸入以下內容

#!/bin/bash
# 設置環境變量示例
alias ll='ls -alF'          # 定義別名 ll
export PATH=$PATH:~/bin     # 將 ~/bin 添加到 PATH

(3). 保存并退出 vi

4. 用 source 命令執行這個腳本,然后執行進行測試,看看環境變量設置是否成功。

(1). 使用 source 或 . 執行腳本

source set_env.sh   # 方法一
# 或
. set_env.sh        # 方法二(等效寫法)

(2). 測試環境變量是否生效

? ? ? ? 測試別名 ll :

ll  # 應顯示詳細文件列表

? ? ? ? 檢查 PATH 是否更新 :

echo $PATH  # 輸出中應包含 ~/bin

關鍵點:

? ? ? ? 使用 source 或 . 是為了讓腳本在當前 Shell 中生效(而非子 Shell )。

? ? ? ? 直接運行 ./set_env.sh 或 sh set_env.sh 不會生效,因為環境變量僅在子 Shell 中有效。

5. 永久生效(可選)

????????若希望環境變量永久生效,可將腳本內容添加到?~/.bashrc?或?~/.bash_profile

echo "alias ll='ls -alF'" >> ~/.bashrc
echo "export PATH=\$PATH:~/bin" >> ~/.bashrc
source ~/.bashrc  # 立即生效

總結

操作命令/方法
編輯腳本vi test.sh
執行腳本(無權限)sh test.sh
執行腳本(有權限)chmod +x test.sh?+?./test.sh
設置環境變量并生效source set_env.sh
永久生效將內容添加到?~/.bashrc

五.?練習文件搜索

1.?搜索以?arm-?開頭、以?gcc?結尾的文件,找到用于 ARM 程序編譯的 GCC 編譯器路徑。

sudo find / -type f -name 'arm-*gcc' 2>/dev/null

參數說明?

sudo?以管理員權限搜索整個系統(可能需要輸入密碼)
-find /從根目錄開始遞歸搜索
-type f僅搜索普通文件
-name 'arm-*gcc'匹配以?arm-?開頭、以?gcc?結尾的文件名
2>/dev/null忽略權限錯誤等干擾信息

輸出示例

/usr/bin/arm-linux-gnueabi-gcc
/opt/arm-toolchain/bin/arm-none-eabi-gcc

注意事項

  • 常見 ARM GCC 編譯器路徑可能位于?/usr/bin?或工具鏈安裝目錄(如?/opt)。

  • 如果未安裝 ARM GCC,需先通過包管理器安裝(如?apt install gcc-arm-linux-gnueabi)。

2. 搜索?/bin/?目錄下的所有符號鏈接文件

????????列出?/bin/?目錄中所有軟鏈接文件。

find /bin -type l

參數說明

-type l僅搜索符號鏈接文件(軟鏈接)

輸出示例

/bin/sh -> dash
/bin/rm -> /usr/bin/rm

驗證鏈接指向

ls -l /bin/sh  # 查看軟鏈接指向的實際文件

3. 統計?/dev/?下的字符設備和塊設備文件數量

echo "字符設備文件數量:$(find /dev -type c | wc -l)"
echo "塊設備文件數量:$(find /dev -type b | wc -l)"

參數說明

-type c搜索字符設備文件(如終端?/dev/tty
-type b搜索塊設備文件(如磁盤?/dev/sda
-wc -l統計行數(即文件數量)

輸出示例

字符設備文件數量:123
塊設備文件數量:5

設備類型說明

類型描述常見示例
字符設備按字符流讀寫/dev/tty,?/dev/null
塊設備按數據塊讀寫/dev/sda,?/dev/loop0

總結

問題命令/方法關鍵參數
搜索特定文件名find / -name 'arm-*gcc'-name,?2>/dev/null
搜索符號鏈接find / bin -type l-type l
統計設備文件find /dev -type c?和?find /dev -type b-type c,?-type b

六. 練習掛在移動存儲設備

1. 查看現有磁盤設備

命令

ls /dev/sd*          # 列出所有以 sd 開頭的設備(如 sda, sdb)
sudo fdisk -l        # 列出所有磁盤及分區信息(需管理員權限)

說明

  • /dev/sda: 第一塊物理磁盤(如系統盤)。

  • /dev/sdb: 第二塊物理磁盤(可能是插入的 U 盤)。

2. 插入 U 盤并分配給虛擬機(僅限虛擬機環境)

操作步驟

? ? ? ? 1. 插入 U 盤到物理機。

? ? ? ? 2. 虛擬機軟件設置(以 VirtualBox 為例)

????????????????點擊虛擬機菜單欄:設備?→?USB?→ 選擇你的 U 盤設備。

????????3. 確認 U 盤已連接到虛擬機

????????????????虛擬機右下角狀態欄顯示 U 盤圖標。

3. 檢查 U 盤設備及掛載狀態

命令

sudo fdisk -l        # 查看新增的 U 盤設備(如 /dev/sdb1)
mount | grep sd      # 查看已掛載的磁盤設備(自動掛載的 U 盤路徑通常是 /media/用戶名/卷標)

示例輸出

/dev/sdb1   /media/user/USB_DISK  vfat  rw,nosuid,nodev 0 0

4. 卸載自動掛載的 U 盤

命令

# 如果系統已自動掛載,先卸載
sudo umount /dev/sdb1            # 通過設備路徑卸載
# 或
sudo umount /media/user/USB_DISK # 通過掛載點卸載

5. 再次檢查設備狀態

sudo fdisk -l        # 確認 /dev/sdb1 仍存在(設備未移除)
mount | grep sd      # 確認 U 盤掛載點已消失

6. 手動掛載 U 盤到指定目錄

步驟
1. 創建掛載目錄

sudo mkdir -p /media/udisk    # 創建目標目錄

2. 掛載U盤

sudo mount /dev/sdb1 /media/udisk   # 手動掛載

3. 驗證掛載

mount | grep udisk  # 查看掛載信息
ls /media/udisk     # 列出 U 盤內容

7. 卸載 U 盤并從虛擬機移除

步驟

1. 卸載U盤

sudo umount /media/udisk   # 通過掛載點卸載
# 或
sudo umount /dev/sdb1      # 通過設備路徑卸載

2. 安全移除U盤

????????虛擬機環境:點擊右下角 U 盤圖標 → 選擇?斷開連接

????????物理機環境:直接拔出 U 盤(確保已卸載)。?

關鍵命令總結

操作命令/方法
查看磁盤設備sudo fdisk -l
查看已掛載設備mount | grep sd
卸載設備sudo umount /dev/sdb1?或?sudo umount /掛載點
手動掛載sudo mount /dev/sdb1 /media/udisk
安全移除 U 盤(虛擬機)虛擬機菜單欄斷開 USB 設備

注意事項

1. 設備名稱可能不同:U 盤可能為?/dev/sdc1?或其他名稱,需根據?fdisk -l?實際輸出調整。

2. 文件系統兼容性:如果 U 盤為 NTFS 文件系統,需安裝?ntfs-3g?驅動:

sudo apt install ntfs-3g    # Ubuntu/Debian

3. 卸載前確保無占用:若提示?target is busy,關閉所有訪問 U 盤的程序或終端。

七. 操作磁盤映像文件

1. 創建磁盤鏡像文件?disk.img

命令

dd if=/dev/zero of=disk.img bs=1024 count=65536

參數說明

  • if=/dev/zero: 輸入源為?/dev/zero(生成全零文件)。

  • of=disk.img: 輸出文件名為?disk.img

  • bs=1024: 每次讀寫塊大小為 1KB。

  • count=65536: 寫入 65536 個塊,總大小?64MB(1024 * 65536 = 64 MiB)。

驗證

ls -lh disk.img  # 查看生成的文件大小是否為 64M

2. 格式化鏡像文件為 ext2 文件系統

命令

mkfs.ext2 -F disk.img

參數說明

  • -F: 強制格式化,即使文件不是塊設備。

可能的問題

  • 若提示?mkfs.ext2: command not found,需安裝?e2fsprogs

sudo apt install e2fsprogs  # Ubuntu/Debian

3. 掛載鏡像文件到目錄

步驟

1. 創建掛載點目錄

mkdir mydisk

2. 掛載鏡像文件(需要管理員權限)

sudo mount -o loop disk.img mydisk  # 關鍵:必須添加 `-o loop` 參數
  • -o loop: 將文件關聯為循環設備(虛擬塊設備)。

3. 驗證掛載

mount | grep mydisk  # 查看掛載信息
df -h mydisk         # 查看掛載點磁盤使用情況

4. 讀寫操作

cd mydisk
sudo touch test.txt  # 創建測試文件(需管理員權限)
sudo echo "Hello" > test.txt

4. 卸載鏡像文件

命令

sudo umount mydisk

注意事項

  • 若提示?target is busy,表示有進程正在訪問掛載點:

    • 退出?mydisk?目錄。

    • 關閉所有占用該目錄的程序或終端。

5. 壓縮磁盤鏡像文件

方法一:使用?gzip(快速壓縮)

gzip disk.img     # 生成 disk.img.gz

方法二:使用?xz(高壓縮率,速度慢)

xz -z disk.img    # 生成 disk.img.xz

方法三:使用?bzip2(平衡壓縮率與速度)

bzip2 disk.img    # 生成 disk.img.bz2

壓縮后操作

  • 查看壓縮文件大小

ls -lh disk.img.*
  • 解壓縮:

gunzip disk.img.gz    # 解壓 .gz
unxz disk.img.xz      # 解壓 .xz
bunzip2 disk.img.bz2  # 解壓 .bz2

關鍵問題總結

步驟命令/操作常見問題及解決方案
創建鏡像文件dd if=/dev/zero of=disk.img ...文件大小不足?調整?bs?和?count
格式化鏡像mkfs.ext2 -F disk.img安裝?e2fsprogs?包
掛載鏡像mount -o loop ...必須添加?-o loop
卸載鏡像umount mydisk確保無進程占用掛載點
壓縮鏡像gzip/xz/bzip2根據需求選擇壓縮工具

擴展操作

調整鏡像文件大小(擴容)

1. 擴展鏡像文件至 128 M

dd if=/dev/zero bs=1M count=64 >> disk.img  # 追加 64MB

2. 調整文件系統大小

sudo losetup /dev/loop0 disk.img  # 關聯為循環設備
sudo e2fsck -f /dev/loop0         # 檢查文件系統
sudo resize2fs /dev/loop0         # 擴展 ext2 文件系統
sudo losetup -d /dev/loop0        # 解除關聯

八. 練習掛載 NFS 網絡文件系統

目的:將練習目錄~/work 進行 NFS 共享,可以將其掛載到從其它主機或本地其它目錄。

1. 配置 NFS 服務器端

(1)安裝 NFS 服務器軟件包

sudo apt update
sudo apt install nfs-kernel-server  # Ubuntu/Debian

(2)編輯?/etc/exports?文件

sudo nano /etc/exports

在文件末尾添加以下行(替換實際共享路徑):

/home/your_username/work  *(rw,no_subtree_check,sync,no_root_sash)

  • 路徑說明

    • /home/your_username/work:需共享的本地目錄(如?~/work?對應絕對路徑?/home/user/work)。

    • *:允許所有 IP 訪問(生產環境建議限制為特定 IP 或網段,如?192.168.1.0/24)。

  • 權限參數

    • rw:允許讀寫。

    • no_subtree_check:禁用子目錄檢查,提升性能。

    • sync:同步寫入,保證數據一致性。

    • no_root_squash:允許客戶端 root 用戶保留權限(謹慎使用,存在安全風險)。

(3)重啟 NFS 服務

sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server  # 開機自啟

(4)驗證共享配置

sudo exportfs -v

輸出應顯示共享目錄及參數,例如:

/home/user/work<world> (rw,wdelay,no_root_squash,no_subtree_check)

2. 本地掛載測試

(1)創建本地掛載點

mkdir ~/test

(2)掛載 NFS 共享目錄

sudo mount -t nfs localhost:/home/your_username/work ~/test

  • 參數說明

    • -t nfs:指定文件系統類型為 NFS。

    • localhost:若在本地測試,可直接用?localhost;跨主機需替換為服務器 IP。

(3)驗證掛載

ls ~/test        # 查看共享目錄內容
touch ~/test/file.txt  # 測試寫入權限

(4)卸載共享目錄

sudo umount ~/test

3. 其他主機掛載(以客戶端為例)

(1)客戶端安裝 NFS 工具

sudo apt update
sudo apt install nfs-common  # Ubuntu/Debian

(2)創建掛載點

sudo mkdir /mnt/nfs_shared

(3)掛載遠程 NFS 共享

sudo mount -t nfs 服務器IP:/home/your_username/work /mnt/nfs_shared

示例

sudo mount -t nfs 192.168.1.100:/home/user/work /mnt/nfs_shared

(4)驗證掛載

df -h | grep nfs_shared  # 查看掛載信息
ls /mnt/nfs_shared      # 檢查文件內容

(5)卸載共享目錄

sudo umount /mnt/nfs_shared

4. 常見問題及解決

(1)權限被拒絕(Access Denied)

  • 原因

    • 服務器端?/etc/exports?未正確配置 IP 或權限。

    • 客戶端用戶無共享目錄的本地權限。

  • 解決

    • 檢查?/etc/exports?的 IP 范圍和權限參數(如?rw)。

    • 確保服務器端共享目錄的本地權限開放:

sudo chmod 777 /home/your_username/work  # 臨時測試(不建議生產環境使用)

(2)掛載超時或連接失敗

  • 原因

    • 防火墻阻止 NFS 端口(默認使用?2049/tcp?和?111/udp)。

    • 服務器與客戶端網絡不通。

sudo ufw allow from 客戶端IP to any port nfs  # Ubuntu
  • 解決

    • 開放防火墻端口。

sudo ufw allow from 客戶端IP to any port nfs  # Ubuntu
    • 使用?ping?和?telnet?測試網絡連通性。

telnet 服務器IP 2049

(3) 文件系統只讀(Read-Only)

  • 原因

    • 服務器端?/etc/exports?未配置?rw?權限。

    • 客戶端掛載時未指定讀寫選項。

  • 解決

    • 修改服務器端配置為?rw?并重啟 NFS 服務。

    • 重新掛載時添加?-o rw?參數:

sudo mount -t nfs -o rw 服務器IP:/共享目錄 /掛載點

5. 自動掛載(可選)

編輯?/etc/fstab?實現開機自動掛載:

sudo nano /etc/fstab

添加以下行:

服務器IP:/home/your_username/work  /mnt/nfs_shared  nfs  defaults  0  0

????????驗證自動掛載

sudo mount -a  # 加載所有 fstab 條目

總結

步驟命令/操作關鍵點
配置 NFS 服務器編輯?/etc/exports?+ 重啟服務確保路徑、IP 范圍和權限正確
本地掛載測試mount -t nfs localhost:/path ~/test驗證讀寫權限
跨主機掛載客戶端安裝?nfs-common?+ 掛載命令檢查防火墻和網絡連通性
故障排查檢查權限、防火墻、日志 (/var/log/syslog)使用?exportfs -v?和?showmount -e

九. 進程觀察和管理

1. 使用?sleep 100?練習進程管理

(1) 啟動?sleep 100?進程

sleep 100  # 前臺運行,阻塞終端

(2) 暫停進程(Ctrl-Z)

  • 按下?Ctrl-Z,進程暫停并轉入后臺,終端顯示:

[1]+  Stopped                 sleep 100

(3) 查看作業狀態

jobs       # 輸出示例:[1]+  Stopped   sleep 100

(4) 后臺恢復進程

bg %1     # 輸出示例:[1]+ sleep 100 &

(5) 獲取進程 PID

ps -x | grep sleep  # 查找 PID(如 1234)

(6) 查看進程內存映射

cat /proc/1234/maps  # 或使用 pmap
pmap 1234            # 顯示內存布局

(7) 前臺恢復進程

fg %1     # 進程回到前臺繼續運行

(8) 進程結束后重新后臺啟動

sleep 100 &  # 直接后臺運行

(9) 查看后臺作業詳情

jobs -l     # 顯示作業號、PID 和狀態

(10) 終止進程

kill 1234    # 通過 PID 終止
# 或
kill %1      # 通過作業號終止

(11) 驗證進程狀態

ps -x | grep sleep  # 確認進程已終止

2. 使用 C 程序?dvar?重復操作

(1) 準備并編譯程序

<1>. 創建?dvar.c

#include <unistd.h>
int main() {while(1) { sleep(1); }return 0;
}

<2>. 編譯:

gcc -o dvar dvar.c

(2) 執行程序并重復步驟

./dvar        # 前臺運行
# 后續操作與 sleep 100 完全相同(Ctrl-Z、jobs、bg/fg、kill 等)

3. 關鍵命令總結

操作命令/快捷鍵說明
啟動前臺進程sleep 100?或?./dvar阻塞終端
暫停進程Ctrl-Z進程轉入后臺并暫停(狀態?T
查看作業列表jobs顯示所有后臺作業
后臺恢復運行bg %作業號進程在后臺運行(狀態?R
查看進程 PIDps -x?或?jobs -l過濾關鍵詞如?sleep?或?dvar
查看內存映射pmap PID顯示虛擬內存布局
前臺恢復運行fg %作業號進程回到前臺運行
終止進程kill PID?或?kill %作業號發送?SIGTERM?信號
強制終止進程kill -9 PID發送?SIGKILL?信號(慎用)

4. 進程狀態說明

狀態符號含義
R運行中或可運行
S可中斷的睡眠(等待事件)
T暫停(Ctrl-Z 或 SIGTSTP)
Z僵尸進程(已終止未回收)

5. 常見問題

(1)Ctrl-Z?無響應

  • 原因:程序未處理?SIGTSTP?信號(如自定義信號處理忽略此信號)。

  • 解決:修改程序代碼或使用?kill -SIGSTOP PID?強制暫停。

(2)kill?無法終止進程

  • 原因:進程處于?D?狀態(不可中斷睡眠,如等待 I/O)。

  • 解決:等待或重啟系統(極端情況)。

(3)僵尸進程處理

  • 現象:進程狀態為?Z,父進程未回收子進程。

  • 解決:終止父進程或重啟服務。

十. Linux 應用基礎 - 課后作業

1. 內核貢獻者統計

1.1?author_stats.sh(統計高頻作者)

#!/bin/bash
# 功能:統計 kernel 目錄中 MODULE_AUTHOR 聲明的前五位高頻作者
# 前提:kernel 目錄包含內核源碼,且源碼中包含 MODULE_AUTHOR 聲明# 設置內核源碼路徑
# 本目錄下為“kernel”,查找主目錄下為:“$HOME/kernel”
KERNEL_PATH="$HOME/kernel"# 檢查內核源碼路徑是否存在
if [ ! -d "$KERNEL_PATH" ]; 
thenecho "錯誤:未找到內核源碼目錄 $KERNEL_PATH"exit 1
fi# 提取作者信息并統計
echo "正在提取 MODULE_AUTHOR 聲明中的作者信息并統計前五位高頻作者..."# 使用 find 命令查找 kernel 目錄中所有 .c 和 .h 文件。
# 使用 grep 提取包含 MODULE_AUTHOR 的行。
# 使用 sed 提取作者名稱(例如 "Linus Torvalds")。
# 使用 sort | uniq -c | sort -nr 統計每個作者的次數,并按次數降序排序。
# 使用 head -n 5 輸出出現頻率最高的前五位作者。
find "$KERNEL_PATH" -type f \( -name "*.c" -o -name "*.h" \) -exec grep -h 'MODULE_AUTHOR' {} + | sed -E 's/^.*MODULE_AUTHOR\("([^"]+)".*$/\1/' | sort | uniq -c | sort -nr | head -n 5echo "統計完成!"

?說明

  • grep -r?遞歸搜索所有文件,-h?隱藏文件名,-o?只輸出匹配部分。

  • 提取雙引號內的作者名,統計頻率并取前 5 名。

1.2?danger_func_check.sh(檢測危險函數?sprintf

#!/bin/bash
# 功能:檢測 kernel 目錄中使用 sprintf 的文件,并標紅顯示
# 前提:kernel 目錄包含內核源碼# 設置內核源碼路徑
KERNEL_PATH="$HOME/kernel"# 檢查內核源碼路徑是否存在
if [ ! -d "$KERNEL_PATH" ]; thenecho "錯誤:未找到內核源碼目錄 $KERNEL_PATH"exit 1
fi# 查找使用 sprintf 的文件并標紅顯示
echo "正在檢測使用 sprintf 的文件..."
grep -rn --color=always -e 'sprintf' "$KERNEL_PATH" --include="*.c" --include="*.h"# 使用 grep -rn 遞歸搜索 kernel 目錄中包含 sprintf 的文件。
# -r:遞歸搜索。
# -n:顯示匹配行的行號。
# --color=always:在終端中標紅顯示匹配的 sprintf。--color=always 選項會高亮顯示匹配的 sprintf,默認顏色為紅色。
# -e 'sprintf':指定搜索模式為 sprintf。
# --include="*.c" 和 --include="*.h":限定搜索范圍為 .c 和 .h 文件。echo "檢測完成!"

說明

  • \<sprintf\>?精確匹配單詞?sprintf,避免誤匹配。

  • --color=always?強制顯示顏色(標紅)。

1.3?find_magic_secret.sh(查找內核彩蛋)

#!/bin/bash
# 功能:查找 kernel 目錄中包含特殊注釋 "magic" 和 "secret" 的代碼文件
# 前提:kernel 目錄包含內核源碼# 設置內核源碼路徑
KERNEL_PATH="$HOME/kernel"# 檢查內核源碼路徑是否存在
if [ ! -d "$KERNEL_PATH" ]; thenecho "錯誤:未找到內核源碼目錄 $KERNEL_PATH"exit 1
fi# 查找包含 "magic" 的代碼文件
echo "正在查找包含 'magic' 的代碼文件..."
grep -rnw "$KERNEL_PATH" -e 'magic' --include="*.c" --include="*.h"# 查找包含 "secret" 的代碼文件
echo "正在查找包含 'secret' 的代碼文件..."
grep -rnw "$KERNEL_PATH" -e 'secret' --include="*.c" --include="*.h"# 使用 grep -rnw 遞歸搜索 kernel 目錄中包含 magic 和 secret 的文件。
# -r:遞歸搜索。
# -n:顯示匹配行的行號。
# -w:全詞匹配(避免匹配到類似 magical 或 secrets 的內容)。
# --include="*.c" 和 --include="*.h":限定搜索范圍為 .c 和 .h 文件。# 指定模式:-e 后面跟著一個正則表達式,grep 會根據這個模式進行匹配。
# 支持多個模式:可以多次使用 -e 來指定多個搜索模式。echo "查找完成!"

2. 打包腳本

# 賦予腳本執行權限
chmod +x *.sh# 打包為 tar.gz
tar czvf kernel_scripts.tar.gz *.sh

輸出文件kernel_scripts.tar.gz?

3. 使用說明

3.1 解壓并使用腳本

tar xzvf kernel_scripts.tar.gz
cd <解壓目錄>

3.2 運行腳本

# 統計高頻作者
./author_stats.sh# 檢測 sprintf 使用
./danger_func_check.sh# 查找彩蛋文件
./find_magic_secret.sh

4. 示例輸出

4.1?author_stats.sh?輸出

Top 5 MODULE_AUTHOR contributors:42 Linus Torvalds <torvalds@linux-foundation.org>35 Greg Kroah-Hartman <gregkh@linuxfoundation.org>28 Arnd Bergmann <arnd@arndb.de>25 David S. Miller <davem@davemloft.net>20 Kees Cook <keescook@chromium.org>

4.2?danger_func_check.sh?輸出

(終端中?sprintf?顯示為紅色)

4.3?find_magic_secret.sh?輸出

./drivers/misc/magic_driver.c
./kernel/secret_module.c

5.關鍵命令參數說明

命令/參數作用
grep -r遞歸搜索目錄
awk -F'"'以雙引號為分隔符提取字段
sort | uniq -c統計頻率
grep --color=always強制終端顯示顏色(即使輸出到管道)
grep -rl遞歸搜索并僅輸出文件名

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899059.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899059.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899059.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 列表復制與對象引用

Java 列表復制與對象引用 一、知識點 1. 對象引用的基本概念 在 Java 中&#xff0c;List<School> 這樣的集合存儲的并不是真正的對象&#xff0c;而是對象的“地址”&#xff08;引用&#xff09;。就好比你有一個文件柜&#xff0c;文件柜里放的不是文件本身&#x…

如何理解 Apache Iceberg 與湖倉一體(Lakehouse)?

一、什么是湖倉一體&#xff08;Lakehouse&#xff09;&#xff1f; 湖倉一體是一種融合了數據湖的靈活存儲能力與數據倉庫的高效分析功能的現代數據架構。它通過整合兩者的優勢&#xff0c;解決了傳統架構的局限性&#xff0c;為企業數據處理提供了更全面的解決方案。 數據湖…

Android面試總結之Android RecyclerView:從基礎機制到緩存優化

引言 在 Android 開發中&#xff0c;RecyclerView是高效展示列表數據的核心組件。其強大的性能源于獨特的視圖復用機制和四級緩存體系。本文將結合源碼與示例&#xff0c;帶你深入理解RecyclerView的工作原理與優化策略。 核心組件 RecyclerView&#xff1a;作為容器視圖&am…

【鴻蒙開發】Hi3861學習筆記- TCP客戶端

00. 目錄 文章目錄 00. 目錄01. TCP概述02. TCP應用場景03. TCP和UDP比較04. TCP相關API05. TCP編程流程06. 硬件設計07. 軟件設計08. 實驗現象09. 附錄 01. TCP概述 TCP&#xff08;Transmission Control Protocol&#xff09;是一種面向連接、可靠的傳輸層協議&#xff0c;旨…

【負載均衡系列】Keepalive

一、Keepalived 的核心功能 Keepalived 是一款用于實現 ?高可用(HA)? 和 ?負載均衡 的開源工具,核心基于 ?VRRP(Virtual Router Redundancy Protocol)? 協議,工作在網絡四層(傳輸層)和七層(應用層)。 主要用途: 通過虛擬IP(VIP)實現服務高可用(主備切換)。…

2025-03-25 學習記錄--C/C++-PTA 習題9-3 平面向量加法

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 習題9-3 平面向量加法 本題要求編寫程序&#xff0c;計算兩個二維平面向量的和向量。 輸入格式: ? 輸入在…

23種設計模式-橋接(Bridge)設計模式

橋接設計模式 &#x1f6a9;什么是橋接設計模式&#xff1f;&#x1f6a9;橋接設計模式的特點&#x1f6a9;橋接設計模式的結構&#x1f6a9;橋接設計模式的優缺點&#x1f6a9;橋接設計模式的Java實現&#x1f6a9;代碼總結&#x1f6a9;總結 &#x1f6a9;什么是橋接設計模式…

python:music21 構建 LSTM+GAN 模型生成爵士風格音樂

keras_lstm_gan_midi.py 這是一個結合 LSTM 和 GAN 生成爵士風格音樂的完整Python腳本。這個實現包含音樂特征提取、對抗訓練機制和MIDI生成功能&#xff1a; import numpy as np from music21 import converter, instrument, note, chord, stream from tensorflow.keras.mode…

go:前后端分離

1.前端代碼 新建一個前端文件夾&#xff0c;在該文件夾下新建一個.html文件&#xff0c;寫入自己的html代碼。 前端搞定。 2.后端代碼 其核心是掛載路由接受前端傳來的數據核心代碼如下&#xff1a; func main() { // 服務運行提示 fmt.Println("go web server is runn…

大數據學習(86)-Zookeeper去中心化調度

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

JetsonNano —— 4、Windows下對JetsonNano板卡燒錄刷機Ubuntu20.04版本(官方教程)

介紹 NVIDIA Jetson Nano? 開發者套件是一款面向創客、學習者和開發人員的小型 AI 計算機。按照這個簡短的指南&#xff0c;你就可以開始構建實用的 AI 應用程序、酷炫的 AI 機器人等了。 燒錄刷機 1、下載 Jetson Nano開發者套件SD卡映像 解壓出.img文件并記下它在計算機上的…

HTML5 拖放(Drag and Drop)學習筆記

一、HTML5 拖放簡介 HTML5 拖放&#xff08;Drag and Drop&#xff09;是HTML5標準的一部分&#xff0c;允許用戶抓取一個對象并將其拖動到另一個位置。拖放功能在現代網頁中非常常見&#xff0c;例如文件上傳、任務管理、布局調整等場景。 HTML5 拖放功能支持以下瀏覽器&…

文件I/O--C++的文件操作

一、打開文件&#xff0c;從文件中讀取、寫入文件 從文件中讀取數據&#xff1a; #include<fstream> //fstream File stream:文件流 #include<iostream> //fstream包含了 iostream&#xff0c;所以這句可以省略&#xff0c;現在不能了 using namespace std;i…

Redis GEO 命令詳解:輕松實現“附近的人“功能

目錄 引言 Redis GEO命令概述 什么是GEO命令&#xff1f; 主要命令詳解 命令應用示例 添加地點信息 查詢兩地距離 查詢附近的城市 實現"查找附近的人"功能 功能需求與實現思路 基本需求 實現思路 命令實現方案 存儲用戶位置 查詢附近的用戶 Java代碼實…

C語言貪吃蛇實現

When the night gets dark,remember that the Sun is also a star. 當夜幕降臨時&#xff0c;請記住太陽也是一顆星星。 ————《去月球海灘篇》 目錄 文章目錄 一、《貪吃蛇》游戲介紹 二、WIN32部分接口簡單介紹 2.1 控制臺窗口大小設置 2.2 命令行窗口的名稱的變更 2…

NIO入門

IO和NIO的區別&#xff1a; IO&#xff1a;通過流處理數據&#xff0c;僅支持阻塞IO。 核心組件&#xff1a;InputStream /OutputStream用于字節的讀寫&#xff0c;Reader / Writer&#xff1a;用于字符流的讀寫。讀取過程中無法被中斷&#xff0c;是阻塞式IO。 NIO:通過管道處…

基于vue.js開發的家庭裝修管理系統開發與設計(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 本家庭裝修管理系統采用B/S架構&#xff0c;數據庫是MySQL&#xff0c;網站的搭建與開發采用了先進的Node.js語言進行編寫&#xff0c;使用了VUE框架。該系統從兩個對象&#xff1a;由管理員和用戶來對系統進行設計構建。用戶的功能包括&#xff1a;注冊、登錄、瀏覽首頁…

OpenCV圖像拼接(5)圖像拼接模塊的用于創建權重圖函數createWeightMap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 庫中用于圖像拼接模塊的一個函數&#xff0c;主要用于創建權重圖。這個權重圖在圖像拼接過程中扮演著重…

LangGraph 怎么控制遞歸次數

這一節我們講講langgraph圖的遞歸限制 Recursion Limit&#xff0c;遞歸限制設置了圖在單次執行過程中可以執行的最大超級步驟數。一旦達到該限制&#xff0c;LangGraph 將引發 GraphRecursionError 錯誤。默認情況下&#xff0c;此值設置為 25 步。遞歸限制可以在運行時為任何…

08-項目中不可控的任務如何安排和驗收

項目中有時會有一些任務的時間是不可控的&#xff0c;不可控的原因在于該工作完全受制于他人。意思就是如果其他人沒有做好&#xff0c;比如前后端同步開發&#xff0c;前端通常可能會快一些&#xff0c;然后要等后端提供接口&#xff0c;這個時候聯調工作是沒辦法開展的&#…