画布 1
Linux
  linux 简介
    发行版本
      Debian 系
      RedHat 系
      Fedora
      RedHat
      Centos
      Debian
      Ubuntu
      ArchLinux
      OpenSuse
      一般用于服务器
      一般用于桌面，移动端，TV
      人气相对较弱，一般用于服务器
      轻量的Linux，适合有一定Linux基础，并且爱折腾的人使用
    包管理
      RedHat 系
      Debian 系
      要点
        RedHat 系
        Debian 系
        安装包格式
          rpm
        包管理工具
          yum
        安装包格式
          dpkg
        包管理工具
          apt-get
      rpm
        RedHat 系安装包格式
        命令
          安装
            rpm -ivh *.rpm
          卸载
            rpm -e packgename
          查询
            # 查看已安装的RMP包
rpm -qa | grep php
            # 查询软件的安装路径
rpm -ql xxx
            # 查询某个包
rpm -qa | grep xxx
          升级
            rpm -Uvh xxx
      yum
        RedHat 系包管理工具
        命令
          安装
            # 安装指定的软件
yum install <package_name>
          卸载
            # 删除指定的软件
yum remove <package_name>
          查询
            # 查找软件包
yum search <keyword>
            # 列出所有可安裝的软件清单
yum list
            # 列出所有可更新的软件清单
yum check-update
          升级
            # 更新指定的软件
yum update <package_name>
          清除缓存
            # 清除缓存目录下的软件包
yum clean packages
            # 清除缓存目录下的 headers
yum clean headers
            # 清除缓存目录下旧的 headers
yum clean oldheaders
            # 清除缓存目录下的软件包及旧的headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders)
      dpkg
        Debian 系安装包格式
        命令
          安装
            dpkg -i <package.deb>
          卸载
            dpkg -r <package>
          查询
            # 查看已安装的包
dpkg -l | grep 'php'
            # 列出 <package> 安装的所有文件清单。
dpkg -L <package>
      apt-get
        Debian 系包管理工具
  linux 目录
    /
      /bin
        bin是Binary的缩写, 这个目录存放着最经常使用的命令。
      /boot
        这里存放的是启动Linux时使用的一些核心文件，包括一些连接文件以及镜像文件。
      /dev
        dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备，在Linux中访问设备的方式和访问文件的方式是相同的。
      /etc
        这个目录用来存放所有的系统管理所需要的配置文件和子目录。
      /home
        用户的主目录，在Linux中，每个用户都有一个自己的目录，一般该目录名是以用户的账号命名的。
      /lib
        这个目录里存放着系统最基本的动态连接共享库，其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
      /lost+found
        这个目录一般情况下是空的，当系统非法关机后，这里就存放了一些文件。
      /media
        linux系统会自动识别一些设备，例如U盘、光驱等等，当识别后，linux会把识别的设备挂载到这个目录下。
      /mnt
        系统提供该目录是为了让用户临时挂载别的文件系统的，我们可以将光驱挂载在/mnt/上，然后进入该目录就可以查看光驱里的内容了。
      /opt
        这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
      /proc
        这个目录是一个虚拟的目录，它是系统内存的映射，我们可以通过直接访问这个目录来获取系统信息。
      /root
        该目录为系统管理员，也称作超级权限者的用户主目录。
      /sbin
        s就是Super User的意思，这里存放的是系统管理员使用的系统管理程序。
      /selinux
        这个目录是Redhat/CentOS所特有的目录，Selinux是一个安全机制，类似于windows的防火墙，但是这套机制比较复杂，这个目录就是存放selinux相关的文件的。
      /srv
        该目录存放一些服务启动之后需要提取的数据。
      /sys
        这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。
