本文將同步發布於 WHU-TD 的博客。
這是一篇自帶故事背景的博客。
總所周知,寫的多,錯的多,更何況一個剛剛接觸 Linux 的小白。雖然只是介紹一些非常基礎的內容,還是希望大家在發現錯誤時可以及時指出。我一定會虛心地更正。
說起來這種又臭又長還沒什么營養的博客大概沒什么人看吧。如果拆成幾篇專門寫某個部分的話大概看的人會更多吧。emmm 不過我還是想寫一篇這樣的博客,雖然網上的教程已經足夠豐富了。如果要問為什么,大概是想整理自己的學習成果,還有,就是想搞點不太一樣的東西吧。
可能有點自說自話,請見諒。我會盡可能寫清楚的。雖然很幼稚,跟小乖乖這個名字很配。
還有,本文面向小白。
本文以 Linux 小白小乖乖的身份,介紹了想在 Linux 下編寫 Hello World.cpp
時遇到的種種問題,並由這個特定的情境,引入介紹了 Linux 的相關基礎知識。
此外,Linux 下打開終端的方法有三個:
- 在文件夾或桌面上右鍵 “用終端打開(run in terminal)”
- Ctrl + Alt + T
- Alt + F2 輸入 gnome-terminal
P.S. 除了第零章,每一章的第一節都是特定的場景,可能沒有什么用處,大家也可以跳過。
P.S. 本文主要基於 Ubuntu 20.04.1 LTS 當然各種版本毫無疑問是有共同性的。
P.S. 我忘記壓縮一下圖片了嗚嗚嗚
好的我壓縮好了改過來了。現在加載應該快了吧 ~
應該不至於看不清吧。(委屈.jpg)
零、我們是開發者
(這一章屬於吹水部分。自行斟酌跳過。)
小乖乖不想學 Linux
相信大家多多少少對 Linux 都有一定的了解。比如,廢物小乖乖就知道 Linux 是一種操作系統,CCF 的評測系統就是在 Linux 上跑的(大概)。
在上一期 zpy 大佬的博客中,我們學習了 Linux 系統的幾個優點,然而固執的小乖乖並沒有因此燃起學習 Linux 的興趣。
為什么總有人告訴我要學 Linux ?Windows 用着不香嗎?Windows 就不能跑代碼了嗎?氣抖冷
事實上,對於學習 Linux ,小乖乖有兩個極端的看法:
- 學習 Linux 就是學習操作系統的原理和開發。管它安不安全開不開源,開了我也看不懂,這跟現階段還在學 C 語言的我也太遙遠了吧?
- Linux 系統是 Windows 系統的備胎。就跟 Android 和 IOS 差不多,反正都只是操作系統,會一個就行了。我現在 Windows 還用的好好的,讓我去學 Linux 干什么?
總而言之,基於功利性的“學了有什么用” 的思維方式,小乖乖原本並沒有心思去學 Linux。
不過,在部長 hxj 的悉心指導下,小乖乖逐漸明白了學習 Linux 的意義和目的。
(以下內容為查詢各種資料后,得出的、純屬個人意見的對學習 Linux 與 Linux 優點的理解,部分內容可能會與上一篇博客相重疊。也許你們會說博客應該以技術分享之類的硬核內容,但我認為,有必要先講清楚學習的目的。就個人的看法而言,我不喜歡在看完面包的介紹前,就被人強行塞進嘴巴里。當然,我也只是一名 Linux 的初學者,許多觀點和看法可能是幼稚而錯誤的,希望大家能指出發現的錯誤。)
在我看來,Linux 與 Windows 最大的區別在於:前者主要是為服務端、開發者設計的系統,后者主要是為客戶端的用戶體驗而設計。
Windows 擁有豐富的圖形界面和大量方便的娛樂、辦公應用程序,而 Linux 雖然沒有那么強大的圖形界面,但由於開源的優勢以及對開發者強大的吸引力,Linux 擁有大量開發者編寫的插件、工具。
同時,Windows 復雜的圖形界面,實現起來必然是繁瑣而復雜的,而在這個實現的過程中,步驟越多,可能出現的漏洞也就越多,可能暗藏的被攻擊的缺口都越多。而 Linux 不同,Linux 具有的圖形界面較為基本,主要的操作都需要利用命令行來實現。同時,Linux 作為開源項目,是大型的網絡開發項目,參與 Linux 維護的開發者數量遠多於 Windows 。“足夠多的眼睛,就可以讓問題浮現”。 這也是 Linux 透明化、安全性高的原因。
同時,上篇博客中提到的可移植性,也使得 Linux 在人工智能/智慧設備等領域有較高的適應性。
當然,也許這些對於現階段的我們,並沒有多大的意義。我們並不明白怎么利用圖形界面下隱藏的漏洞,不明白怎么利用 Linux 的開源資源來進行自己的開發,我們也沒有任何管理服務端的經驗(開過 MC 服或過於神仙的大佬請自習忽略這段話)。
我想,我們學習 Linux,不僅僅要把它當成一種用戶端的操作系統,熟悉其圖形界面與 Shell 下基本的操作,也不僅是學會 git 或是 gdb 這樣的特定工具(當然這里列舉的工具並不限定於 Linux 系統),更重要的是利用學習 Linux 的踏板,熟悉命令行下的操作、轉變自己的思維方式。
我想,我們是開發者,不應讓由於熟悉和習慣產生的惰性遮住我們的眼睛,不應讓自己成為套死在某種別人開發好的工具上的猴子。
上面那句話是一個剛接觸 Linux 的小白一廂情願地對自己說的,僅代表個人極不成熟的觀點,你們可以忽略。
命令行的重要性
命令行的重要性在於裝逼。
跟圖形界面下的操作不同,命令行操作需要你對自己想要干什么有一個清晰的認識,才能選擇恰當的命令,這有助於整理自己的思維。
同時,命令行相對較為簡潔。你不用像圖形界面下那樣,一層一層打開窗口。
命令行也方便於操作的記錄,便於你回想起你的上一步在干什么。
部分的命令行操作是圖形界面所無法完成的,比如訪問 / 目錄(霧)。
下面以 Windows 下的 cmd 控制台為例。
P.S. Windows Dos 的命令與 Bash 有很大的區別,比如給命令添加的要求不是用 -
而是 /
。不過可以多去試試,便於熟悉。(畢竟使用 help
和 /?
就可以很輕松的查到詳細的中文提示,如果單純的想試命令行操作,學起來是飛快的。至於復雜的循環、條件結構和各種運算符語法,度娘可以解答一切)其實 Bash 也可以用 --help
和 -?
來查指令,就是可能沒有中文。
以 Windows 下刪除某個文件夾中的可執行文件為例。
我們進行 C 語言基礎編程學習已經有一段時間了。相信大家也已經編寫了大量的程序。細心的同學還會用不同的文件夾來存放代碼。於是,一個問題就出現了。編譯產生的可執行文件,一不留神就攢下了一堆。這些文件大多只是在老師檢查作業的時候運行以下就沒再碰了,但堆多了就顯得文件夾很亂,也占用空間。
在一般情況下,我們要刪除這些文件,無非就是一個文件夾一個文件夾地找,然后用 ctrl 鍵把它們選定,然后一點一點地刪掉。
但使用 dos 命令可以很快地完成這個工作。
cd /d D:\_ACM
del /s *.exe
如果你厭煩一次一次輸入,你也可以創建一個 .bat 后綴的文件,將上面的代碼復制進去,每次只需要點開它就行了。
好尬啊這個應該都會吧
至於 /d
/s
這些參數還有命令,都可以在 cmd 窗口快速的查詢。如:
cd /?
P.S. cd (change directory) 是改變當前工作目錄的指令。后面會提到一點的絕對路徑和相對路徑,大概會加深你對這個命令的理解。此外 /d 是 Windows 下切換磁盤,而 Linux 下並沒有 C盤 D盤 這樣的概念。 cd 命令或許會成為之后我們使用最為頻繁的指令之一。
好吧我跑題了,記得是要講 Linux 來着。
你可以把在 Linux 桌面上雙擊 a.txt 的操作理解為 gnome 捕獲鼠標動作后幫你執行了 gedit a.txt
。
總之知道命令行和腳本語言很有用就對了。
學會獲取幫助文檔
以 ls
(list files) 命令為例如:
ls --help
man ls
info ls
雖然大多沒有中文,而且help 里有的中文翻得像機翻,但這並不能阻礙各位英語大佬們閱讀文檔的熱情(確信)。
需要小心的是,info 下的鍵入某個鍵時,會被讀取為命令,例如,按下 q 是退出,光標移動到鏈接上按下 space 會進入文檔。info 提供的是一種閱讀解釋文檔的方式。
如果沒有使用 info 的經驗,可以直接用不帶任何參數的 info
命令來查看說明。
如果你習慣把某個命令的幫助信息寫入文件中方便閱讀,可以這么做:
man ls > ls.txt
其實在 dos 里也有類似的用法 就是把命令執行后輸出的信息寫入某個文件中。
dir /? > dir.txt
P.S. dir 命令在 Linux 下似乎同樣有效。與 ls 有相似的效果,都是列出當前目錄下的文件或目錄。
記住命令的方式之一就是聯想英文全稱。
比如刪除文件,在 dos 里是 del
,在 bash 里則是 rm
,其全拼分別為 delete 和 remove 。
所以如果你不知道某個命令叫什么,把能想到的縮寫都用 man
查一遍,總能找到的。man
的各種參數可以用 man --help
或 man man
查到。
雖然我當時沒猜到 rm ,直接跑去百度了。
runoob 上的 Linux 教程其實相當詳細。去上面學習可以很快地掌握。
啊啊雖然這么說但是先別跑啊把我的博客看完(霧)
雖然部分內容我在博客中給出了較為完整的代碼,但實現的方式其實不止一種。例如換源時你們可以用 root 用戶來修改。
我不希望看完我的博客后,你們只知道復制粘貼我或是其它博客的代碼。
一、跨出的第一步
小乖乖以為要搭建環境
Linux 下 C 語言開發環境的配置快得飛起,把沒見過世面的小乖乖嚇壞了。
在 Windows 上,我們需要下載 mingw64 ,然后進行一系列亂七八糟的安裝或是環境變量的配置。
而在 Linux 下,只需要這么一行:
sudo apt install gcc g++ gdb vim
(其實這里面有些東西比如 gdb 是自帶的,這個命令運行后只是把它更新了一遍。)
當然 vim 並不是必須的,vim 是終端下一個很強大的包含代碼高亮的文本編輯器。
Linux 本身自帶了一個 vi ,gnome 桌面則自帶了一個 gedit。gedit 類似於 Windows 下的記事本,而 vi/vim 則是基於命令行的。
在第二章中,會對 vi/vim 文本編輯器的基礎操作做簡單的介紹。與前文講到的 info 有一定的相似之處。
P.S. 輸入密碼時光標是不會移動的,也就是說不會像輸入 qq 密碼那樣顯示星號和圓點。輸完按回車就行了。如果你一直密碼錯誤,可以檢查一下你的數字小鍵盤是不是關掉了、大寫鎖定是否打開了之類的。如果你連密碼都記錯了,emmm 那你可以參考這個。
apt 指令與 root 用戶
首先,當涉及軟件包的安裝和更新時,我們需要在指令前加上 sudo 。這有點類似於 Windows 下的“以管理員身份運行”。
如果不習慣使用指令安裝,也可以通過 Ubuntu Software 來搜索並安裝,操作類似於 Windows 下的應用商店。(它的搜索圖標在左上角,有點小。)
需要注意的一點,使用指令安裝時是在設定的下載源處檢索軟件包。如果下載源沒有收錄你想要的軟件包的話是無法安裝的。
實際上,也有很多軟件需要在官網或 Github 上找到后按它的提示進行安裝。如 Typora,oh-my-zsh,linux qq 之類的東西。
此外,默認情況下,apt 會把軟件安裝到當前用戶下。
# 更新軟件列表
sudo apt update
# 安裝軟件(以zsh為例)
sudo apt install zsh
# 刪除軟件(以zsh為例)
sudo apt remove zsh
# 升級軟件包(全部)
sudo apt upgrade
# 還有 search list 等各種命令,可以自行通過 man 查詢。
既然提到了用戶,我們就來談談 root 吧。
sudo 可以理解為 “以管理員身份運行” 。據目測,在使用 sudo 輸入密碼后,我們 5 分鍾左右不用再輸一次密碼。
大家如果用過安卓系統的一些游戲修改器之類的,想必對 root 權限,或是 超級用戶權限 這樣的詞匯不會感到陌生。(當然,現在大多數手機出於安全和穩定的考慮已經無法輕易開啟 root )
再或者,有一些電腦(比如高中時機房的電腦)的默認用戶是 Administrator ,實際上這也是超級管理員。
初次使用 root 用戶,需要為 root 用戶設置密碼。之后就能使用 su
(switch user) 命令切換到 root 下了。
sudo passwd root
# 輸入一次當前賬戶密碼、兩次給 root 設置的密碼。
su root
下面這兩張圖大概可以在某種程度上說明 root 用戶與普通用戶的區別。
root 用戶可以直接使用 apt install
而不需要添加 sudo。
此外,不難發現,由於我將 oh-my-zsh 安裝在了 qing-lkyi 下,並且所有的配置都在普通用戶下完成,所以 zsh 的高亮消失了,shell 恢復成了默認的 bash。
普通用戶不加 sudo 權限不足。
同時,從 pwd
(print work directory) 的結果來看不難發現,普通用戶的 ~ (默認工作目錄) 要比 root 的 ~ 處在更末端的位置。
這種表述可能有點不太精確,但我想不到更合適的說法了。
在后面終端美化時,我會向大家建議使用 root 用戶進行操作。
此外,別亂用 root。小心帶來破壞。
破壞就破壞唄,反正虛擬機,多玩玩熟悉一下也好。
Ubuntu 換源
首先,換源指的是換 apt 指令的默認下載源,不是換 Ubuntu 的源代碼。
在師兄第一次讓我講換源時,我就產生了這種奇妙的誤解。
實際上,各個國內鏡像站的指南在如何操作上講得已經非常詳細了。不過我還是簡單地介紹一下兩種方式吧。
第一種是圖形界面下的操作。不需要多做解釋。
先找到這個
然后修改下載源 (在“其它”里選)
第二種是命令行下的操作。此處以清華源為例。
第一步是拷貝原有的軟件源配置文件。
# 此處可以注意區別兩種方式
cd /etc/apt
# 這里是方式1 會在 /etc/apt 下創建一個拷貝文件
sudo cp sources.list sources.list.copy
# 這里是方式2 拷貝到 ~ 的下級文件夾
cp sources.list ~/Desktop/sources.list.copy
P.S. 文件不一定要命名為 .copy ,我只是為了方便區分。
由於普通用戶沒有在 ~ (也就是 /home/qing-lkyi) 的上級目錄中創建文件的權限,所以在使用時需要 sudo。
而 cp
到當前用戶的工作目錄下(也就是在當前工作目錄下創建文件),則不需要 sudo。
當然,為了防止丟失,備份到 /etc/apt 下還是比較推薦的。
第二步是修改。
# 選擇自己喜歡的文本編輯器來修改就行了
# cd /etc/apt
sudo vi sources.list
sudo vim sources.list
sudo gedit sources.list
同理,普通用戶是沒有修改 ~ 上級目錄中的文件的權限的。所以需要 sudo。
將該文件里的內容刪掉或注釋掉,直接改成各個鏡像站提供的代碼就行了。
如清華源的:(注釋不是我寫的,是它自帶的)
# 默認注釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消注釋
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 預發布軟件源,不建議啟用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
保存(寫入)后退出即可。
有些博客好像先更改了 sources.list 的權限再修改,不過我的實際操作中是不需要這一步的。
另外,如果你之前已經安裝過了像 typora 這樣的軟件,可能需要保留安裝時添進去的部分,如
deb https://typora.io/linux ./
# deb-src https://typora.io/linux ./
如果你不確定自己的刪減是否會對這些軟件的更新產生什么樣的影響,那么建議采用圖形界面下的換源方式,它會自動為你保留這些額外的軟件源。
P.S. 其它國內源的操作同理。這里給出幾個公認能夠信任的源的幫助頁面作為參考。
清華源: https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/
網易源: http://mirrors.163.com/.help/ubuntu.html
中科大源:http://mirrors.ustc.edu.cn/help/ubuntu.html
阿里源: https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.3e221b116UQE41
雖然我不太清楚鏡像站是干啥的,不過好牛逼的樣子
無論哪種方式,在完成換源后,最好使用如下指令來更新:
sudo apt update
sudo
P.S. 在上面我們 cd
到了 /etc ,那么這個文件夾是干什么的呢?
(以下內容引自百度知道)etc是 and so on 的意思,來源於法語的 et cetera 。在/etc下面存放的是配置文件等一些零碎的東西。
感興趣的可以 cd 到 / 目錄下,看看各個文件夾里都放了些什么東西。
二、文件與目錄
小乖乖想創建文件
小乖乖遇到了一個難題:如何創建一個 hello world.cpp
通過查閱博客,小乖乖發現 touch
可以創建一個新文件。
於是小乖乖自作聰明的鍵入了這樣的命令:
cd ~/Desktop && mkdir ACM && cd ACM
touch hello world.cpp
於是創建了 hello 和 world.cpp 兩個文件(霧)
小乖乖不服,又鍵入了:
rm hello world.cpp
touch "hello world.cpp" && ls -a
心想着這次總該創建出來了吧,結果 ls 出來一個帶單引號 'hello world.cpp'。
沒見過世面的小乖乖嚇壞了,打開圖形界面下的文件夾一看,才發現這個單引號只是為了 ls 展示時避免誤會加上去的,真實的文件名並沒有引號。
愚蠢的小乖乖流下了不爭氣的眼淚。
P.S. 其實空格也可以用 \ 轉義。比如小乖乖就可以這樣打開文件:
vim "hello world.cpp"
# 或是
vim hello\ world.cpp
命令行下的文件操作
首先談談創建文件與文件夾。
在上面的情境中,我們已經看到了 mkdir
touch
的效果。
其中 mkdir
(make directory) 就是創建文件夾。而 touch
嚴格來說並不是新建文件,而是 change file timestamps (修改文件時間屬性) ,在沒有 -a 情況下,如果文件不存在,就會創建一個空文件。
rm
(remove) 在第零章也有點到。rm 默認只是刪除文件,如果想刪除包括文件夾在內的整個目錄(如 ACM),需要使用 rm -r ACM
同時,在上面的情境中大家也不難發現,touch 和 rm 可以在后面同時接多個文件。
關於這兩個命令跟深入的解釋及其建議,可以通過 man rm 來查詢。
ls 命令則可以列出某個目錄下的文件,及其權限、數量、時間等。如:
# 查看 sources.list 的權限要求
ls -l /etc/apt/sources.list
P.S. 使用 ls 指令列出文件時,你可能會看到兩種不同的顏色,這是為了區分文件與文件夾。使用 -a 參數,則可以列出隱藏的文件(大多是 . 開頭的)。至於那些比較特殊的,高亮跟別的不一樣的文件,我也不明白其中的原因。(例如 /usr/bin/mount 或是 /etc/localtime 之類的,目測都是一些可執行的文件)
此外,你還可以通過文本編輯器來創建新文件。如:
# 當前不存在 a.txt
gedit a.txt
vim a.txt
需要注意的是,文本編輯器的原理是在某處創建一個臨時文件,然后你會在文本編輯器中修改這個臨時文件。只有保存、寫入了,這個文件才算真正創建完成,不然你只是打開了文本編輯器而已。
絕對目錄與相對目錄
Linux 的文件路徑,有點類似於 Android。
啊不對我說反了,應該說 Android 的文件路徑,有點類似於 Linux。
二者都以 / 為根目錄,也都用正斜杠來分割目錄。
前面也有提到,Linux 下沒有 C盤 D盤的說法。關於這一點我不想討論(因為我也不會)。
在此處,我想介紹一下 相對路徑 與 絕對路徑。
其實我想這一點大家都非常清楚,沒有介紹的必要。只是我在一開始接觸 Linux 時,遇到過一個難以理解的問題。
由於 Linux 的根目錄是 / ,而子目錄與父目錄間也是靠 / 分割開,所以我一開始看到 /usr/bin 這樣的路徑時,我完全沒轉過彎來。我以為這個最前面的 / 是用來分割子、父目錄的,以為加與不加沒有區別。我甚至猜測了好久這個 /usr/bin 是在哪個目錄下才存在的相對路徑。
直到后來,我才知道第一個 / 可以理解為根目錄,這個 /usr/bin 是絕對路徑。
下面舉兩個例子,一個 Windows,一個 Linux:
- 假設當前 cmd 處在 C:\ 目錄下,而 C:\ 的子文件夾 Windows 中存在一個文件 py.exe ,此時,這個文件的相對路徑就是 Windows\py.exe ,而絕對目錄則是 C:\Windows\py.exe。
- 假設當前 shell 的工作目錄是 ~ (/home/qing-lkyi) ,而桌面的 ACM 文件夾中有一個 a.cpp ,則相對路徑為 Desktop/ACM/a.cpp ,絕對路徑為 /home/qing-lkyi/Desktop/ACM/a.cpp
使用 cd 可以改變當前工作目錄,使你能夠使用更短的相對路徑。在你需要在某個文件夾中執行很多操作時,cd 進去會讓你的工作方便許多。
P.S. 在使用 ls -a 時我們會發現每個目錄最開始基本都有兩個這樣的東西:. 和 .. 。其用法是 cd ..
,可以前往上一級的目錄。
前面介紹過的 pwd 指令則可以告訴你當前的工作目錄。
此外,Linux 中也有類似於 Windows 中 %path% 那樣的環境變量的東西。如:
# 查詢當前正在運行的是哪種 shell
echo $SHELL
(echo 與 dos 中的使用方法相同,效果類似於 C 中的 printf)
P.S. 使用 ls /usr/bin
,你會發現各種各樣的命令都放在那里面。不難發現,與 Windows 中每一個 dos 命令其實都是在調用 %path%
目錄下的某個可執行文件的原理類似,而每個 bash 命令也是在執行某處存在的可執行文件,而你在命令后輸入的參數,則是那個文件執行時傳入的參數。而這也是我們在使用 gcc 編譯指令時需要在環境變量 path 里添加 mingw64\bin 的原因。
三、文本編輯與 Vim 配置
小乖乖不會用 Vim
沒錯,小乖乖不會用 Vim。
Vim 的具體使用教程可以參考runoob
此處只對一些最基本的使用和注意事項進行一些介紹。
首先,Vim 是基於終端的文本編輯器。
我們知道,在 Linux 的終端下,光標並不會隨着我們鼠標的點擊而移動。但是,我們仍可以利用鼠標選定一段文字,然后使用 Ctrl+Shift+C 拷貝。
P.S. 粘貼和拷貝 (Ctrl+Shift+V) 操作在終端上需要用上 Shift ,而非終端界面下則不需要。以及光標不會隨鼠標點擊移動這一點,是使用 Vim 需要適應的第一個問題。
使用 vim 指令打開一個文件后,我們需要通過鍵盤鍵入命令。
P.S. 不要亂按鍵盤!不要亂按鍵盤!不要亂按鍵盤!在進入底線命令行模式或插入模式前,你在鍵盤上的每次敲擊都可能會被解讀為命令。
目前,小乖乖只會按 i 進入插入模式后在上面輸入內容,然后按 Esc 退出插入模式,輸入 : 進入底線命令行模式。
此處再引用一下 runoob 的三個圖片:(節省空間,只放鏈接不展開)
1,
2,
3。
在底線命令行模式下,比較常用命令如下:
- :w 保存 (write) 或者說寫入
- :w! 強制寫入只讀文件 (需要權限)
- :q 退出,在后面加上 ! 則是不保存強制退出
- :wq 上面的命令和 ! 也可以組合起來用
- :h 查看幫助文檔(同樣需要 :q 來退出幫助文檔)
- :! command 暫時離開 vim 執行某個 shell 命令 (在編寫 shell 腳本時忘了語法就可以用這個指令)
Vim 有自帶的代碼縮進。而且高亮也挺好看。可以去試一試。
環境變量與 Vim 簡單配置
其實這部分我本來沒打算寫的。結果翻了下網上的博客,發現自己根本沒有 VIM 這個變量,~ 目錄下也找不到 .vimrc 。被迫自己亂翻了一通。所以干脆也寫一下好了。
首先是第一個問題:找到配置文件的位置。
根據網上的博客,Vim 在安裝時會默認為我們預設一個環境變量 VIM ,只需要 cd $VIM
然后找到 vimrc 就可以進行修改。
而現實是,由於某種不知名的原因,我根本沒有這個變量。
P.S. 想查看環境變量的值,可以使用 echo $HOME
,若輸出空行,表明變量為空或不存在。
既然它沒有,那我們可以手動搞一個。 (參考)
# 查看 vim 的安裝和配置文件位置。
vim --version
# 使用隨便一個文本編輯器打開 /etc/profile 文件
sudo vim /etc/profile
# 打開后在文件最后加入一行:
# export VIM=/usr/share/vim
# 保存后,手動在右上角注銷就行了。
# 你也可以直接重啟(好像沒區別?)
reboot
需要注意的是, export 后面跟的是一個完整的表達式,不能在亂加空格,否則會被解讀為多個並列表達式。此外,/usr/share/vim 這個是根據 vim --version
查到的,建議自己查一下不要照搬。
(其實 /etc/vim 里頭也有一個這樣的東西)
你也可以試着看一下 profile 文件里面是啥。一不小心可能就學會了 shell 腳本的循環和 if
另外,profile 文件的修改需要注銷后生效。
P.S. 直接使用 export 指令也可以設置環境變量,不過跟 Dos 的 set 一樣,設置的這個環境變量是暫時的。想要永久地保存,只能通過修改系統文件。
這里也可以大膽猜測一波,profile 是每次注銷重啟后會自動運行的文件。
事實證明,在我往這個文件的最末尾添加 gedit
后,每次重啟時它都會打開一次 gedit 的界面。猜想成立。
(不過這個是危險動作,在沒有把握時請勿隨意模仿,別亂改文件把系統改崩了)
P.S. 《算法競賽入門經典第二版》的最后部分有寫到 Linux 下的常用命令,其中有提到 set 可用於修改環境變量。然而在實踐中,我發現 set 指令並沒有這樣的功能(只能顯示而不能修改)。也可能是版本不同的緣故吧。當然,Windows 下的 set 確實有修改變量的功能。
此外,不知道為啥 man export 查不到幫助文檔。
嗯,好像跑題了,讓我們繼續 vim 的配置。
經過一波猛如虎的操作,我們打開了 $VIM/vimrc
sudo vim $VIM/vimrc
然后小乖乖看到了如圖的注釋,發現里面並沒有配置項,需要自己寫進去,於是小乖乖意識到需要找到注釋里的 debian.vim 來參考。
接着小乖乖發現自己連 VIMRUNTIME 這個環境變量都沒有,根本找不出來。本節完。
沒辦法,小乖乖只能去找官網了。結果發現官網要登陸,於是又灰溜溜地回來了。
然后小乖乖試着運行了如下命令: sudo find / debian.vim
當場去世。小乖乖終於意識到自己可能裝了個假 vim。
(也許只是誤會了注釋的含義 debian.vim 這個文件本來就不存在)
由於裝逼失敗,所以被迫向博客屈服。小乖乖挑了個博客教程 開始照着打了(霧)。
cd ~ && touch .vimrc
vim .vimrc
# 然后在打開的文件中輸入
set tabstop =4
set shiftwidth =4
set nowrap
# :wq 保存並退出即可
# 至於為什么要加這兩項配置,因為默認的八空格 tab 是真的毒瘤
P.S. 其實 Vim 還有其它強大的功能和插件,大家可以自行查找資料,或者我們后續的博客中也會講到這樣的內容。
Linux 文件權限
小乖乖的 hello world 打炸了。需要寫個對拍。
但是小乖乖不會 bash,所以只能從最基礎的開始學起了。
(其實這里我想直接抄紫書的代碼上來的,但是解釋起來太麻煩了,不解釋又顯得很毒瘤,就干脆隨便編一個別的了)
啊我是不是忘了解釋 shell 是什么了。可以簡單地與 Windows 下的 cmd 控制台類比。Shell 是一個應用程序,提供了一種通過終端窗口用命令行操作系統的方式。或者說,shell 是一種命令行解釋器。
Linux 的腳本與 dos 下的腳本(也就是我們常說的批處理文件 .bat )非常相似。
簡單地說,腳本的意義在於把多行的命令提前編寫好,然后通過腳本來便捷的運行。
當然,腳本語言也有自己獨特的語法,這里讓我講清楚是不可能的(因為我也不會)。所以此處只是作為文件權限的引入。
首先我們寫一個簡單的腳本。根據腳本的語言,我們可以自行選擇后綴名(如 py php)也可以不用后綴名。只需要在最開頭聲明自己的類型就好了。
現在,我們新建一個 test.sh 。
#!/bin/bash
for i in ~/Desktop/ACM/*.cpp; do
cat $i >> a.txt
done
unset i
(這個是我模仿 profile 里的那個循環打的。其實沒有啥用。就是把直接目錄下的 .cpp 全部拷貝到 a.txt 里)
但是,只有這個是不能運行的。因為新創建的文件並沒有可執行的權限。
使用 ls -l test.sh
可以看到它的權限。
(以下內容引自這里)
r 是 readable 即可讀取,w 是 writeable 即可寫入,x 是 executable 即可執行。
查到的權限分為三部分:
- 文件所有者/超級用戶 u (user)
- 與文件所有者在同一群組中的用戶 g (group)
- 其它的用戶 o (others)
目前,我們只需要知道第一部分其實足夠了。
而第二部分可以像上午的網安導論課上老師講的那樣理解:
比如,所有者是“打印員”中的一員,那么 g 就是其它同樣是打印員的人具有的權限。
P.S. ls 查到的第一個參數是文件類型。d - 目錄(文件夾) ,- 則是文件。
我們可以使用 chmod
(change mode) 修改文件權限。
# 賦予所有用戶執行 test.sh 的權限
# a 表示 all 所有用戶
chmod a+x test.sh
chmod u+x,g+x,o+x test.sh
# 賦予所有用戶完整的 rwx 權限
chmod 777 test.sh
P.S. 權限的數字表示:1 對應 x,2 對應 w,4 對應 r。是基於二進制的三個數位的。
例如,我們希望 u 的權限為 rwx,r 的權限為 rw-,o 的權限為 r--。我們可以這么干:
chmod 764 test.sh
在修改完后,我們就可以用 source test.sh
來執行了。
番外、咕咕篇
按照牛頓第三定律,番外篇肯定是要咕的。不然澳大利亞的袋鼠每年也不會參與印第安人的啤酒節聚餐了,特朗普也不會受到二氧化碳排放增加的影響了。
說起來現在才講中文設置是不是有點晚了
因為寫太多了我已經懶得再解釋了。自己鼓搗或是看別的我參考的博客吧。
Linux 中文 & 時區設置
自己鼓搗。我懶得截圖了。
說不截還是隨便截一下的。
總之就是在桌面找到 Setting 和 Language Support 那兩個圖標基本就可以完成了。
大家手機用得那么溜翻個設置算什么。
Zsh 與 Oh-my-zsh 安裝
zsh 是個好東西。至少目前用起來很舒服。比如 tab 路徑補全和 oh-my-zsh 舒適界面。
zsh 的命令跟 bash 很像。除了 help 命令用不了以外基本一致。
參考這里
# 先裝 zsh
sudo apt install zsh
su root
# 安裝的指令去官網 https://ohmyz.sh/#install 查
# 使用 curl 的話你還要這個
sudo apt install curl
# 如果你沒有FQ, 建議使用 wget, 至少我遇到了一點錯誤
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
# 然后你會看到連接失敗 (403) 的是 raw.githubusercontent.com
# 於是去 site.ip138.com 查下 ip
# 然后調個地理位置較近的如 151.101.76.133 (不曉得是不是固定的,所以還是查一下)
ping 151.101.76.133
# 也可以挑別的 ping 一下,看着差不多還行就 Ctrl+C 強制終止執行
# 用文本編輯器打開
sudo vim /etc/hosts
# 在最后一行加入 (以 151.101.76.133 為例)
# 151.101.76.133 raw.githubusercontent.com
# 然后再跑一次上面的安裝命令
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
# 看到作者在終端輸出的那個很騷的 Oh My Zsh 才算成功
其實在終端的圖形界面上也有可以調的。比如字體、配色。可以去試試。
Oh-my-zsh 插件與主題
# 在這里查詢自帶的插件/主題
ls $ZSH/themes
# 每個插件文件夾里面都有個 readme.md
ls $ZSH/plugins
# 在這個目錄下獲取其它的非自帶的插件/主題
cd $ZSH/custom && ls
# 根據作者的注釋編輯這個文件來設定插件/主題
vim .zshrc
# 編輯 .zshrc 文件。注釋很詳細了。
# 如果你是在安裝時自帶的那幾個里面挑主題,設置時記得別把后綴名也復制進去了
# 外來插件的安裝可能相對復雜,參考博客試一試
因為我不會,所以以下內容不限期咕咕咕。部里的其它小伙伴也可以接坑。
Linux 硬盤
Linux 各目錄下文件功能
Vim 進階操作與插件/美化
Git 基礎操作及原理
gdb 調試基礎
虛擬機與主機間的文件共享
虛擬機與主機間的網絡通信
Gnome 桌面美化/主題更換
Shell Script 詳解
Linux 火狐瀏覽器部分 js 失效的處理
Linux 快捷鍵一覽
未完待續
沒錯上面的我都不會。