linux常用語法學習
Linux文件權限
文件權限是指不同的用戶或用戶組對某個文件擁有的權限,文件的權限分爲三種:
- r:讀
- w:寫
- x:可執行
ls files -l #查看文件信息
-rw-r--r-- 1 wandering wandering 0 5月 3 03:13 a.cpp
---|---|---|
用戶|用戶組成員|其他用戶
可以使用二進制表示文件權限
r=4
w=2
x=1
修改文件權限命令 chmod命令
修改文件所屬用戶chown命令
ls hello -l #查看編譯好的hello二進制文件
-rwxr-xr-x 1 wandering wandering 8304 5月 3 03:31 hello
./hello
Hello World!
#成功運行
chmod 664 hello #修該文件權限爲-rw-rw-r--
ls hello -l #查看編譯好的hello二進制文件
-rw-rw-r-- 1 wandering wandering 8304 5月 3 03:32 hello
./hello
bash: ./hello: 權限不夠
chmod 777 hello #修該文件權限爲-rwxrwxrwx
ls hello -l #查看編譯好的hello二進制文件
-rwxrwxrwx 1 wandering wandering 8304 5月 3 03:32 hello
./hello
Hello World!
#再次成功運行
linux連接文件
Linux有兩種連接文件:符號連接(軟連接)和硬鏈接,符號鏈接類攸Windows下的快捷方式。硬鏈接通過文件系統的inode連接來產生新文件名,而不是產生新文件。
inode: 記錄文件屬性,一個文件一個inode。inode相當於文件ID,查找文件的時候要先找到inode,然後才能讀出文件的內容。。
ln命令
ln命令用於創建連接文件:
ln [選項]源文件目標文件
選項:
- -s 創建符號鏈接(軟連接)
- -f 強制創建連接文件,如果目標存在,那麼先刪除掉目標文件,然後再建立連接文件
硬鏈接
硬鏈接是多個文件都指向同一個inode,硬鏈接知識點:。
- 具有相同inode.的多個文件互爲硬鏈接文件,創建硬鏈接相當於文件實體多了入口。
- 對於硬鏈接文件,只有刪除了源文件以及對應的所有硬連接文件,文件實體纔會被刪除
- 根據硬鏈接文件的特點我們可以通過給文件創建硬連接的方式來防止文件誤刪除
- 不論修改源文件還是連接文件。另一個文件的數據都會被改變
- 硬連接不能跨文件系統
- 硬連接不能連接到目錄
因爲以上這些限制,硬鏈接其實不常用
軟連接
符號連接類似Windows下的快捷方式,符號鏈接也叫做軟連接,軟連接要用的多。符號連接相當於創建了一個獨立的文件,這個文件會讓數據讀取指向它連接的哪個文件的文件名。軟連接的特點:。
- 可以連接到目錄
- 可以跨文件系統
- 刪除源文件以後,連接文件也就打不開了
- 符號連接文件通過->來指示具體的連接文件
- 符號連接要使用絕對路徑
注意
copy 時 :cp -d 保證軟連接的屬性
一定要使用絕對路徑,否則拷貝走之後就會失效。
diff
diff [-abBcdefHilnNpPqrstTuvwy][-<行數>][-C <行數>][-D <巨集名稱>][-I <字符或字符串>][-S <文件>][-W <寬度>][-x <文件或目錄>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目錄1][文件或目錄2]
- -B或–ignore-blank-lines 不檢查空白行
- -c 顯示全部內文,並標出不同之處
- -C<行數>或–context<行數> 與執行"-c-<行數>"指令相同
- -d或–minimal 使用不同的演算法,以較小的單位來做比較
- -D<巨集名稱>或ifdef<巨集名稱> 此參數的輸出格式可用於前置處理器巨集
- -e或–ed 此參數的輸出格式可用於ed的script文件
- -f或-forward-ed 輸出的格式類似ed的script文件,但按照原來文件的順序來顯示不同處
- -H或–speed-large-files 比較大文件時,可加快速度
- -l<字符或字符串>或–ignore-matching-lines<字符或字符串> 若兩個文件在某幾行有所不同,而這幾行同時都包含了選項中指定的字符或字符串,則不顯示這兩個文件的差異
- -i或–ignore-case 不檢查大小寫的不同
- -l或–paginate 將結果交由pr程序來分頁
- -n或–rcs 將比較結果以RCS的格式來顯示
- -N或–new-file 在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示
- Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較
- -p 若比較的文件爲C語言的程序碼文件時,顯示差異所在的函數名稱
- -P或–unidirectional-new-file 與-N類似,但只有當第二個目錄包含了一個第一個目錄所沒有的文件時,纔會將這個文件與空白的文件做比較
- -q或–brief 僅顯示有無差異,不顯示詳細的信息。
- -r或–recursive 比較子目錄中的文件
- -s或–report-identical-files
- -S<文件>或–starting-file<文件> 在比較目錄時,從指定的文件開始比較。
- -t或–expand-tabs 在輸出時,將tab字符展開。
- -T或–initial-tab 在每行前面加上tab字符以便對齊。
- -u,-U<列數>或–unified=<列數> 以合併的方式來顯示文件內容的不同。
- -v或–version 顯示版本信息。
- -w或–ignore-all-space 忽略全部的空格字符。
- -W<寬度>或–width<寬度> 在使用-y參數時,指定欄寬。
- -x<文件名或目錄>或–exclude<文件名或目錄> 不比較選項中所指定的文件或目錄。
- -X<文件>或–exclude-from<文件> 您可以將文件或目錄類型存成文本文件,然後在=<文件>中指定此文本文件。
- -y或–side-by-side 以並列的方式顯示文件的異同之處。
- –help 顯示幫助。
- –left-column 在使用-y參數時,若兩個文件某一行內容相同,則僅在左側的欄位顯示該行內容。
- –suppress-common-lines 在使用-y參數時,僅顯示不同之處。
"3c3"和"8c8"文件在3行和第8行內容有所不同
"11,12d10"表示第一個文件比第二個文件多了第11和12行
diff log2014.log log2013.log -y -W 50 #文件並排顯示
perf性能分析工具
perf常用參數
參數 | 功能 |
---|---|
-C | 指定統計的CPU核心編號,不指定時統計全部核心(等價於-a) |
-e | 指定統計事件 |
-p | 只統計特定pid指定的進程中產生的事件 |
-t | 只統計特定tid指定的線程中產生的事件 |
-K | 隱藏內核中的函數符號 |
-U | 隱藏用戶態的函數符號 |
-g perf record | 工具專用的參數,記錄函數的調用棧信息 |
- perf list:命令可以列出perf支持的內置事件列表
- perf stat:可以用於統計分析系統或者特定軟件的整體執行情況
查看公網IP
curl cip.cc
uname命令
Linux uname命令用於顯示系統信息
uname [-amnrsv][--help][--version]
參數:
參數 | 作用 |
---|---|
-a 或all | 顯示全部的信息 |
-m或–machine | 顯示電腦類型 |
-n或-nodename | 顯示在網絡上的主機名稱 |
-r或–release | 顯示操作系統的發行編號 |
-s或–sysname | 顯示操作系統名稱 |
-v | 顯示操作系統的版本 |
–help | 顯示幫助 |
–version | 顯示版本信息 |
linux 文件系統
文件目錄介紹
/ 就是跟目錄
目錄 | 內容 |
---|---|
/bin | 存放二進制可執行文件, 這些命令在單用戶模式下也能夠使用。可以被root和一般的賬號使用 |
/boot | Ubuntu內核和啓動文件,比如wminuz-0xx. gurb, 引導裝載程序 |
/dev | 設備驅動文件 |
/etc | 存放一些系統配置文件,比如用戶賬號和密碼文,各種服務的起始地址 |
/home | 系統默認的用戶主文件夾, 一般創建用戶賬戶的時候,默認的用戶主文件夾都會放到此目錄下 |
/lib | 存放庫文件 |
/media | 此目 錄下放置可插拔設備,比如SD卡,或者U盤就是掛載到這個目錄中 |
/mnt | 用戶可使用的掛載點,如果要掛載一些額外的設備,那麼就可以掛載到此處 |
/opt | 可選的文件和程序存放目錄,給第三方軟件放置的目錄 |
/root | root用戶目錄,也就是系統管理員目錄 |
/sbin | 和/bin類似,也是存放一些二進制可執行文件,sbin 下面的一般是系統開機過程中所需要的命令服務相關目錄,比如網絡服務 |
/sys | 記錄內核信息,虛擬文件系統 |
/tmp | 臨時目錄 |
/var | 存放一些變化的文件,比如日誌文件 |
/usr | usr不是user的縮寫,而是UNIX Sofware Resource的縮寫,存放於系統用戶有關的文件,會佔用很大的存儲空間 |
/proc | 虛擬文件系統,數據放置到內存中,存放系統運行信息 |
絕對路徑和相對路徑
相對路徑 . 當前路徑 . .上一層路徑
絕對路徑 從跟目錄/算起的路徑
壓縮與解壓縮
linux下常用的壓縮格式有:tar,tar.bz2、tar.gz;
gzip壓縮工具
gzip a.cpp #壓縮
gzip -d a.cpp.gz #解壓縮
gzip -r gziptest #壓縮文件夾,但是不提供打包服務,僅僅把文件夾下面的內容壓縮而已
tar打包工具
tar工具參數
參數 | 功能 |
---|---|
-f | 使用歸檔 |
-c | 創建新歸檔,創建壓縮文件 |
-x | 從圖檔中解出文件,解壓縮 |
-j | 示使用bzip2壓縮格式 |
-z | 使用gzip壓縮格式 |
-v | 打印出命令執行過程 |
tar -vcf gziptest.tar gziptest #打包目錄下文件
tar -vxf gziptest.tar #解包目錄下文件
tar -vczf gziptest.gz gziptest #壓縮.zp
tar -vczf gziptest.gz #解壓縮
rar打包
rar a gzip.rar gzip #壓縮文件夾
rar x gzip.zip #解壓縮文件夾
linux用戶
Linux是一個多用戶操作系統,不同的用戶擁有不同的權限。可以查看和操作不同的文件。Ubuntu 有三種用戶:
- 初次創建的用戶
- root用戶口
- 普通用戶
初次創建的用戶權限比普通用戶多,但是沒有root用戶多,初次創建的用戶可以創建普通用戶。
Linux用戶記錄在/et/passwd這個文件內。
Linux用戶密碼記錄在/gtc/shadow這個文件內。
每個用戶都有一個ID,叫做UID。
sudo apt-get install gnome-system-tools #安裝圖形化界面用戶用戶組管理
adduser #添加用戶
finger #查找用戶
passwd #設置密碼
delusr #刪除用戶
addgroup #創建用戶組
delgroup #刪除用戶組
make學習
當做工程文件的時候需要使用make,make依賴Makefile文件。
因爲文件較多的時候,我們自己手動輸入編譯會很麻煩。
使用案例
首先需要創建文件:
/********************創建input.cpp文件*************************/
#include <iostream>
using namespace std;
void inputNumber(int *a,int *b)
{
cin >> *a >> *b;
}
/********************創建input.h文件*************************/
#ifndef __INPUT_H_
#define __INPUT_H_
void inputNumber(int *a, int *b);
#endif
/********************創建hello.cpp文件*************************/
#include <iostream>
#include "input.h"
using namespace std;
int main()
{
int a,b;
inputNumber(&a, &b);
cout << "a + b = " << a + b << endl;
return 0;
}
然後進行手動編譯
g++ hello.cpp input.cpp -o hello #編譯
./hello #執行
這樣會很麻煩,兩個文件就要輸入那麼多,當文件較多的時候就會更加的麻煩了,因此我們需要使用make
###############創建Makefile文件##############################
1 main: hello.o input.o
2 g++ -o hello hello.o input.o
3 hello.o: hello.cpp
4 g++ -c hello.cpp
5 input.o: input.cpp
6 g++ -c input.cpp
7
8 clean:
9 rm *.o
10 rm hello
再編譯文件就很方便了
make
./hello #這樣程序就會直接運行
makefile語法
Makefile規則格式
目標:依賴集合
命令 1
命令 2
......
main: hello.o input.o
g++ -o hello hello.o input.o
#命令列表中的每條命令必須以TAB鍵開始,不能使用空格。
Makefile變量
main: hello.o input.o
g++ -o hello hello.o input.o
###############用變量把上面改寫##################
objects = hello .o iput.o
main: $(object)
g++ -o hello $(object)