sysfs文件系统集成了下面3种文件系统的信息针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候，对应的文件和目录也在内核对象子系统中被创建。
      /tmp
        这个目录是用来存放一些临时文件的。
      /usr
        这是一个非常重要的目录，用户的很多应用程序和文件都放在这个目录下，类似于windows下的program files目录。
        /usr/bin
          系统用户使用的应用程序。
        /usr/sbin
          超级用户使用的比较高级的管理程序和系统守护程序。
        /usr/src
          内核源代码默认的放置目录。
      /var
        这个目录中存放着在不断扩充着的东西，我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
      /sbin
        s就是Super User的意思，这里存放的是系统管理员使用的系统管理程序。
      有星标的目录是linux系统中比较重要的目录，注意不要误删除或者随意更改内部文件。
  linux 命令
    文件目录
      查看文件内容
      chmod
        设置文件或目录的访问权限
      cp
        复制文件或目录
      mv
        移动文件或目录，为文件或目录改名
      rm
        删除文件或目录
      mkdir
        创建目录
      cat
      more
      less
      head
      tail
    文件查找
      find
        在目录结构中搜索文件
      locate
        查找符合条件的文档
      which
        在环境变量$PATH设置的目录里查找符合条件的文件
      whereis
        在特定目录中查找符合条件的文件
    磁盘管理
      cd
        切换目录
      pwd
        显示当前目录
      ls
        显示目录内容
      mount
        挂载文件到一个虚拟盘或虚拟文件夹中
      stat
        文件/文件系统的详细信息显示
    网络通讯
      ifconfig
        显示或设置网络设备
      ping
        检查网络是否连通
      netstat
        显示网络连接、路由表和网络端口信息
      telnet
        远端登入
    系统管理
      账户管理
      useradd
        添加账号
      userdel
        删除账号
      usermod
        修改账号
      passwd
        设置密码
      su
        切换账号
      sudo
        以系统管理者的身份执行指令
      ps
        显示当前进程 (process) 的状态
      kill
        删除执行中的程序或工作
      exit
        退出目前的shell
      date
        显示或设定系统的日期与时间
    备份压缩
      tar
        备份文件
      zip
        压缩文件为 zip 包
      unzip
        解压缩 zip 包
  Shell
    概述
      shell 是什么
        Shell 是一个用 C 语言编写的程序。
        Shell 既是一种命令语言，又是一种程序设计语言。
      模式
        交互模式
          命令行
            user@host:~$ ls
        非交互模式
          sh 脚本
            chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
      常见 shell
        sh
          sh 是 Unix 标准默认的 shell。
        bash
          bash 是 Linux 标准默认的 shell。
        fish
          智能和用户友好的命令行 shell。
        xiki
          使 shell 控制台更友好，更强大。
        zsh
          功能强大的 shell 与脚本语言。
    注释
      以#开头，到行尾结束。
    变量
      局部变量
        仅在某个脚本内部有效的变量。不能被其他的程序和脚本访问。
        用=声明，用$访问
        local 关键字声明属于某个函数的局部变量，变量会在函数结束时消失。
      环境变量
        export 关键字声明对当前 shell 会话内所有的程序或脚本都可见的变量。
      位置参数变量
        位置参数是在调用一个函数并传给它参数时创建的变量。
    数组
      创建数组
        array[0] = val
