首页 > 代码库 > Linux精要

Linux精要

 

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 主要发行版

  1. Redhat rpm软件包就出自 Red Hat 公司。
  2. CentOS 基于 RedHat的社区版,开源免费。
  3. Mandriva: 来自欧洲的一个发行版,以rpm作为软件管理工具。该发行版方便易用,硬件兼容性好。
  4. SUSE: 来自德国的发行版,界面漂亮,但消耗资源多。
  5. Debian 以稳定保守著称,deb软件包和apt软件包管理器来自于它。
  6. Ubuntu 基于Debian的linux发行版。

计算机启动流程

  1. 按开机键
  2. BIOS 检查硬件(CPU,内存,显卡…); 去MBR启动Grub.
    (注: MBR, 512字节,硬盘0号扇区,不属于任何一个分区,包含启动代码(此处为Grub) 和硬盘分区表。)
  3. Grub: 读取 /boot/grub/grub.cfg 文件,根据配置显示启动界面。
    (注:多系统的配置信息也存放在 grub.cfg中)
    (重装Windows后Grub的修复:
    1) 用LiveCD启动电脑
    2)获取权限: sudo -i
    3) 挂载根目录对应的分区:mount /dev/sda1 /media/
    4) 如果你当时还未 /boot 划了单独的分区,还需运行: mount /dev/sda2 /media/boot/
    5) grub-install -root-directory=/media/ /dev/sda
    6)重启电脑
    )
  4. 加载内核
  5. 启动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
  • 脚本中使用函数:
  1. copy_file(){
  2. cp /home/*.txt /test/
  3. }
  4. copy_file #调用函数
  • shell变量,不用声明,直接使用
  1. name=eric
  2. age=100
  3. echo "Hi I am ${name}, I am ${age}years old"
  4. echo "expr $age + 1"# expr 负责对字符串变量进行数字计算
  5. export env_name=Tom# export声明了一个全局变量,在整个会话期间可用。
  • 特殊变量

    1. $n 执行本脚本所加的第n个参数,n=0代表脚本本身的名称
    2. $* 代表执行本脚本所加的所有参数(不包括脚本名本身)
    3. $# 执行本脚本所加的参数个数
    4. $$ 这个脚本的PID
  • [ 命令: 判断后面参数的值,并返回。

  • 条件判断
    • 文件检查
    1. [ -d $path ] 目录存在则返回true
    2. [ -f $file ] 文件存在则返回true
    3. [ -e $pathname ] 文件或目录存在则返回true.
    • 算术比较运算
    1. [ $a1 -eq $a2 ] 相等判断
    2. [$num1 -ne $num2 ] 不等于
    3. -lt 小于
    4. -le 小于等于
    5. -gt 大于
    6. -ge 大于等于
    • 字符串运算
    1. [ $str1 = $str2 ] 内容相同
    2. [ $str1 != $str2 ] 内容不相同
    3. [-z $str ] 如果str长度为0则返回true
    4. [-n $str ] 如果str长度部位0则返回true
    • if he fi

      1. if["$name"="me"];then
      2. echo "me"
      3. else
      4. echo "$name is here."
      5. fi
    • case 语句

      1. case $str in
      2. one) echo "1";;
      3. two) echo "two";;
      4. three) echo "3333"
      5. echo "333333....";;
      6. *) echo "other...."
      7. esac
  • 循环语句
    • for 循环

      1. for num in123 four
      2. do
      3. echo "num = $num"
      4. done
    • for 循环—– C格式

      1. for(( num =1; num <7; num++))
      2. do
      3. echo "num = $num"
      4. done
    • while 循环

      1. while循环条件
      2. do
      3. setence
      4. done

正则表达式

  • 元字符
    1. . 匹配任意字符(换行符除外)
    2. \w 匹配字母,数字,下划线,汉子
    3. \s 匹配任意空白符
    4. \d 匹配数字
    5. \b 匹配单词的开始或结尾
    6. ^ 匹配行首
    7. $ 匹配行尾
  • 反义字符
    1. \W 匹配任意不是字母,数字,下划线,汉子的字符
    2. \S 匹配任意不是空白符的字符
    3. \D 匹配任意不是数字的字符
    4. \B 匹配不是单词开头或结束的位置
    5. [^x] 匹配任意不是x的字符
    6. [^xyz] 匹配任意不是x且不是y且不是z的字符
  • 常用的重复
    1. * 0次货多次
    2. + 一次或多次
    3. ? 0次或1次
    4. {n} 重复n次
    5. {n,} 重复>=n次
    6. {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. 按下1,6,8三个键,然后按下Shift + g 组合键,光标跳到了168行的行首。
    2. 按住Shift敲两下 g,定位到最后一行
    3. 连按两下 g 键定位到行首。.
  • w 和 b键:分别代表向后和向前移动一个单词。
  • 删除内容操作:
    1. 依次按下 d , 3, d :删除当前光标向下的3行内容,包括当前行。
    2. 连按两下d键:删除当前行。
    3. 依次按下 d, 3,向右方向键,删除当前字符向右的3个字符,包括当前字符。
    4. 依次按下 d, 5 左方向键,删除当前字符左边的5个字符,不包括当前字符。
    5. shift + j :删除当前行末尾的回车。
  • 撤销操作:按 u 键撤销上一次操作
  • 恢复撤销:按 Ctrl + u 恢复上一次撤销操作。
  • 复制黏贴:跟 d 类似
    1. 按下 y, 3, y : 复制当前行向下3行的内容,包括当前行。
    2. 按下 y , 3, 左方向键,复制当前字符左侧的3个字符,不包括当前字符。
    3. 按 p 键黏贴。
  • 查找操作:
    1. 按下 / 键:从光标位置向下查找
    2. 按下 Shift + / 键: 从光标位置向上查找。
    3. 光标移动到要查找的单词位置,然后按 Shift + 8 组合键,则从当前位置向下查找该单词,按 Shift + 3 组合键,则从当前位置向上查找该单词。
    4. 按 n 键,继续向同方向查找下一个结果,Shift + n键,则向反方向查找上一个结果。

行末模式命令

  • 文件操作命令
    1. w fileName.txt 将内容保存为 fileName.txt
    2. w 保存当前文件
    3. new fileName.txt 打开或新建一个fileName.txt文件,同时关闭当前文件。
    4. q 退出vim,如果文件没保存,则无法退出。
    5. q! 放弃修改,强制退出vim.
  • 查找替换 ,命令格式: 查找范围s/查找内容/替换内容/
    1. 查找范围:空 表示在当前行查找; % 表示在整个文件中查找; 3,19 表示查找3到19行的内容;6,$ 表示查找第6行到文件末尾的内容。
    2. 查找内容:可以使用正则。
    3. 替换内容:空 表示删除查找到的内容。
    4. 3,50/hello/world/g g表示替换掉每行中所有的hello
  • 内容过滤
    1. g 过滤出包含某字符串的行,格式: g/要过滤的字符串/对过滤出的内容的进一步操作
    2. g/^Eric/d 删除掉所有行首为Eric的行。
    3. v 过滤掉不包含某字符串的行
    4. 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 常用命令:
    1. run 简写 r : 从头开始运行程序
    2. break 简写 b: 设置断点,例如 break 10 在第10行设置断点
    3. list 简写 l : 列出当前程序的源代码
    4. continue 简写 c : 执行到下一个断点
    5. print 简写 p : 打印变量的值,如 print i 就是打印变量 i 的值。
    6. examine 简写 x :查看指定内存地址的数据。
    7. next 简写 n : 执行下一行代码。

Makefile : linux 下的构建工具

  • make 命令:会去找Makefile 或者 makefile文件进行构建。
  • makefile书写格式:
  1. target:resource # 执行下面的命令需要的资源
  2. <Tab>要执行的命令
  1. 例子1:
  1. all:main.o a.o b.o
  2. gcc main.o a.o b.o -o test

其中:all是make的关键字,如果make 不加参数,则会先从all开始执行。、

  1. 例子2
  1. clean:
  2. rm ./*.o
  3. rm test
  4. install:test
  5. cp ./test /usr/bin/

configure : 检查当前环境,生成合适的makefile

Autoconf 软件4成员:Aclocal, Autoconf, Automake, Autoscan

  • Autoconf: 根据当前环境自动生成 configure 和 makefile
  • Autoscan:检查源码目录结构
    1. autoscan 该命令会生成 configure.scan 文件, 我们需要修改文件名为configure.in,并对文件内容做小幅修改。
    2. AC_INIT(main.c) 说明该工程的主要文件是main.c
    3. AM_INIT_AUTOMAKE(test.1.0) 项目名为test, 版本为1.0
    4. AC_PROG_CC 要求最终的configure 要检测C语言编译器是否正常。
    5. AC_OUTPUT(Makefile) 最终的configure需要产生的文件叫Makefile
  • Aclocal 检测编译环境
    1. aclocal 改命令生成 aclocal.m4文件,它是根据configure.in的内容,做了详细的注解和说明。
  • Autoconf 生成configure脚本
    1. autoconf 生成 configure脚本
  • Automake 生成makefile蓝本 makefile.in,以供configure 使用
    1. 我们先要写出 Makefile.am ,然后 Automake才能依据Makefile.am来生成makefile.in
    2. Makefile.am 内容:
      1. AUTOMAKE_OPTIONS=foreign 一般GNU软件应该包含NEWS, AUTHOR, ChangeLog这些文件,Automake会检查这些文件是否存在,但是如果设置成 foreign,就不会去检查了。
      2. bin_PROGRAMS=test 说明编译之后的程序应该叫test
      3. test_SOURCES=main.c a.c b.c 说明该工程包括的源码文件。

查看依赖关系:ldd ./test

解压缩 tar gzip

  • 解压: tar -xzvf aaa.tar.gz
    1. -x 解包
    2. -c 打包
    3. -z 该包是用gzip压缩过的,需要先用gzip解压。
    4. -v 显示解压的过程
    5. -f 指明要解药的文件
    6. -j 该包是用bzip压缩过的,.tar.bz2格式
    7. -C 将解压缩后的文件存放到指定目录。

Linux精要