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)