array[1] = val
array[2] = val
        array=([2]=val [0]=val [1]=val)
        array=(val val val)
      访问数组元素
        ${array[i]}
        ${array[@]:0:2}
      添加元素
        colors=(Orange "${colors[@]}" Banana Cherry)
      删除元素
        unset colors[0]
    运算符
      算数运算符
        +
          加法
          expr $a + $b 结果为 30。
        -
          减法
          expr $a - $b 结果为 -10。
        *
          乘法
          expr $a \* $b 结果为 200。
        /
          除法
          expr $b / $a 结果为 2。
        %
          取余
          expr $b % $a 结果为 0。
        =
          赋值
          a=$b 将把变量 b 的值赋给 a。
        ==
          相等。用于比较两个数字，相同则返回 true。
          [ a == b ] 返回 false。
        !=
          不相等。用于比较两个数字，不相同则返回 true。
          [ a != b ] 返回 true。
      关系运算符
        -eq
          检测两个数是否相等，相等返回 true。
          [ a -eq b ] 返回 false。
        -ne
          检测两个数是否相等，不相等返回 true。
          [ a -ne b ] 返回 true。
        -gt
          检测左边的数是否大于右边的，如果是，则返回 true。
          [ a -gt b ] 返回 false。
        -lt
          检测左边的数是否小于右边的，如果是，则返回 true。
          [ a -lt b ] 返回 true。
        -ge
          检测左边的数是否大于等于右边的，如果是，则返回 true。
          [ a -ge b ] 返回 false。
        -le
          检测左边的数是否小于等于右边的，如果是，则返回 true。
          [ a -le b ] 返回 true。
      布尔运算符
        !
          非运算，表达式为 true 则返回 false，否则返回 true。
          [ ! false ] 返回 true。
        -o
          或运算，有一个表达式为 true 则返回 true。
          [ a -lt 20 -o b -gt 100 ] 返回 true。
        -a
          与运算，两个表达式都为 true 才返回 true。
          [ a -lt 20 -a b -gt 100 ] 返回 false。
      逻辑运算符
        &&
          逻辑的 AND
          [[ $a -lt 100 && $b -gt 100 ]] 返回 false
        ||
          逻辑的 OR
          [[ $a -lt 100 || $b -gt 100 ]] 返回 true
      字符串运算符
        =
          检测两个字符串是否相等，相等返回 true。
          [ a = b ] 返回 false。
        !=
          检测两个字符串是否相等，不相等返回 true。
          [ a != b ] 返回 true。
        -z
          检测字符串长度是否为0，为0返回 true。
          [ -z $a ] 返回 false。
        -n
          检测字符串长度是否为0，不为0返回 true。
          [ -n $a ] 返回 true。
        str
          检测字符串是否为空，不为空返回 true。
          [ $a ] 返回 true。
      文件测试运算符
        -b file
          检测文件是否是块设备文件，如果是，则返回 true。
          [ -b $file ] 返回 false。
        -c file
          检测文件是否是字符设备文件，如果是，则返回 true。
          [ -c $file ] 返回 false。
        -d file
          检测文件是否是目录，如果是，则返回 true。
          [ -d $file ] 返回 false。
        -f file
          检测文件是否是普通文件（既不是目录，也不是设备文件），如果是，则返回 true。
          [ -f $file ] 返回 true。
        -g file
          检测文件是否设置了 SGID 位，如果是，则返回 true。
          [ -g $file ] 返回 false。
        -k file
          检测文件是否设置了粘着位(Sticky Bit)，如果是，则返回 true。
          [ -k $file ] 返回 false。
        -p file
          检测文件是否是有名管道，如果是，则返回 true。
          [ -p $file ] 返回 false。
        -u file
          检测文件是否设置了 SUID 位，如果是，则返回 true。
          [ -u $file ] 返回 false。
        -r file
          检测文件是否可读，如果是，则返回 true。
          [ -r $file ] 返回 true。
        -w file
          检测文件是否可写，如果是，则返回 true。
          [ -w $file ] 返回 true。
        -x file
          检测文件是否可执行，如果是，则返回 true。
          [ -x $file ] 返回 true。
        -s file
          检测文件是否为空（文件大小是否大于0），不为空返回 true。
          [ -s $file ] 返回 true。
        -e file
          检测文件（包括目录）是否存在，如果是，则返回 true。
          [ -e $file ] 返回 true。
    语句
      条件语句
        if...elif...else
        case
      循环语句
        for
        while
        until
        select
        break
        continue
    函数
      函数参数
        $#
          传递到脚本的参数个数
        $*
          以一个单字符串显示所有向脚本传递的参数
        $$
          脚本运行的当前进程ID号
        $!
          后台运行的最后一个进程的ID号
        $@
          与$*相同，但是使用时加引号，并在引号中返回每个参数。
        $-
          显示Shell使用的当前选项，与set命令功能相同。
        $?
          显示最后命令的退出状态。0表示没有错误，其他任何值表明有错误。
    流，管道以及序列
      流
        stdin
        stdout
        stderr
      重定向
        >
          重定向输出
        &>
          重定向输出和错误输出
        &>>
          以附加的形式重定向输出和错误输出
        <
          重定向输入
        <<
          Here文档 语法
        <<<
          Here字符串
    Debug
      开启 Debug 模式
        如果想以 debug 模式运行脚本，需要添加特殊选项
          #!/bin/bash options
      options 参数
        -f
          noglob
          禁止文件名展开（globbing）
        -i
          interactive
          让脚本以 交互 模式运行
        -n
          noexec
          读取命令，但不执行（语法检查）
        -t
          —
          执行完第一条命令后退出
        -v
          verbose
          在执行每条命令前，向stderr输出该命令
        -x
          xtrace
          在执行每条命令前，向stderr输出该命令以及该命令的扩展参数
  git
    简介
      Git 是什么
        Git 是一个开源的分布式版本控制系统。
      为什么使用 Git
        工作时不需要联网
          首先，分布式版本控制系统根本没有“中央服务器”，每个人的电脑上都是一个完整的版本库，这样，你工作的时候，就不需要联网了，因为版本库就在你自己的电脑上。
        更加安全
          集中式版本控制系统，一旦中央服务器出了问题，所有人都无法工作。
          分布式版本控制系统，每个人电脑中都有完整的版本库，所以某人的机器挂了，并不影响其它人。
      Git 支持的协议
        HTTPS
        SSH
        GIT
      原理
        版本库（.git）
        文件状态
          已修改（modified）
          已暂存（staged）
          已提交（committed）
        版本库（.git）
          工作区（working）
          暂存区（staging）
          本地仓库（local）
          远程仓库（remote）
    命令
      创建
        初始化
          init
            # 通过 SSH 复制一个已创建的仓库
