Linux 下一切皆為文件,
文件包括頭文件,庫文件(靜態庫和共享庫),可執行文件,目錄文件,軟鏈接文件,配置文件等。
每個文件都依據權限分為用戶、用戶組和其他人三個身份,權限分為 read,write 和execute。
Linux 的目錄配置是目錄樹,可以使用絕對路徑和相對路徑在系統中確定文件。
Linux 中是沒有擴展名的概念的,可以使用 file 命令查看文件類型,使用 pwd 查看當前工作目錄,cd 更換當前工作目錄,mkdir 創建目錄。
今天通過 protoc 這個命令來理解一下,一切皆文件,這句話的意思。
首先,什么是命令?
ls 命令可能是
(1) 可執行文件
(2) 鏈接到其他可執行文件的軟鏈接文件
(3) 鏈接到其他腳本的軟鏈接文件。
為什么在終端執行 ls 這個命令會打印當前目錄的文件列表
先了解 Ubuntu 系統中各種文件顏色的含義
藍 色:表示文件夾 ,ls -l或ll時可以看到權限部分的第1個字母是d
被綠色陰影框住的,是獲得了最高權限(777)的文件夾綠色:可執行文件,包括jar
淺藍色:軟鏈接文件
紅色:壓縮文件
白色:文本文件紅色閃爍:錯誤的符號鏈接
黃色:設備文件
灰色:其它文件
執行
which ls
會在終端顯示
/usr/bin/ls
可以
cd /usr/bin && ls
可以發現很多文件,其中有淺藍色的軟鏈接文件夾和綠色的執行文件
此時
ls -lah ls
會顯示
-rwxr-xr-x root root 139k 9月 5 2019 ls
再如,執行
which protoc
終端顯示
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/bin/protoc
可以
cd /opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/bin/ && ls
可以發現很多文件,其中有淺藍色的軟鏈接文件夾和綠色的執行文件
如果 ls 執行 protoc
ls -lah protoc
會在終端顯示
lrwxrrwxrwx 1 root root 15 Aug 17 07:33 protoc -> protoc-3.12.3.0
說明 protocol 是一個軟鏈接文件,
protoc 命令軟鏈接到 protoc-3.12.3.0,而 protoc-3.12.3.0 是一個可執行文件。
執行到這里,如果在 docker 環境內,從 git 下載 3.12.2 版本的 protobuf 源碼,之后編譯
mkdir -p cmake/build && cd cmake/buildmake -jmake install
而docker 環境內的 protoc 版本是 3.6.1的,那為什么執行
protoc --version
時會指向,最后顯示的是
libprotoc 3.6.1
而不是剛剛編譯的 3.12.2 版本的 protobuf
which protoc
時,顯示的
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/bin/protoc
得先環境變量 PATH 是什么?
查看所有的環境變量
root@ubuntu:~$ env
查看單個指定的環境變量:
root@ubuntu:~$ echo $PATH
會顯示
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/bin:
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/sbin:
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/bin:
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/sbin:
...:
/usr/local/bin:
/usr/local/sbin:
/sbin:
/bin:
/usr/local/src/jkd/jdk1.8.0_261/bin
環境變量 PATH 的作用
定義命令行解釋器搜索用戶執行命令的路徑
規定系統中的可執行文件的位置。
只要是處于這些位置中的可執行文件,執行的時候就不需要指定路徑,直接執行即可。
什么是命令行解釋器?
參考鏈接
https://blog.csdn.net/weixin_53351797/article/details/126720897
如何設置 環境變量 PATH
設置 PATH(在其原有的路徑的基礎上,增添一個路徑,例如/home/gec)
(1) 臨時設定 PATH
所謂臨時,指的是關閉終端之后就失效
root@ubuntu:~$ export PATH=${PATH}:/home/luxy
(2) 永久設定 PATH
將語句 PATH=$PATH:/home/gec 添加到文件 ~/.bashrc 的末尾
root@ubuntu:~$sudo gedit ~/.bashrc
這樣就可以永久設定PATH(注:其他變量不能亂該)。
由此,可知知道,當執行命令
protoc
時,系統會優先從 環境變量 PATH 中的路徑中尋找 protoc 可執行文件。
在
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/bin:
中找到了 protoc 的可執行文件。那么就不會繼續往下找。
把第一個找到 protoc 的可執行文件當做默認執行的文件夾。
所以,為什么 which protoc 顯示的是
/opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/bin/protoc
所以,為什么編譯從 git 下載 3.12.2 版本的 protobuf 源碼后,沒有升級protoc。
通過 file 查看
file /opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/usr/bin/protoc
顯示
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /opt/bstos/2.2.5.3/sysroots/x86_64-bstsdk-linux/lib/ld-linux-x86-64.so.2, ...
通過 file 查看
file /home/project/protobuf-3.12.3/cmake/build/protoc
終端顯示
protoc:symbolic link to proto-3.12.3.0
再執行
file proto-3.12.3.0
終端顯示
protoc-3.12.3.0:ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, ...
參考鏈接:https://blog.csdn.net/qq_44986938/article/details/106288159