教程http://www.runoob.com/linux/linux-tutorial.html
PHP之linux使用:https://blog.csdn.net/u011146511/article/details/78408477
在Windows上安装linux;首先安装virtualbox创建虚拟机(新建---下一步-----给虚拟机分配内寸-----分配硬盘大小---),然后在virtualbox上安装centOS;
linux远程工具:secureCRT,xshell,putty,ssh secure shell client;
终端输入vi,进入编辑器。vi 文件名,如果文件名不存在则表示创建文件,如果文件名存在则表示编辑文件。
命令模式下,“i”“a”“o”迚入输入模式,可以开始编辑
输入模式下,【esc】键,进入命令模式,可以执行命令。
如退出命令模式下,”:q“退出,“:q!”强制退出,“:qw”保存后退出(修改后并保存才能退出)。
命令状态: 任何键盘输入都是命令
命令状态: [esc] 总是回到命令状态。
编辑状态: 对文本进行编辑, 任何的输入都是编辑内容。
***在命令行模式下,/xx表示搜索xx,(“/”向后查找 ,“?”向前查找, “n”下一个)。
为什么有些命令系统认识,有些命令系统不认识?因为系统通过$PATH($PATH 表示环境变量)寻找命令(可执行文件),如果找到则执行,找不到 到输出”command not found“。
查看环境变量:echo $PATH
$PATH:找寻操作系统可执行命令的路径
Linux/Unix系统下使用冒号“:”分隔路径,windows下使用分号“;”分隔路径;
whoami:显示当前系统登彔用户。
PATH、CLASSPATH、JAVAHOME 的说明
1) 使 PATH 包含 JDK 安装目彔下的 bin 目彔
目的: 将 JDK 带来的开发工具(命令)扩展到 OS 中 如: export PATH=/opt/jdk/bin:$PATH
2) 配置 JAVA_HOME, JAVA_HOME 指向 JDK 的安装目彔JAVA_HOME 的作用: 是指导"某些 Java 软件"找到 JDK如: tomcat 服务器 就使用 JAVA_HOME
实例: export JAVA_HOME=/opt/jdk
3) 配置 CLASSPATH, 指向 Java 类的部署目彔戒者 Jar 文件 用来为 JVM 指明 Java 类的搜索路径, Java 在执行类的时候 在 CLASSPATH 指示的路径下查找类文件
实例: export CLASSPATH=.
4) 注:windows 参考 Java 配置命令
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_01
set CLASSPATH=.
set PATH=C:\Program Files\Java\jdk1.6.0_01\bin;%PATH%分号做间隔。
Windows上有系统变量和用户变量,在两个里都可以配置环境变量,一般推荐在用户变量里配置。
exportCLASSPATH=/home/liucs/demo/bin表示设置 Java 的类文件搜索路径, java 执行时候利用这个路径搜索 Java 的包和类文件 当我们设置了$CLASSPATH,在任意位置都能执行Java文件。
在开发过程中,如果在命令行每次都设置 CLASSPATH,未免麻烦,所以一般环境变量都在系统初 始化脚本中进行配置。
初始化脚本,是指在开机过程中自劢执行的系统脚本文件,一般用来初始化系统环境。Linux 下系统级初始化脚本文件: /etc/profile 所有当前系统的用户登录时候都执行。
shell:
Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。
系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Bash 也是大多数Linux 系统默认的 Shell。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
unix使用的普通的shell,linux使用的是bash;
在windows下想要执行shell脚本,需要使用到"Git Bash",所以我们需要先安装Git。配置git环境变量.
linux的目录结构是树型结构:
查看手册:man 命令
根目录:/
/bin:可执行文件的所在目录;
/boot:内核和启动程序相关文件;
/lib:库目录,系统化最基本的动态共享库;
/media:挂载设备媒体,如U盘,光驱;
/mnt:让用户挂载别的文件系统;
/usr:很多应用会安装到这个目录,用户自己安装的程序在/usr/local;
/sbin:超级管理员执行的可执行文件,ifconfig;
/proc:这个目录是系统内存映射的目录,会保留进程运行的一些信息;
/etc:系统软件的启动和配置目录;etc/passwd,可用man 5 passwd查看文件格式;
/dev:设备文件所在目录; linux一切皆文件;
/home/user:用户的家目录;
ls :*代表任意多个字符,?代表任意一个字符; -R代表递归;-lrt代表按照时间排序;-a查看全部文件,文件前带 . 的是隐藏文件
以 / 开头的是绝对路径;
cd:更换目录;
cd.. 回到上一级目录;
cd - 回到上一次所在的目录;
cd ~回到家目录;cd 也可以回到家目录; cd $HOME也可以回到家目录;cd 用户名回到家目录;
sudo su 或 su -root 或sudo - :切换到超级管理员;
su 普通用户:切换到普通用户
exit 退回到原用户
~:家目录;
$:代表普通用户;
#:代表管理员;
pwd:显示当前的工作目录;
mkdir -p a/b 递归创建,如果不加-p,就只能创建一层文件夹;
安装tree命令:sudo apt-get install tree;
rmdir:删除目录,不能删除空目录(只有.或者..的目录);
rm:删除目录;
which:查看目录或文件的位置;
tab可以命令补齐;
文件操作:
touch:创建文件;touch a.txt b.txt;如果文件不存在则创建,如果存在则只是更改访问时间;
rm: 删除 -r递归删除子目录;-f强制删除;
rm -rf* : 删除当前目录下全部内容;
cp:拷贝文件或者目录;cp 文件 目录;
mv:移动文件或者目录;就是剪切;mv hello aa/hello1(把hello移动到aa文件夹下命名为hello1,如果后面不佳hello,则不改名)
文件内容:
cat:查看文件内容;适合文件内容比较少;
more:查看文件内容;分屏查看;回车是逐行显示,空格是一页一页显示;
less:查看文件内容;分屏显示;回车或者上下方向键可以反复查看内容;
head:查看文件前几行;默认显示十行; head -n 5 a.cpp显示5行内容;
tail:查看文件结尾几行;默认显示十行; -f 可以一直跟踪文件结尾;
统计:
wc:统计行数 单词数
wc -l 行数
wc -w单词数
wc -c字节数
du -h:显示目录占用的空间;
du -h --max-depth=1 递归一层目录;
df -h:显示当前系统空间使用情况;
文件属性和用户组:
ls -l 显示文件列表和信息:
drwxr-xr-x 2 HaokeMaster staff 64 9 7 11:50 b
-rw-r--r-- 1 HaokeMaster staff 12 9 7 12:02 hello
d表示目录;-表示文件;
rwxr-xr-x指用户、用户组、其他用户权限;权限位8进制表示法:0XXX;
1是指硬连接计数;
HaokeMaster指用户;
staff指用户组;
64 目录大小字节数;
11:50目录创建时间;目录名称;
ln:建立软硬连接:
ln 源文件名 目标文件名 : 硬连接,引用的是同一个磁盘地址;
ln -s 源文件名 目标文件名 :软连接,相当于创建快捷方式;
unlink 硬连接文件名:删除硬连接;
硬连接计数为0,磁盘上的文件就被删除;
改变文件权限:chmod
chmod u/g/o/a +/- rwx 目录或文件
u:用户
g:组
o:其他
a:所有
+:增加权限;
-:减少权限 ;
用数字的方式改变权限:0777所有权限;
who am i:显示当前用户名;
chown 用户:组 文件名或者目录 :改变用户和组;
chgrp 组 文件名或目录 :更改组;
查找:
find 目录 [选项] 要找的内容
选项: -name 按照名字查找
-type 按照类型查找( p管道类型 f普通类型 d目录类型)
-type d
-size 文件按照大小查找
-size +1M表示大于1M的文件;
-size +1M -size -5M表示大于1M小于5M的文件;
-maxdepth=1只显示一级即当前目录;find ./ -maxdepth=1 -size +1M -size -5M
find ./ -maxdepth=1 -size +1M -size -5M -exec ls -l {} \;显示详细信息;这句话的意思是把前面find查找到的结果传递给exec后面的命令;exec也可以换成ok,表示安全模式,每次都提示确认;
find ./ -type l|xargs ls -l 也可以显示详细信息;将find查找的结果分成若干块发给后面的指令;
grep过滤:find ./ -type f|grep txt
grep 查找的内容 目录;
grep -rn "内容" 目录:查处的结果带行号
-r :递归子目录
-n: 行号
linux中的压缩包管理:
zip:
打包: zip -r 压缩包名字 源1 源2
解压:unzip 压缩包名字
tar:gzip和gunzip
最常用的打包工具 .tar.gz
打包: tar zcvf 压缩包名(xx.tar.gz) 源名
解压:tar zxvf 压缩包名
-c:压缩文件
-v:显示信息
-f:指定压缩包名
-z:gz格式压缩
bzip2:和tar类似
rar:
打包:rar a -r 压缩包名 源
解压:rar x 压缩包名 源
a表示压缩
x表示解压
连接到虚拟机:
桥接模式:相当于虚拟机是另外一台电脑的ip和本机电脑在同一个网段;
NAT模式:本地主机通过VMNET8网卡连接到虚拟机,要求VMNWET8的ip和虚拟机ip在同一网段;
linux上软件安装和卸载:
apt-get:自动安装,需要联网,
sudo apt-get update ;更新源
sudo apt-get install tree;安装tree命令
sudo apt-get remove tree 卸载tree命令
sudo apt-get clean;清理包
dpkg:
安装:sudo dpkg -i 安装包
卸载:sudo dpkg -r 安装包
源码安装:
用户管理:https://www.runoob.com/linux/linux-user-manage.html
sudo useradd /bin/sh -g group –G adm
-s:指定shell
-g:指定组
-G 用户组 指定用户所属的附加组。
-d:用户家目录
-m:家目录不存在时,自动创建
删除用户:sudo userdel 用户名
删除用户连带删除家目录:sudo userdel -r 用户名
时间date:date +‘%Y%m%d’
echo:输出
man:查看手册
man man:总手册
alias:查看别名;在.bashrc文件中配置别名;
umask:求补码,
umask -s:显示对应的补码权限;
关机命令:
shutdown -h now 立即关机
init 0 关机
power off 关机
reboot 重启
VIM:
命令模式:
vim是vi的增强版;
vimtutor:vim教程;
hlkj:左右上下键
0行首
$行尾
G文件尾
gg文件头
ng到n行
u撤回
x删除光标位置的字母
X删除光标之前的字母
dw从光标所在位置开始删除单词
d$删除到文件尾部
d0删除到行首
dd删除光标所在行
ndd删除光标所在行开始的n行
yy复制一行内容
dd剪切一行内容
nyy复制n行内容
p粘贴
P粘贴
r替换光标处的字母,先输入r再输入一个字母;
进入可视模式:v ,移动光标选中内容,y复制内容,移动光标到目的地,p/P黏贴内容;
查找: / 查找的内容 ? 查找的内容 n往下走 N往上走 光标移动到字符串上按#
vim中格式化快捷键:
整体格式调整gg=G
n>>往右移动几n个tab
n<<往左移动几n个tab
选中函数名, shift+K就进入了文档;2 +K进入到头文件部分文档;
vi 文件 :进入命令行模式;
切换到编辑模式:
命令行进入编辑模式:
编辑模式进入命令模式:
i在光标前插入
a在光标后插入
I在行首插入
A在行尾插入
o在下一行
O在上一行
s删除光标字母变为编辑模式;
S删除当前行进入插入编辑模式;
末行模式:
末行模式不能和编辑模式转换;
命令模式进入末行模式: :
:q 退出 :wq 保存退出 :q!强制退出不会保存 :w保存 :x保存退出 ZZ保存退出(在命令模式下)
末行模式进入命令模式: 两次esc;
:s a/b/g 一行中把a用b全部替换;不加g的话只替换行的第一个a;
:%s a/b/g 把所有的a用b替换;
分屏:只有末行模式才有;
横分 :sp 文件名
竖分 :vsp 文件名
退出一个文件 :q
全部文件退出 :qall
全部文件保存退出 :wqall
末行模式下执行shell命令 icommand
ctrl+W+W分屏幕切换
vim配置文件:
用户的配置文件 /home/用户名/.vimrc
系统的vim配置 /etc/vim/vimrc
~/.bashrc中添加set -o vi ,就可以在shell中使用vim的快捷键;
gcc编译器:
gcc -e hello.c >>hello.i (调用c++) 预处理 头文件展开 宏处理 生成.i文件
gcc -S hello.i (gcc本身) 生成汇编指令.s
gcc -c (as汇编命令) 编译成.o二进制文件
gcc调用ld链接lib库 连接库生成可执行文件.out
查看文件信息: file 文件名
gcc add.c -I ./include/ -o ap 指定包含的路径得到可执行文件ap;
gcc add.c -D DEBUG -o ap D表示指定宏
gcc add.c -o ap -g g表示加上gdb调试信息
gcc add.c -lstdc++ -o ap 编译c++代码
I 包含头文件路径
L包含库文件路径
l 库名 libxxx.so 使用-lxxx
W警告 all显示更多
c编译成.o文件
E 输出到标准输出,宏替换头文件展开
S 编译成汇编
lstdc++ 编译c++代码
o 指定目标文件
g gdb调试使用
O 优化选项1-3
静态库的制作:
编译为.o文件-》把所有的.o文件打包在一起,ar rcs 静态库名.a .o文件-》将头文件和静态库放在一起;
nm .a文件 查看文件
静态库的使用:
gcc main.c(要编译的文件) -o app -I include/(包含头文件) -L lib/(库文件路径) -l cal(库文件,库文件名为libcal.so)
动态库的制作:
-fPIC 编译与位置无关性 编译为.o文件;
gcc -fPIC -c *.c
gcc -shared -o 动态库.so *.o
动态库的使用:跟静态库类似.
动态库的使用需要做一些设置;
方式一:usr/lib、/lib都是放库文件的.如果库文件直接放在这两个地方,都可以被找到;
方式二:添加环境变量用:隔开; export LD_LIBRARY_PATH=/home/hk/.../lib/:$LD_LIBRARY_PATH
方式三:etc/ld.so.conf 中可以配置库路径; 执行sudo idconfig -v;
ldd 文件 检查链接
动态库是在运行的时候加载,多个程序可以公用一个动态库;静态库是直接加到程序中,参与编译;
makefile:
三要素:目标、依赖、规则命令
目标:依赖
tab键 命令
makefile的规则:依赖的时间大于目标文件的时间则重新编译;
makefile默认编译第一个目标,如果想执行其他目标,可以指定目标make test
变量:
Object=xxx.o
使用:$(Object)
函数:
wildcard 可以进行文件匹配
获取所有的.c文件 srcFile=$(wildcard *.c)
.c文件转换成.o文件 objectFile=$(patsubst %.c,%.o,$(srcFile))
这里只目标和依赖 all:app app1
app:$(objectFile)
一个tab键 gcc -o app -I./include $(objectFile)
app1:$(objectFile)
一个tab键 gcc -o app -I./include $(objectFile)
%o:%c (这里的%代表通配)
一个tab键 gcc -o $@ -c $< -I ./include
test:
@echo $(objectFile)
.PHONY:clean all
clean:
-@rm -f *.o
-@rm -f app app1
$@ 代表目标
$^代表全部依赖
$<第一个依赖
$?第一个变化的依赖
@在规则前代表不输出该条规则命令
-代表规则报错仍然执行;
定义伪目标,防止有歧义: .PHONY:clean
如果同时有多个makefile 可以指定:make -f makefile(这个是要指定的makefile)
gdb调试:
启动gdb: gdb app执行程序名称
r(un):启动
start: 启动,停留在main函数,分布调试
n(ext):下一步
step:下一条指令,可以进入函数内部;库函数不能进入;
设置启动参数: set args 参数一 参数二
list:显示10行代码 list 文件:行号
设置断点:b 行号 或者b 函数名 或者 b 文件名:行号
查看断点 :i(nfo) b
删除断点:d/del 断点号
下一个断点:c
查看变量的值:p(rint) 变量名
查看变量类型:ptype 变量名
设置变量的值:set set argc=3;
显示变量的值,用于追踪查看变量的具体什么时候变化:display
删除显示变量:undisolay
查看编号:info display
查看core文件大小: ulimit -c ulimited
设置条件断点 b line if i==1
core配置文件:/pro/sys/kernel/core_pattern