$ git clone ssh://user@domain.com/repo.git
        克隆
          clone
            $ git clone ssh://user@domain.com/repo.git
            # 通过 HTTP 复制一个已创建的仓库
$ git clone http://domain.com/user/repo.git
      添加修改
        添加到暂存区
          add
            # 添加名为 xxx 的文件到暂存区
$ git add xxx
            # 添加当前目录所有修改内容到暂存区
$ git add .
            # 添加所有修改内容到暂存区
$ git add -A
        提交到本地仓库
          commit
            # 提交之前已标记的变化
$ git commit
            # 附加消息提交
$ git commit -m 'message here'
            # 提交本地的所有修改
$ git commit -a
        添加草稿
          stash
            # 1. 将修改作为当前分支的草稿保存
$ git stash
            # 2. 查看草稿列表
$ git stash list
stash@{0}: WIP on master: 6fae349 :memo: Writing docs.
            # 3.1 删除草稿
$ git stash drop stash@{0}
# 3.2 读取草稿
$ git stash apply stash@{0}
      撤销修改
        本地撤销修改
          # 删除添加.gitignore文件前错误提交的文件
$ git rm -r --cached .
$ git add .
$ git commit -m "remove xyz file"
          checkout
            # 放弃某个文件的所有本地修改
$ git checkout HEAD <file>
          reset
            # 移除缓存区的所有文件（i.e. 撤销上次git add）
$ git reset HEAD
            # 将HEAD重置到上一次提交的版本，并将之后的修改标记为未添加到缓存区的修改
$ git reset <commit>
            # 将HEAD重置到上一次提交的版本，并保留未提交的本地修改
$ git reset --keep <commit>
            # 放弃工作目录下的所有修改
$ git reset --hard HEAD
            # 将HEAD重置到指定的版本，并抛弃该版本之后的所有修改
$ git reset --hard <commit-hash>
            # 用远端分支强制覆盖本地分支
$ git reset --hard <remote/branch> e.g., upstream/master, origin/my-feature
        远程撤销修改
          revert
            # 创建一个新的提交，并回滚到指定版本
$ git revert <commit-hash>
          reset
            # 执行下面命令后，commit-hash 提交后的记录都会被彻底删除，使用需谨慎
$ git reset --hard <commit-hash>
$ git push -f
      同步
        更新
          fetch
            # 下载远程端版本，但不合并到HEAD中
$ git fetch <remote>
          pull
            # 将远程端版本合并到本地版本中
$ git pull origin master
            # 以rebase方式将远端分支与本地合并
$ git pull --rebase <remote> <branch>
        推送
          push
            # 将本地版本推送到远程端
$ git push remote <remote> <branch>
            # 删除远程端分支
$ git push <remote> :<branch> (since Git v1.5.0)
$ git push <remote> --delete <branch> (since Git v1.7.0)
            # 发布标签
$ git push --tags
      查看信息
        修改状态
          status
            # 显示工作路径下已修改的文件
$ git status
        比对差异
          diff
            # 显示与上次提交版本文件的不同
$ git diff
        历史记录
          log
            # 从最新提交开始，显示所有的提交记录（显示hash， 作者信息，提交的标题和时间）
$ git log
            # 显示某个用户的所有提交
$ git log --author="username"
            # 显示某个文件的所有修改
$ git log -p <file>
      分支标签
        分支
          branch
            # 列出所有的分支
$ git branch
            # 列出所有的远端分支
$ git branch -r
            # 基于当前分支创建新分支
$ git branch <new-branch>
            # 基于远程分支创建新的可追溯的分支
