Linux入门精要
Linux历史
1970年: linux元年,起始开发者为 Kenneth Lane Thompson 和 Dernis Ritchie,
现在知道为啥很多计算机是用1970年1月1日0点0分0秒作为记录时间的起点了吧。
1983年 GNU计划公布,主导者为 Richard Matthew Stallman,GNU 是 "GNU is Not UNIX" 的简写。
另外 Emacs, GCC, GDB也出自Stallman之手。
1991年4月 Linus Benedict Torvalds 编写出第一个可运行的 linux ,版本号:0.00.
随后,毕业于MIT的华裔 Theodore Ts'o 提出并实现了ext2文件系统。
Linux主要发行版
Redhat rpm软件包就出自 Red Hat 公司。
CentOS 基于 RedHat的社区版,开源免费。
Mandriva: 来自欧洲的一个发行版,以rpm作为软件管理工具。该发行版方便易用,硬件兼容性好。
SUSE: 来自德国的发行版,界面漂亮,但消耗资源多。
Debian 以稳定保守著称,deb软件包和apt软件包管理器来自于它。
Ubuntu 基于Debian的linux发行版。
计算机启动流程
按开机键
BIOS检查硬件
(CPU,内存,显卡...); 去MBR启动Grub.
(注: MBR, 512字节,硬盘0号扇区,不属于任何一个分区,包含启动代码(此处为Grub) 和硬盘分区表。)
Grub
读取 /boot/grub/grub.cfg 文件,根据配置显示启动界面。
(注:多系统的配置信息也存放在 grub.cfg中)
(重装Windows后Grub的修复:
用LiveCD启动电脑
2)获取权限: sudo -i
挂载根目录对应的分区:mount /dev/sda1 /media/
如果你当时还未 /boot 划了单独的分区,还需运行: mount /dev/sda2 /media/boot/
grub-install -root-directory=/media/ /dev/sda
6)重启电脑
)
加载内核
启动0号进程 init
Grub配置
sudo gedit /etc/default/grub
主要配置参数
GRUB_DEFAULT=0 默认启动第一个OS,如果是saved,则会记住上次开机的选择
GRUB_HIDDEN_TIMEOUT_QUIET=true 倒计时过程中不显示秒数。
GRUB_TIMEOUT=10 用户选择启动哪个OS的时间,-1表示没有时间限制
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 正常启动linux时传给内核的参数,quiet表示启动时不要打印任何信息,splash表示显示启动画面。
GRUB_CMDLINE_LINUX="" 启动参数,任何情况下都会传给内核。
修改完毕后运行
sudo update-grub ,会更新 /boot/grub/grub.cfg
apt精要
apt-get --help
软件源:etc/apt/sources.list
更新软件列表:sudo apt-get update
安装软件: sudo apt-get install soft-package-name
查找软件包: sudo apt-cache search key-name
切换到root
sudo su root
命令行
通配符
* 代表任意个任意字符,? 代表某一个任意字符。\* 转义(*作为一个普通字符来处理。)
shell脚本
bash 历史
Bourne Shell 于1978年正式发布 ,作者是Bourne Steve, 后来 Brian Fox在其基础上改造和完善,并将其命名为 Bourne Again Shell ,简称bash
bash现在是linux和mac os 的默认shell。
cygwin 里面用的也是bash.
反引号: 反引号中间可以是命令,调用这些命令并获得这些命令的输出,比如:
tar -czvf /home/backup/bak-`date %Y%m%d`.tar.gz /home/*.txt
指明使用哪个脚本:#!/bin/bash
脚本中使用函数:
copy_file(){
cp /home/*.txt /test/
}
copy_file #调用函数
shell变量,不用声明,直接使用
name=eric
age=100
echo "Hi I am ${name}, I am ${age}years old"
echo "expr $age + 1" # expr 负责对字符串变量进行数字计算
export env_name=Tom # export声明了一个全局变量,在整个会话期间可用。
特殊变量
$n 执行本脚本所加的第n个参数,n=0代表脚本本身的名称
$* 代表执行本脚本所加的所有参数(不包括脚本名本身)
$# 执行本脚本所加的参数个数
\[ 这个脚本的PID
\]
条件判断
文件检查
[ -d $path ] 目录存在则返回true
[ -f $file ] 文件存在则返回true
[ -e $pathname ] 文件或目录存在则返回true.
算术比较运算
[ $a1 -eq $a2 ] 相等判断
[$num1 -ne $num2 ] 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
字符串运算
[ $str1 = $str2 ] 内容相同
[ $str1 != $str2 ] 内容不相同
[-z $str ] 如果str长度为0则返回true
[-n $str ] 如果str长度部位0则返回true
if he fi
if [ "$name" = "me" ]; then
echo "me"
else
echo "$name is here."
fi
case 语句
case $str in
one) echo "1";;
two) echo "two";;
three) echo "3333"
echo "333333....";;
*) echo "other...."
esac
循环语句
for 循环
for num in 1 2 3 four
do
echo "num = $num"
done
for 循环----- C格式
for (( num =1; num < 7; num++))
do
echo "num = $num"
done
while 循环
while 循环条件
do
setence
done
正则表达式
元字符
. 匹配任意字符(换行符除外)
\w 匹配字母,数字,下划线,汉子
\s 匹配任意空白符
\d 匹配数字
\b 匹配单词的开始或结尾
^ 匹配行首
$ 匹配行尾
反义字符
\W 匹配任意不是字母,数字,下划线,汉子的字符
\S 匹配任意不是空白符的字符
\D 匹配任意不是数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配任意不是x的字符
[^xyz] 匹配任意不是x且不是y且不是z的字符
常用的重复
* 0次货多次
+ 一次或多次
? 0次或1次
{n} 重复n次
{n,} 重复>=n次
{n,m} 重复n到m次
中括号
[abc] 里面的字符是或的关系,表示匹配 a ,b , c中的任意一个。
grep
格式: grep 字符串 文件名
grep "var" ./test.sh >> ./var_test.txt
linux下的开发
C/C++开发
GCC : GNU Compiler Collection
编译C源文件:gcc ./test.c 会得到a.out , 运行: ./a.out
编译C++文件: g++ ./test.cpp 得到a.out 运行: ./a.out
PHP开发
安装Apache
sudo apt-get install apache2 php5-mysql # ubuntu
sudo yum install httpd mysql mysql-server php php-mysql # centos
Vim
三模式
指令模式,输入模式,行末模式
Vim 启动后默认进入指令模式
模式切换
指令模式下按 i 键进入输入模式; 输入模式下按Esc键进入指令模式;指令模式下输入冒号进入行末模式。
指令模式快捷键
Home , End, PageUp, PageDown
Shift + g
按下1,6,8三个键,然后按下Shift + g 组合键,光标跳到了168行的行首。
按住Shift敲两下 g,定位到最后一行
连按两下 g 键定位到行首。.
w 和 b键:分别代表向后和向前移动一个单词。
删除内容操作:
依次按下 d , 3, d :删除当前光标向下的3行内容,包括当前行。
连按两下d键:删除当前行。
依次按下 d, 3,向右方向键,删除当前字符向右的3个字符,包括当前字符。
依次按下 d, 5 左方向键,删除当前字符左边的5个字符,不包括当前字符。
shift + j :删除当前行末尾的回车。
撤销操作:按 u 键撤销上一次操作
恢复撤销:按 Ctrl + u 恢复上一次撤销操作。
复制黏贴:跟 d 类似
按下 y, 3, y : 复制当前行向下3行的内容,包括当前行。
按下 y , 3, 左方向键,复制当前字符左侧的3个字符,不包括当前字符。
按 p 键黏贴。
查找操作:
按下 / 键:从光标位置向下查找
按下 Shift + / 键: 从光标位置向上查找。
光标移动到要查找的单词位置,然后按 Shift + 8 组合键,则从当前位置向下查找该单词,按 Shift + 3 组合键,则从当前位置向上查找该单词。
按 n 键,继续向同方向查找下一个结果,Shift + n键,则向反方向查找上一个结果。
行末模式命令
文件操作命令
w fileName.txt 将内容保存为 fileName.txt
w 保存当前文件
new fileName.txt 打开或新建一个fileName.txt文件,同时关闭当前文件。
q 退出vim,如果文件没保存,则无法退出。
q! 放弃修改,强制退出vim.
查找替换 ,命令格式: 查找范围s/查找内容/替换内容/
查找范围:空 表示在当前行查找; % 表示在整个文件中查找; 3,19 表示查找3到19行的内容;6,$ 表示查找第6行到文件末尾的内容。
查找内容:可以使用正则。
替换内容:空 表示删除查找到的内容。
3,50/hello/world/g g表示替换掉每行中所有的hello
内容过滤
g 过滤出包含某字符串的行,格式: g/要过滤的字符串/对过滤出的内容的进一步操作
g/^Eric/d 删除掉所有行首为Eric的行。
v 过滤掉不包含某字符串的行
v/^Eric/w aa.txt 过滤出所有不带Eric的行,然后将过滤内容直接存为aa.txt
程序的编译和打包
普通的编译:gcc a.c b.c -o hello
GCC四大命令
gcc cpp as ld
预处理:gcc -E ./test.c > test_cpp.c
或者 cpp ./test.c > test_cpp.c
编译: gcc -S ./test.c , 将test.c预处理和编译,得到 test.s 文件,该文件是汇编代码。
汇编: gcc -c ./test.c 预处理,编译,汇编,得到 test.o 文件,该文件是机器码文件。该过程由 as 命令来处理。
链接:将生成的.o文件和依赖的.o文件组装起来,得到可执行的程序
GDB
编译出可被调试的程序:gcc -g a.c b.c -o hello
-g 参数会加入机器码和源码的对应关系,因此编译出来的程序可设置断点进行调试,无-g参数的话可以调试但无法设置断点。
启动调试 gdb ./hello 就会进入调试界面
gdb 常用命令:
run 简写 r : 从头开始运行程序
break 简写 b: 设置断点,例如 break 10 在第10行设置断点
list 简写 l : 列出当前程序的源代码
continue 简写 c : 执行到下一个断点
print 简写 p : 打印变量的值,如 print i 就是打印变量 i 的值。
examine 简写 x :查看指定内存地址的数据。
next 简写 n : 执行下一行代码。
Makefile
linux 下的构建工具
make 命令:会去找Makefile 或者 makefile文件进行构建。
makefile书写格式:
target:resource 执行下面的命令需要的资源
例子1:
all:main.o a.o b.o
gcc main.o a.o b.o -o test
其中:all是make的关键字,如果make 不加参数,则会先从all开始执行。、
例子2
clean:
rm ./*.o
rm test
install:test
cp ./test /usr/bin/
configure : 检查当前环境,生成合适的makefile
Autoconf 软件4成员
Aclocal, Autoconf, Automake, Autoscan
Autoconf: 根据当前环境自动生成 configure 和 makefile
Autoscan:检查源码目录结构
autoscan 该命令会生成 configure.scan 文件, 我们需要修改文件名为configure.in,并对文件内容做小幅修改。
AC_INIT(main.c) 说明该工程的主要文件是main.c
AM_INIT_AUTOMAKE(test.1.0) 项目名为test, 版本为1.0
AC_PROG_CC 要求最终的configure 要检测C语言编译器是否正常。
AC_OUTPUT(Makefile) 最终的configure需要产生的文件叫Makefile
Aclocal 检测编译环境
aclocal 改命令生成 aclocal.m4文件,它是根据configure.in的内容,做了详细的注解和说明。
Autoconf 生成configure脚本
autoconf 生成 configure脚本
Automake 生成makefile蓝本 makefile.in,以供configure 使用
我们先要写出 Makefile.am ,然后 Automake才能依据Makefile.am来生成makefile.in
Makefile.am 内容:
AUTOMAKE_OPTIONS=foreign 一般GNU软件应该包含NEWS, AUTHOR, ChangeLog这些文件,Automake会检查这些文件是否存在,但是如果设置成 foreign,就不会去检查了。
bin_PROGRAMS=test 说明编译之后的程序应该叫test
test_SOURCES=main.c a.c b.c 说明该工程包括的源码文件。
查看依赖关系
ldd ./test
解压缩
tar gzip
解压: tar -xzvf aaa.tar.gz
-x 解包
-c 打包
-z 该包是用gzip压缩过的,需要先用gzip解压。
-v 显示解压的过程
-f 指明要解药的文件
-j 该包是用bzip压缩过的,.tar.bz2格式
-C 将解压缩后的文件存放到指定目录。