$ git branch --track <new-branch> <remote-branch>
            # 删除本地分支
$ git branch -d <branch>
            # 强制删除本地分支，将会丢失未合并的修改
$ git branch -D <branch>
          checkout
            # 切换分支
$ git checkout <branch>
            # 创建并切换到新分支
$ git checkout -b <branch>
        标签
          tag
            # 给当前版本打标签
$ git tag <tag-name>
            # 给当前版本打标签并附加消息
$ git tag -a <tag-name>
      合并重置
        合并
          merge
            # 将分支合并到当前HEAD中
$ git merge <branch>
        重置
          rebase
            # 将当前HEAD版本重置到分支中，请勿重置已发布的提交
$ git rebase <branch>
      cmd 概览图
        子主题 1
    git-flow
      关键分支
        master(主分支)
          说明：源码库应该有且仅有一个主分支。主分支应该对应着软件的生产环境。
          生命周期：始终存在。
          命名规则：master
        develop(开发分支)
          说明：用于日常开发，当源码到达一个稳定的状态，就可以将所有代码合并到master。
          生命周期：始终存在。
          命名规则：develop
          命令
            # Git创建Develop分支的命令：
git checkout -b develop master
# 切换到Master分支
git checkout master
# 对Develop分支进行合并
git merge –no–ff develop
        说明：核心分支可视为是两条一直延续的平行线。
      辅助分支
        feature(功能分支)
          说明：为了开发某种特定功能，从develop分支上面分出来的。通常应该在开发者本地代码库，而不应该在源码库。
          生命周期：从develop而来，向develop合并。
          命名规则：feature/*。eg: feature/uploadfile
          命令
            # 创建一个功能分支：
git checkout -b feature/xxx develop
# 开发完成后，将功能分支合并到develop分支：
git checkout develop
git merge –no-ff feature/xxx
# 删除feature分支：
git branch -d feature/xxx
        release(发布分支)
          说明：发布正式版本之前（即合并到master分支之前），往往需要有一个预发布的版本进行测试，就可以使用release版本。
          生命周期：可能从develop分支分离而来，但是一定要合并到develop和master分支上。
从develop分支创建新的Release分支的关键时刻是develop分支达到了发布的理想状态。
至少所有这次要发布的features必须在这个点及时合并到develop分支。
对于所有未来准备发布的features必须等到Release分支创建以后再合并。
          命名规则：release/*。eg: release/1.0.0
          命令
            # 创建一个预发布分支：
git checkout -b release/1.0.0 develop
# 确认没有问题后，合并到master/develop分支，并且做一个标签
git checkout master
git merge –no-ff release/1.0.0
git checkout develop
git merge –no-ff release/1.0.0
git tag -a 1.0.0
# 最后，删除预发布分支：
git branch -d release/1.0.0
        hotfix(补丁分支)
          说明：用来修复master分支上发现的bug。
          生命周期：从Master分支上面分出来的。修复结束以后，再合并进Master和Develop分支。
          命名规则：hotfix/*。eg: hotfix/1.0.0
          命令
            # 创建一个修补bug分支：
git checkout -b hotfix/1.0.0 master
# 修补结束后，合并到master/develop分支，并且做一个标签
git checkout master
git merge –no-ff hotfix/1.0.0
git checkout develop
git merge –no-ff hotfix/1.0.0
git tag -a 1.0.1
# 最后，删除hotfix分支
git branch -d hotfix/1.0.0
        说明：与关键分支不同，这些分支总是有一个有限的生命期，因为他们最终会被移除。
      模型图
    安装
      Linux
        Debian/Ubuntu
          $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
> libz-dev libssl-dev
$ apt-get install git-core
$ git --version
git version 1.8.1.2
        Centos/RedHat
          $ yum install curl-devel expat-devel gettext-devel \
> openssl-devel zlib-devel
$ yum -y install git-core
$ git --version
git version 1.7.1
      Windows
        在 https://git-scm.com/downloads 下载 exe 安装包。按照安装向导安装即可。
      Mac
        在 https://git-scm.com/downloads 下载 mac 安装包。按照安装向导安装即可。
    工具
      SourceTree
        推荐理由：这个工具可以自动创建符合分支策略的工作流。
      Git Bash
      IDE自带的git插件
  vim
    level1
      level1
        level1
          level1
            子主题 1
            子主题 2