终端原理及操作

本文对 shell 中的概念及命令进行总结, 也涵盖一些终端工具的使用, 涉及到 Linux 及 Mac 系统.

himg

常见概念理解

  • terminal: 一个程序, Mac 自带 terminal, 也有第三方软件比如 xterm, iterm, kvt 等, terminalshell 的 UI, shell 运行在 terminal
  • shell: 命令行解释器. 根据字面意义来看就是机器外面的一层壳, 用于在机器与人交互过程中传递信息. 不限于操作系统, 编程语言, 操作方式和表现形式.
    具体表现是用户输入一条命令后 shell 就立刻进行执行并返回结果. CLI( Command Line Interface ) 与 GUI( Graphic User Interface ) 都是 shell,
    只不过是不同的表现形式而已.
  • interactivenon-interactive: 如果打开 Mac 上的 iterm, 输入 bash 代码, 按下回车后有返回任何信息就被称为 interactive; 如果输入了若干行的
    shell 脚本, 那么这些 shell 代码就运行在 non-interactive shell
  • loginnon-login: login shell 指登录系统后获得的顶层 shell, 比如最常用的 ssh 登录, 登陆完后会获得一个 login shell; 如果是在 Mac
    上直接打开 iterm 进入了 shell 则是 non-login shell
  • shell 类型
    • bash: 全称: Bourne-Again Shell, 是最常见的 shell. Mac 中的 terminal 默认就是 bash
    • zsh: Mac 中最常用的 shell, 一大半的原因是因为 on-my-zsh 这个配置集. zsh 兼容 bash, 还有自动补全的功能. zsh 的配置文件为 ~/.zshrc
    • cmd: Windows 下的默认 shell, 全称为 command interpreter
    • Jshell: Java 的第三方解释器 (只要一门编程语言有解释器, 就可以作为一个 shell, PHP 也有 PHP Shell )
  • Linux 发行版: GNU/Linux 是基于 GPL 开源许可协议的操作系统内核, 但仅仅有内核还不是一个完整的操作系统, 要想可以使用还需要集成各种应用软件. Linux
    发行版就是指预先集成好的 Linux 操作系统及各种应用软件, 一般情况下用户直接安装就可以使用, 不需要再重新编译. 我们平常所说的安装个 Linux
    操作系统指的都是安装一个 Linux 的发行版.
    • RHEL: Red Hat Enterprise Linux, 是 Redhat 公司推出的企业级 Linux 发行版, 属于开源操作系统; 但是收费!
    • Fedora: 是 Redhat 公司推出的实验性 Linux 发行版, 新特性都会首先出现在 Fedora 上, 稳定后放在 RHEL 中.
    • CentOS: 直接将 RHEL 的源码拿过来, 去掉相关的版权图标信息, 而后发型, 其版本号与 RHEL 基本相同. 法律上是完全没问题的, 因为发布出来的
      CentOS 同样也遵守了 GPL. 除了一些 Redhat 的商业应用软件, CentOS 追求的是与 RHEL 100% 兼容. CentOS 作为从 RHEL 源码直接编译的发行版,
      其作为服务器的高效率及稳定性等方面都是经过实践验证的, 所以如果自己有丰富的服务器运维经验, 那你可以选择 CentOS. 但如果没有专业的运维团队,
      又需要大规模部署, 那还是选择 RHEL 比较明智, Redhat 团队会为你提供专业的, 标准化的解决方案和专业的技术支持.
    • Arch Linux: 巨大的定制潜力, Antergos 提供了一种更加友好的 Linux 体验; 不适合容易放弃的人
    • Ubuntu: 界面漂亮, 非常适合新手, LTS 版本的安全性和稳定性; 不适合服务器端 (需要较多的内存空间), 对非 LTS 版本短暂的支持
    • Ubuntu Studio: 昂贵生产软件的绝佳替代品, 允许访问主 Ubuntu 中的包, 支持音频插件; 由于功能强大, 所以操作系统不够精简
    • Debian: 最适合服务器的操作系统, 稳定得无与伦比, 内存占用小, 常年不需要重启; 由于其发展路线, 帮助文档略少, 技术资料也略少.
    • Elementary OS: 设计巧妙, 看起来很棒; 预装的应用程序并不多
    • Linux Mint: 非常适合从 Windows / Mac 切换过来的用户, 良好的媒体支持, 开箱即用, 令人印象深刻的定制选项; 高级玩家可能不会喜欢
    • Tails: 强调安全和隐私, 易于使用的操作界面; 功能比较基本
    • openSUSE: 非常精美, 安全, 允许你创建自己的操作系统版本; 默认的软件选择略显臃肿
  • GNOME: Linux 系统就是一个纯命令行的操作系统, GNOMELinux 提供了桌面操作环境. GNOME 是由 GNU Network Object Model Environment 的第一个字母所组成, GNOME 属于 GNU 计划中的一部份.

Linux 的图形显示层次是: Linux 本身 -> X 服务器 <- [通过 X 协议交谈] -> 窗口管理器 (综合桌面环境) -> X 应用程序.

  • KDE: 与 GNOME 并列的两种最流行的桌面操作环境, 全称是 K Desktop Environment. 其他的一些比较流行的桌面操作环境有:
    • XFCE
    • CINNAMON
    • UNITY
    • MATE
    • DEEPIN
    • PANTHEON
    • BUDGIE
    • MANOKWARI
  • GNU: GNU 计划开始于 1984 年, 专注于发展类似 UNIX 且完全免费的操作系统.

快捷键

  • C-c: 终止正在执行的命令
  • C-p/n: 浏览已执行的历史记录
  • C-f: 向后移动一个字符
  • C-b: 向前移动一个字符
  • C-a: 光标移动到行首
  • C-e: 光标移到行尾
  • C-z: 将当前进程最小化
  • C-l: 清除整个屏幕
  • C-u: 从光标位置删除到行首 (bash); 删除当前行 (zsh)
  • C-k: 从光标位置删除到行尾
  • C-y: 粘贴上一次删除的字符串
  • C-h: 删除光标前一个字符
  • C-d: 删除光标后一个字符, 在删除完光标后会删除当前 shell 会话
  • C-w: 移除光标前一个单词
  • C-x-e: 在编辑器 (vi) 中编辑当前命令行文本
  • C-q: 将当前命令暂时隐藏, 等待下一个命令执行完毕后再弹出
  • ↑/↓: 浏览已执行的历史记录
  • C-r: 搜索之前打开过的命令
  • C-s: 向后搜索历史命令
  • Esc-d / alt-d: 删除光标所在字符
  • Esc-f / alt-f: 光标右移一个单词
  • Esc-b / alt-b: 光标左移一个单词
  • ⌘ E: 向下滚动一行
  • ⌘ Y: 向上滚动一行
  • 双击 Tab: 列出所有的补全列表并直接进入选择模式, 补全项可以使用 ctrl+n/p/f/b 上下左右切换
  • 上下键: 显示历史的命令, 如果在特定前缀命令下只会显示同样的命令, 比如输入 ls 情况下只会查找用过的 ls 命令

常用命令

  • 扩展

    • set -o noglob / set -f: 关闭扩展
    • set +o noglob / set +f: 打开扩展
  • 开关机

    • sync: 将数据由内存同步到硬盘中.
    • shutdown: 关机指令, 你可以 man shutdown 来看一下帮助文档. 例如你可以运行如下命令关机:
    • shutdown -h now: 立马关机
    • shutdown -h +10: 十分钟后关机
    • shutdown -h 10: 计算机将在 10 分钟后关机, 并且会显示在登陆用户的当前屏幕中.
    • shutdown -h 20:25: 系统会在今天 20:25 关机
    • shutdown -r now: 系统立马重启
    • shutdown -r +10: 系统十分钟后重启
    • reboot: 就是重启, 等同于 shutdown –r now
    • halt: 关闭系统, 等同于 shutdown –h now 和 poweroff
  • 切换 shell

    • cat /etc/shells: 常看当前系统支持的 shell 类型
    • chsh -s /bin/zsh: 将 zsh 设置成默认的 shell
    • source ~/.zshrc: 重载 zsh 的配置文件
    • . ~/.zshrc: 同 source ~/.zshrc, .source 的缩写形式
    • exec $SHELL -l: 重新启动 SHELL, 与 source 不同的是不会对 PATH 进行重新写入

  • ls: 列出当前目录下的所有文件及文件夹 (包括隐藏文件, 但是不包括以 . 开头的文件

    • ls ~/.oh-my-zsh/themes: 查看 zsh 下可用的主题
    • ls -d: 仅列出当前目录下的目录, 不列出文件
    • ls -a: 列出所有文件, 包括以 . 开头的文件
    • ls -l: 列出文件的详细信息 (以 line 形式列出文件及信息), 信息包含文件属性, 权限, 修改时间等
    • ls -l **/*.sh: 使用 * 进行匹配
  • pwd: 列出当前所在的目录

  • rm filename: 删除一个文件

  • rm -R: 删除文件夹及其下所有的文件

  • rm dir/*: 删除文件夹及其下所有的文件 (不删除 dir 文件夹本身及子文件夹)

  • rm -r dir/*: 删除文件夹及其下所有的文件 (不删除 dir 文件夹本身)

  • rmdir [路径]: 删除一个文件夹 (无法删除含有文件的文件夹)

  • rt <filename>: 移动文件到回收站, 是 trash 插件的 trash 命令的 alias

  • mkdir: 新建一个文件夹

  • zsh_stats: 查看当前使用频率最高的 20 条命令

  • cd: 在你知道路径的情况下, 比如 /usr/local/bin 你可以输入 cd /u/l/b 然后按进行补全快速输入 (路径分为绝对路径与相对路径, 绝对路径总以 / 开头, 相对路径直接以文件名开头)

    • cd ~/.oh-my-zsh/themes && ls: 查看当前 zsh 涵盖主题
    • cd..: 返回到上一级目录
    • cd../.vim: 返回到上一级目录, 并进入上一级目录下的 .vim 目录下
    • cd -: 返回到上一次访问的目录
  • d: 列出本次会话过程中浏览过的目录并对目录标出序号, 输入序号可快速进入目录

  • pushd <directory>: 与 cd 类似, 会进入某目录, 但是会将此次的进入目录放入堆栈中, 使用 popd 可以进入堆栈的上一目录

  • pushd +3: 从栈顶算起的 3 号目录 (从 0 开始), 移动到栈顶

  • popd: 进入堆栈的上一目录

  • popd -3: 删除从栈底算起的 3 号目录 (从 0 开始)

  • dirs: 查看堆栈内容

    • -c: 清空目录栈.

    • -l: 用户主目录不显示波浪号前缀, 而打印完整的目录.

    • -p: 每行一个条目打印目录栈, 默认是打印在一行.

    • -v: 每行一个条目, 每个条目之前显示位置编号 (从 0 开始).

    • +N: N 为整数, 表示显示堆顶算起的第 N 个目录, 从零开始.

    • -N: N 为整数, 表示显示堆底算起的第 N 个目录, 从零开始.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      $ pwd # 当前处在主目录, 堆栈为空
      /home/me

      # 进入 /home/me/foo
      $ pushd ~/foo # 当前堆栈为 /home/me/foo /home/me

      # 进入 /etc
      $ pushd /etc # 当前堆栈为 /etc /home/me/foo /home/me

      # 进入 /home/me/foo
      $ popd # 当前堆栈为 /home/me/foo /home/me

      # 进入 /home/me
      $ popd # 当前堆栈为 /home/me

      # 目录不变, 当前堆栈为空
      $ popd
  • cp: 复制

  • mv: 移动

  • ./test.sh: 执行当前目录下的 test.sh 文件, 必须使用 ./, 如果直接使用 test.sh 的话系统会在 PATH 中查找有没有 test.sh, 通常是不在的, 因此会报错, 使用 ./test.sh 表示就在当前目录找 test.sh, 这样就能顺利找到了

  • /bin/sh test.sh: 与上面的运行方式类似, 不过指定了解释器


  • brew install zsh zsh-completions: Mac 系统自带 zsh, 但一般不是最新的, 可以通过 Homebrew 来安装最新 zsh
  • export HOMEBREW_NO_AUTO_UPDATE=true: brew 每次安装包的时候都会检查 brew 本身是否有更新, 使用此命令可以跳过检查自身更新的过程. 如果需要 brew 更新的话直接使用 brew update 即可

  • groups: 查看当前用户所属组

    • wheel: 是系统管理员组, 默认有用户 root, 此组中的用户拥有系统最高权限, 100% 的控制系统, wheel 源于 BSD UNIX, 而 wheel 又有掌舵意思, 意味这掌控着系统方向
    • admin: 是用户管理员组, 在此组中的成员可以通过 sudo 命令暂时升级为 root 去执行命令, 和 wheel 同样身为管理员, 但是在平时, 如果不使用 sudo 的话就和普通用户没什么区别, 安全性更好
    • staff: 本机的用户都会在此组中, 注意, 并不包括用户 guest
    • everyone: 直译过来就是任何人, 包括任何用户, 比如 guest 或者是远程连接过来的用户
  • groups user_name: 查看指定用户所属组

  • groupadd [option] [groupname]: 添加某一用户组

    • -g: 指定新用户组的组标识号 (GID).
    • -o: 一般与 - g 选项同时使用, 表示新用户组的 GID 可以与系统已有用户组的 GID 相同.
  • groupdel [groupname]: 删除某一用户组

  • groupmode [option] [groupname]: 修改某一个用户组属性

    • -g: GID 为用户组指定新的组标识号.

    • -o: 与 - g 选项同时使用, 用户组的新 GID 可以与系统已有用户组的 GID 相同.

    • -n: 新用户组 将用户组的名字改为新名字

      groupmod –g 10000 -n group3 group2: 将组 group2 的标识号改为 10000, 组名修改为 group3.

  • newgrp root: 将用户切换到 root 组中 (前提是 root 组中是有本用户的)

  • cat /etc/passwd: 查看所有用户

  • cat /etc/group: 查看所有用户组

  • w: 查看当前活跃用户

  • whoami: 当前用户

  • useradd [option] hanley: 添加用户 hanley

    • -c: comment 指定一段注释性描述.
    • -d: 目录 指定用户主目录, 如果此目录不存在, 则同时使用 -m 选项, 可以创建主目录.
    • -g: 指定用户所属的 primary group (一个用户只能有一个).
    • -G: 指定用户所属的 secondary group (一个用户可以有 0 个或多个). sudo user add -g root -G wheel docker hanleylee
    • -s: 指定用户的登录 Shell. sudo useradd -s /usr/bin/zsh hanley
    • -u: 用户号 指定用户的用户号, 如果同时有 - o 选项, 则可以重复使用其他用户的标识号.
    • -D: 单用显示默认新建用户的配置, 如 sudo useradd -D; 后面添加其他参数时用于修改新创建的默认用户的配置, 例如 sudo useradd -D -s /bin/zsh
  • userdel [option] hanley: 删除用户 hanley

    • -r: 将用户的主目录一起删除
  • usermod [option] hanley: 修改用户 hanley 的配置

    • -c: comment 指定一段注释性描述.

    • -d: 目录 指定用户主目录, 如果此目录不存在, 则同时使用 -m 选项, 可以创建主目录.

    • -g: 指定用户所属的 primary group

    • -G: 指定用户所属的 secondary group

    • -s: Shell 文件 指定用户的登录 Shell.

    • -u: 用户号 指定用户的用户号, 如果同时有 - o 选项, 则可以重复使用其他用户的标识号.

      usermod -s /bin/ksh -d /home/z –g developer hanley: 此命令将用户 sam 的登录 Shell 修改为 ksh, 主目录改为 / home/z, 用户组改为 developer.

  • id username 查看当前用户的详情 (用户名, 所属组)

  • passwd [option] hanley: 修改用户 hanley 的密码

    • -l: 锁定口令, 即禁用账号.

    • -u: 口令解锁.

    • -d: 使账号无口令.

    • -f: 强迫用户下次登录时修改口令.

      非 root 下不能修改指定用户名的密码, 只能使用 passwd 修改自身密码

  • su - hanley: 切换到用户 hanley

  • su: 切换到 root

  • chmod -R 777 <file/folder>: 后面加文件名修改某个文件权限为可读可写, 后面加文件夹名修改其下所有文件为可读可写

    1
    2
    [root@localhost test] # ls -al log2012.log
    -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log # 从左到右依次是: 权限. 硬链接次数. 创建者. 创建者所属组. inode 号. 创建时间. 文件名

chmod 用于修改文件对于所有者及其他人的权限, 标准的完整写法为: sudo chmod [-cfvR] [--help] [mode] file

  • [-cfvR]:

    • -c: 当发生改变时, 报告处理信息
    • -f: 错误信息不输出
    • -R: 处理指定目录以及其子目录下的所有文件
    • -v: 运行时显示详细处理信息
  • [mode]:

    • r: 可读, 对应数字 4
    • w: 可写, 对应数字 2
    • x: 可执行, 对应数字 1
  • chmod +x <file/folder>: 为某文件加上可执行属性 (对三种用户都生效)

  • chmod -x <file/folder>: 为某文件删除可执行属性 (对三种用户都生效)

  • chmod u+rx script.sh: 只给脚本拥有者读权限与执行权限

  • chmod u=rwx,g=rx,o=r <file>: 不使用数字的方式, 直接使用缩写 u, g, o 的方式改变属主, 属组, 其他用户对某文件的读写权限, 等价于上一命令

  • chown mysql auth.log: 将文件 auth.log 的属主更改为 mysql

  • sudo chown -R $(whoami) /Library/Ruby/Gems/*: 为文件夹下的所有文件的属主改为当前用户

  • chown root:root auth.log: 将文件 auth.log 的属主与数组更改回 root

  • chgrp -R mysql apache2: 把文件 apache2 及该文件所属目录下的所有递归文件的所在组更改为 mysql

  • dscl. -list /Groups: 查看所有组

  • dscl. -list /Group PrimaryGroupID: 查看所有组及其 id

  • dscl. -read /groups: 查看所有组的所有详细信息

  • dscl. -read /Groups/admin 查看指定组 admin 的详细信息

  • dscl. -read /Groups/admin GroupMembership: 查看指定组 admin 的所有成员

  • dscl. -list /Users: 查看所有用户

  • dscl. -list /Users UniqueID: 查看所有用户及 ID

  • dscl. create /Groups/test: 创建 test 组

  • dscl. -delete /Groups/test_group: 删除 test 组

  • dscl. -create /Users/test_user: 创建 test_user 用户

  • dscl. -passwd /Users/test_user 'goodpwd'

  • dscl. -append /Groups/admin GroupMembership test_user: 将用户加入指定用户组 admin

  • dscl. -delete /Groups/test_group GroupMembership test_user: 从 admin 组中删除用户


  • cat [option] <file>: 从第一行输出文件内容到终端

    • -A: 相当于 -vET 的整合选项, 可列出一些特殊字符而不是空白而已;
    • -b: 列出行号, 仅针对非空白行做行号显示, 空白行不标行号!
    • -E: 将结尾的断行字节 $ 显示出来;
    • -n: 打印出行号, 连同空白行也会有行号, 与 -b 的选项不同;
    • -T: 将 [tab] 按键以 ^I 显示出来;
    • -v: 列出一些看不出来的特殊字符
  • cat > filename: 新建一个文件并编辑其内容 (使用 ⌃ D 退出编辑状态)

  • cat file1 file2 > file: 将两个文件合并为一个文件 (仅合并, 不输出)

  • cat /etc/shells: 常看当前系统支持的 shell 类型

  • tac: 从最后一行输出文件内容到终端

  • less <file>: 也是一页一页的显示文件内容, 但是可以向前翻页

    • d: 向下翻动
    • u: 向上翻动
    • q: 退出 less 程序
  • more <file>: 一页一页的显示文件内容, 不能向前翻页

  • head [-n 10] <file>: 只看头 10 行

  • tail [-n 10] <file>: 只看尾巴 10 行

  • touch filename: 新建一个文件

  • echo $SHELL: 查看当前使用的 shell 类型 (2019.12.10 目前使用 zsh )

  • echo $TERM: 查看当前使用的终端类型

  • echo $PATH: 查看当前系统的路径顺序

  • exprot PATH="/usr/local/sbin:$PATH": 将 /usr/local/sbin 加入到系统环境中并使之成为第一顺位

  • echo 'export PATH="/usr/local/sbin:$PATH"'>> ~/.zshrc: 将字符 export PATH="/usr/local/sbin:$PATH" 输出到 ~/.zshrc 文件的末尾

  • echo $PATH: 输出当前系统的路径读取顺序

  • env: 总是指向 /usr/bin/env 文件, 或者说, 这个二进制文件总是在目录 /usr/bin

  • /usr/bin/env bash: 返回 bash 可执行文件的位置, 前提是 bash 的路径是在 $PATH 里面.

    • -i: –ignore-environment, 不带环境变量启动.
    • -u: –unset=NAME, 从环境变量中删除一个变量.
    • --help: 显示帮助.
    • --version: 输出版本信息.
  • env -i /bin/sh: 新建一个不带任何环境变量的 Shell

  • for T in find /usr/share/terminfo -type f -printf ‘%f’ ;do echo "$T tput -T $T colors ";done|sort -nk2|tail -n20: 打印系统所支持的所有终端类型, 以及他们所支持的颜色位数


  • which python: 输出当前使用的 python 路径
  • where python: 输出当前环境下所有可用的 python 路径
  • type echo: 查看 echo 是否是 shell 内置命令, 如果不是内置则显示其路径
  • type -a echo: 查看 echo 的所有路径位置 (如果是内置命令也会显示)
  • type -t if: 显示某个命令的类型, if 的类型是 keyword
  • alias python='/usr/local/bin/python3': 设置应用的别名 (如果需要取消设置需使用 unalias vim, 如果想要在 .zshrc 中设置需将 ' 改为 " )
  • alias: 列出系统所有已设置的别名

ln -s source/file.txt destination/file.txt: 将 source 文件夹的 file.txt 文件在 destination 文件夹创建一个符号链接 (软链接)
ln source/file.txt destination/file.txt: 将 source 文件夹的 file.txt 文件在 destination 文件夹创建一个硬链接


  • history: 显示会话开始后的所有历史命令
  • history -c: 清理所有历史命令
  • history 10: 显示最近 10 个历史命令

  • osascript -e 'id of app"qq"': 获取 QQ 软件的 bundle identifier
  • ps -axu Chew | grep WeChat: 查看 Chew 用户名下的进程名为 WeChat 的进程
    • -a: 列出所有用户的进程
    • -u: 列出属于某用户的进程, Chew 为用户名
    • -x: 包括无控制终端的进程
    • grep: 过滤进程
  • top: 动态显示当前进程列表
  • ssh 122.51.83.9 -l root -p 66: 在终端中以 ssh 方式, 通过服务器 66 端口登录服务器, 如果是默认的 22 端口的话则不需要后面的 -p 66
  • openssl rsa -in temp.key -out temp.pem: 将 .key 转换为 .pem
  • openssl x509 -in tmp.crt -out tmp.pem: 将 .crt 转换为 .pem

  • sudo find / -name ".DS_Store" -depth -exec rm {} \;: 删除 Mac 中所有的 .DS_Store 文件

  • find. -name '*.DS_Store' -type f -delete: 删除本路径下的所有的 .DS_Store 文件

  • defaults write com.apple.desktopservices DSDontWriteNetworkStores true: 禁止 Mac 以后产生 .DS_Store 文件

  • defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE: 作用同上

  • defaults delete com.apple.desktopservices DSDontWriteNetworkStores: 恢复 .DS_Store 文件生成

  • 设置允许安装任何来源的软件

    1
    2
    sudo spctl --master-disable
    defaults write com.apple.LaunchServices LSQuarantine -bool false

  • nmcli g: 查看网络状态
  • nmcli d: 查看设备信息
  • nmcli d connect deviceName: 根据自身真实网卡名字对应修改 deviceName
  • nmcli connection modify enp0s5 connection.autoconnect yes: 设置此网卡开机自动连接网络

  • cat /etc/inittab: 获得系统支持的模式, CentOS8 只支持 multi-user.targetgraphical.target 模式
  • systemctl get-default: 查看当前系统启动后默认进入的模式, 是命令行模式还是图形化模式
  • systemctl set-default multi-user.target: 设置系统启动后默认进入命令行模式
  • systemctl set-default graphical.target: 设置系统启动后默认进入图形化模式
  • systemctl start sshd.service: 开启 sshd 服务
  • systemctl stop sshd.service: 停止 sshd 服务
  • systemctl restart sshd.service: 重启 sshd 服务
  • systemctl enable sshd.service: 开机默认启动 sshd 服务
  • yum groupinstall -y "Server with GUI": 安装图形化桌面系统 (在设置了启动进入图形化模式后还是没有进入图形化模式时使用)

  • alternatives --install <path1> <name> <path2> <priority>: 将 path2 的可执行文件在 path1 中以 name 创建符号链接 (如果没有的话), 并为其设置优先级
  • alternatives --config <name>: 列出可选值, 然后手动选择可选值
  • alternatives --remove <name> <path>: 移除某个命令的可选值
  • alternatives --set <name> <path>: 为已有的某个命令添加可选值 (典型代表是 python, python 配置可选值只能通过此项, 因为系统提供了一个 unversioned-python)
  • alternatives --list | grep <name>: 列出针对某个命令可选值

  • netstat -lnp|grep 80: 查看所有监听了 80 端口的进程
  • kill -9 25158: 将 pid 为 25158 的进程杀死
  • logout: 退出远程终端模拟器
  • wget url: 通过 url 下载文件
  • tar -zxvf filename.tar.gz: 解压文件

  • df [-ahikHtm] [file/folder]: 检查文件系统的磁盘空间占用情况
    • -a: 列出所有的文件系统, 包括系统特有的 /proc 等文件系统;
    • -k: 以 KBytes 的容量显示各文件系统;
    • -m: 以 MBytes 的容量显示各文件系统;
    • -h: 以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
    • -H: 以 M=1000K 取代 M=1024K 的进位方式;
    • -T: 显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
    • -i: 不用硬盘容量, 而以 inode 的数量来显示
  • du [-ahskm] [file/folder]: 对文件和目录磁盘使用的空间的查看 (比 df 简洁的多)
    • -a: 列出所有的文件与目录容量, 因为默认仅统计目录底下的文件量而已.
    • -h: 以人们较易读的容量格式 (G/M) 显示;
    • -s: 列出总量而已, 而不列出每个各别的目录占用容量;
    • -S: 不包括子目录下的总计, 与 -s 有点差别.
    • -k: 以 KBytes 列出容量显示;
    • -m: 以 MBytes 列出容量显示;
  • fdisk -l [device name]: 列出装置的所有分区
  • mkfs [-t 文件系统格式]: 装置文件名, 格式化磁盘
  • fsck [-t 文件系统] [-ACay] 装置名称: 磁盘检查
    • -t: 给定档案系统的型式, 若在 /etc/fstab 中已有定义或 kernel 本身已支持的则不需加上此参数
    • -s: 依序一个一个地执行 fsck 的指令来检查
    • -A: 对 / etc/fstab 中所有列出来的 分区 (partition) 做检查
    • -C: 显示完整的检查进度
    • -d: 打印出 e2fsck 的 debug 结果
    • -p: 同时有 -A 条件时, 同时有多个 fsck 的检查一起执行
    • -R: 同时有 -A 条件时, 省略 / 不检查
    • -V: 详细显示模式
    • -a: 如果检查有错则自动修复
    • -r: 如果检查有错则由使用者回答是否修复
    • -y: 选项指定检测每个文件是自动输入 yes, 在不确定那些是不正常的时候, 可以执行 # fsck -y 全部检查修复.
  • mount [-t 文件系统] [-L Label 名] [-o 额外选项] [-n] 装置文件名 挂载点: 挂载磁盘
  • umount [-fn] 装置文件名或挂载点: 卸载磁盘
    • -f: 强制卸除! 可用在类似网络文件系统 (NFS) 无法读取到的情况下;
    • -n: 不升级 /etc/mtab 情况下卸除.
  • compgen -c: 显示当前终端所有可调用命令
  • set / env: 显示所有环境变量

  • codesign [option] < 证书名 > <file>: 以某证书对某文件进行签名
    • -f: 强制的意思, 一般用来重新签名进行覆盖时使用
    • -s: 进行签名
  • codesign --remove-signature <file>: 清除动态库签名
  • codesign -v <file>: 查看签名
  • PS4='+%x:%I>' zsh -i -x -c '' |& grep ***: 检查别名的定义位置, 用于查找 alias 的详细位置
  • type -a <command>: 查找某个命令被定义在的位置
  • curl ifconfig.me: 获得本地在公网的 ip

Linux 系统目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
      2 dr-xr-xr-x.  18 root root 4.0K May 20 00:42.
2 dr-xr-xr-x. 18 root root 4.0K May 20 00:42..
16 lrwxrwxrwx. 1 root root 7 May 11 2019 bin -> usr/bin
2 dr-xr-xr-x. 6 root root 1.0K May 13 23:38 boot
1025 drwxr-xr-x. 21 root root 3.4K Jun 1 12:23 dev
2097153 drwxr-xr-x. 152 root root 12K Jun 1 12:23 etc
2 drwxr-xr-x. 4 root root 4.0K May 13 23:01 home
12 lrwxrwxrwx. 1 root root 7 May 11 2019 lib -> usr/lib
14 lrwxrwxrwx. 1 root root 9 May 11 2019 lib64 -> usr/lib64
11 drwx------. 2 root root 16K May 13 22:51 lost+found
2228225 drwxr-xr-x. 4 root root 4.0K May 13 23:40 media
1835009 drwxr-xr-x. 2 root root 4.0K May 11 2019 mnt
131073 drwxr-xr-x. 3 root root 4.0K May 17 21:47 opt
1 dr-xr-xr-x. 305 root root 0 Jun 1 12:22 proc
3145729 dr-xr-x---. 7 root root 4.0K May 24 03:27 root
11699 drwxr-xr-x. 49 root root 1.5K Jun 1 12:25 run
15 lrwxrwxrwx. 1 root root 8 May 11 2019 sbin -> usr/sbin
13 lrwxrwxrwx. 1 root root 19 May 14 23:44 snap -> /var/lib/snapd/snap
786433 drwxr-xr-x. 2 root root 4.0K May 11 2019 srv
1 dr-xr-xr-x. 13 root root 0 Jun 1 12:23 sys
17 -rw-r--r--. 1 root root 3.1M May 20 00:42 @System.solv
2490369 drwxrwxrwt. 46 root root 20K Jun 1 12:27 tmp
1310721 drwxr-xr-x. 12 root root 4.0K May 13 22:52 usr
1048577 drwxr-xr-x. 23 root root 4.0K May 16 23:33 var
  • /bin: bin 是 Binary 的缩写, 这个目录存放着系统普通用户使用的命令.

  • /boot: 这里存放的是启动 Linux 时使用的一些核心文件, 包括一些连接文件以及镜像文件.

  • /dev: Devices, 该目录下存放的是 Linux 的外部设备, 在 Linux 中访问设备的方式和访问文件的方式是相同的.

  • /etc: Editable Text Configuration, 这个目录用来存放所有的系统管理所需要的配置文件和子目录. 更改文件可能导致系统不能启动

    • /etc: 目录包含各种系统配置文件, 下面说明其中的一些. 其他的你应该知道它们属于哪个程序, 并阅读该程序的 man 页. 许多网络配置文件也在 /etc 中.
    • /etc/rc/etc/rc.d/etc/rc?.d: 启动, 或改变运行级时运行的脚本或脚本的目录.
    • /etc/passwd: 用户数据库, 其中的域给出了用户名, 真实姓名, 用户起始目录, 加密口令和用户的其他信息.
    • /etc/fdprm: 软盘参数表, 用以说明不同的软盘格式. 可用 setfdprm 进行设置. 更多的信息见 setfdprm 的帮助页.
    • /etc/fstab: 指定启动时需要自动安装的文件系统列表. 也包括用 swapon -a 启用的 swap 区的信息.
    • /etc/group: 类似 /etc/passwd, 但说明的不是用户信息而是组的信息. 包括组的各种数据.
    • /etc/inittab: init 的配置文件.
    • /etc/issue: 包括用户在登录提示符前的输出信息. 通常包括系统的一段短说明或欢迎信息. 具体内容由系统管理员确定.
    • /etc/magic: “file” 的配置文件. 包含不同文件格式的说明, “file” 基于它猜测文件类型.
    • /etc/motd: motd 是 message of the day 的缩写, 用户成功登录后自动输出. 内容由系统管理员确定. 常用于通告信息, 如计划关机时间的警告等.
    • /etc/mtab: 当前安装的文件系统列表. 由脚本 (scritp) 初始化, 并由 mount 命令自动更新. 当需要一个当前安装的文件系统的列表时使用 ( 例如 df 命令 ).
    • /etc/shadow: 在安装了影子 (shadow) 口令软件的系统上的影子口令文件. 影子口令文件将 /etc/passwd 文件中的加密口令移动到 /etc/shadow 中, 而后者只对超级用户 (root) 可读. 这使破译口令更困难, 以此增加系统的安全性.
    • /etc/login.defs: login 命令的配置文件.
    • /etc/printcap: 类似 /etc/termcap, 但针对打印机. 语法不同.
    • /etc/profile, /etc/csh.login, /etc/csh.cshrc: 登录或启动时 bourne 或 cshells 执行的文件. 这允许系统管理员为所有用户建立全局缺省环境.
    • /etc/securetty: 确认安全终端, 即哪个终端允许超级用户 (root) 登录. 一般只列出虚拟控制台, 这样就不可能 ( 至少很困难 ) 通过调制解调器 (modem) 或网络闯入系统并得到超级用户特权.
    • /etc/shells: 列出可以使用的 shell. chsh 命令允许用户在本文件指定范围内改变登录的 shell. 提供一机器 ftp 服务的服务进程 ftpd 检查用户 shell 是否列在 /etc/shells 文件中, 如果不是, 将不允许该用户登录.
    • /etc/termcap: 终端性能数据库. 说明不同的终端用什么 “转义序列” 控制. 写程序时不直接输出转义序列 ( 这样只能工作于特定品牌的终端 ), 而是从 /etc/termcap 中查找要做的工作的正确序列. 这样, 多数的程序可以在多数终端上运行.
  • /home: 用户的主目录, 在 Linux 中, 每个用户都有一个自己的目录, 一般该目录名是以用户的账号命名的.

  • /lib: Library, 这个目录里存放着系统最基本的动态连接共享库, 其作用类似于 Windows 里的 DLL 文件. 几乎所有的应用程序都需要用到这些共享库.

  • /lost+found: 这个目录一般情况下是空的, 当系统非法关机后, 这里就存放了一些文件.

  • /media: linux 系统会自动识别一些设备, 例如 U 盘, 光驱等等, 当识别后, linux 会把识别的设备挂载到这个目录下.

  • /mnt: 系统提供该目录是为了让用户临时挂载别的文件系统的, 我们可以将光驱挂载在 /mnt / 上, 然后进入该目录就可以查看光驱里的内容了.

  • /opt: Optional application software packages, 这是给主机额外安装软件所摆放的目录. 比如你安装一个 ORACLE 数据库则就可以放到这个目录下. 默认是空的.

  • /proc: Processes, 这个目录是一个虚拟的目录, 它是系统内存的映射, 我们可以通过直接访问这个目录来获取系统信息. 这个目录的内容不在硬盘上而是在内存里, 我们也可以直接修改里面的某些文件, 比如可以通过下面的命令来屏蔽主机的 ping 命令, 使别人无法 ping 你的机器:

    1
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  • /root: 该目录为系统管理员, 也称作超级权限者的用户主目录.

  • /run: 是一个临时文件系统, 存储系统启动以来的信息. 当系统重启时, 这个目录下的文件应该被删掉或清除. 如果你的系统上有 /var/run 目录, 应该让它指向 run.

  • /sbin: Superuser BINaries, 这里存放的是 root 管理员使用的系统管理程序.

  • /srv: 该目录存放一些服务启动之后需要提取的数据.(不用服务器就是空)

  • /sys: 这是 linux2.6 内核的一个很大的变化. 该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs. sysfs 文件系统集成了下面 3 种文件系统的信息

    • 针对进程信息的 proc 文件系统

    • 针对设备的 devfs 文件系统

    • 针对伪终端的 devpts 文件系统.

      该文件系统是内核设备树的一个直观反映. 当一个内核对象被创建的时候, 对应的文件和目录也在内核对象子系统中被创建.

  • /tmp: TeMPorary, 这个目录是用来存放一些临时文件的.

  • /usr: Unix Shared Resources, 这是一个非常重要的目录, 用户的很多应用程序和文件都放在这个目录下, 类似于 windows 下的 program files 目录.

    • /usr/bin: 系统普通用户使用的应用程序.
    • /usr/sbin: root 用户使用的比较高级的管理程序和系统守护程序.
    • /usr/src: 内核源代码默认的放置目录.
  • /var VARiable, 包含系统一般运行时要改变的数据. 通常这些数据所在的目录的大小是要经常变化或扩充的. 原来 /var 目录中有些内容是在 /usr 中的,
    但为了保持 /usr 目录的相对稳定, 就把那些需要经常改变的目录放到 /var 中了. 每个系统是特定的, 即不通过网络与其他计算机共享. 下面列出一些重要的目录
    (一些不太重要的目录省略了).

    • /var/catman: 包括了格式化过的帮助 (man) 页. 帮助页的源文件一般存在 /usr/man/catman 中; 有些 man 页可能有预格式化的版本, 存在 /usr/man/cat
      中. 而其他的 man 页在第一次看时都需要格式化, 格式化完的版本存在 /var/man 中, 这样其他人再看相同的页时就无须等待格式化了. (/var/catman
      经常被清除, 就像清除临时目录一样. )
    • /var/lib: 存放系统正常运行时要改变的文件.
    • /var/local: 存放 /usr/local 中安装的程序的可变量据 (即系统管理员安装的程序). 注意, 如果必要, 即使本地安装的程序也会使用其他 /var 目录, 例如 /var/lock.
    • /var/lock: 锁定文件. 许多程序遵循在 /var/lock 中产生一个锁定文件的约定, 以用来支持他们正在使用某个特定的设备或文件. 其他程序注意到这个锁定文件时, 就不会再使用这个设备或文件.
    • /var/log: 各种程序的日志 (log) 文件, 尤其是 login (/var/log/wtmplog 纪录所有到系统的登录和注销) 和 syslog (/var/log/messages
      纪录存储所有核心和系统程序信息 ). /var/log 里的文件经常不确定地增长, 应该定期清除.
    • /var/run: 保存在下一次系统引导前有效的关于系统的信息文件. 例如, /var/run/utmp 包含当前登录的用户的信息.
    • /var/spool: 放置 “假脱机 (spool)” 程序的目录, 如 mail, news, 打印队列和其他队列工作的目录. 每个不同的 spool 在 /var/spool 下有自己的子目录, 例如, 用户的邮箱就存放在 /var/spool/mail 中.
    • /var/tmp: 比 /tmp 允许更大的或需要存在较长时间的临时文件. 注意系统管理员可能不允许 /var/tmp 有很旧的文件.

Linux 文件属性

1
2
3
4
[root@www /]# ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot

实例中, bin 文件的第一个属性用 “d” 表示. “d” 在 Linux 中代表该文件是一个目录文件.

在 Linux 中第一个字符代表这个文件是目录, 文件或链接文件等等.

  • d: 则是目录
  • -: 则是文件;
  • l: 则表示为链接文档 (link file);
  • b: 则表示为装置文件里面的可供储存的接口设备 (可随机存取装置);
  • c: 则表示为装置文件里面的串行端口设备, 例如键盘, 鼠标 (一次性读取装置).

接下来的字符中, 以三个为一组, 且均为 rwx 的三个参数的组合. 其中, r 代表可读 (read), w 代表可写 (write), x 代表可执行 (execute). 要注意的是, 这三个权限的位置不会改变, 如果没有权限, 就会出现减号 - 而已.

每个文件的属性由左边第一部分的 10 个字符来确定 (如下图).

himg

文件的属主与属组

对于一个文件来说, 共有四类用户:

  • 属主用户: 文件的所有者
  • 属组用户: 与属主用户同组的用户, 使用 cat /etc/group 可查看所有用户组及各用户组中包含的用户
  • root 用户: 即 root
  • 其他用户: 不属于以上三者的其他用户

pseudo users: 伪用户

这些用户在 / etc/passwd 文件中也占有一条记录, 但是不能登录, 因为它们的登录 Shell 为空. 它们的存在主要是方便系统管理, 满足相应的系统进程对文件属主的要求.

常见的伪用户如下所示:

  • bin: 拥有可执行的用户命令文件
  • sys: 拥有系统文件
  • adm: 拥有帐户文件
  • uucp: UUCP 使用
  • lp: lp 或 lpd 子系统使用
  • nobody: NFS 使用

除了上面列出的伪用户外, 还有许多标准的伪用户, 例如: audit, cron, mail, usenet 等, 它们也都各自为相关的进程和文件所需要.

Linux 下的一些重要文件

/etc/passwd

/etc/group

所有用户组的信息, 格式如下:

1
组名: 口令: 组标识号: 组内用户列表
  • 组名: 是用户组的名称, 由字母或数字构成. 与 / etc/passwd 中的登录名一样, 组名不应重复.
  • 口令: 字段存放的是用户组加密后的口令字. 一般 Linux 系统的用户组都没有口令, 即这个字段一般为空, 或者是 *.
  • 组标识号: 与用户标识号类似, 也是一个整数, 被系统内部用来标识组.
  • 组内用户列表: 是属于这个组的所有用户的列表 / b], 不同用户之间用逗号 (,) 分隔. 这个用户组可能是用户的主组, 也可能是附加组.
1
2
3
4
5
6
7
root::0:root
bin::2:root,bin
sys::3:root,uucp
adm::4:root,adm
daemon::5:root,daemon
lp::7:root,lp
users::20:root,sam

/etc/shadow

由于 / etc/passwd 文件是所有用户都可读的, 如果用户的密码太简单或规律比较明显的话, 一台普通的计算机就能够很容易地将它破解, 因此对安全性要求较高的 Linux
系统都把加密后的口令字分离出来, 单独存放在一个文件中, 这个文件是 / etc/shadow 文件. 有超级用户才拥有该文件读权限, 这就保证了用户密码的安全性.

/etc/shadow 中的记录行与 /etc/passwd 中的一一对应, 它由 pwconv 命令根据 /etc/passwd 中的数据自动产生

它的文件格式与 /etc/passwd 类似, 由若干个字段组成, 字段之间用 : 隔开. 这些字段是:

1
登录名: 加密口令: 最后一次修改时间: 最小时间间隔: 最大时间间隔: 警告时间: 不活动时间: 失效时间: 标志
  • 登录名: 是与 / etc/passwd 文件中的登录名相一致的用户账号
  • 口令: 字段存放的是加密后的用户口令字, 长度为 13 个字符. 如果为空, 则对应用户没有口令, 登录时不需要口令; 如果含有不属于集合 {./0-9A-Za-z} 中的字符, 则对应的用户不能登录.
  • 最后一次修改时间: 表示的是从某个时刻起, 到用户最后一次修改口令时的天数. 时间起点对不同的系统可能不一样. 例如在 SCO Linux 中, 这个时间起点是 1970 年 1 月 1 日.
  • 最小时间间隔: 指的是两次修改口令之间所需的最小天数.
  • 最大时间间隔: 指的是口令保持有效的最大天数.
  • 警告时间: 字段表示的是从系统开始警告用户到用户密码正式失效之间的天数.
  • 不活动时间: 表示的是用户没有登录活动但账号仍能保持有效的最大天数.
  • 失效时间: 字段给出的是一个绝对的天数, 如果使用了这个字段, 那么就给出相应账号的生存期. 期满后, 该账号就不再是一个合法的账号, 也就不能再用来登录了.
1
2
3
4
5
6
7
8
9
10
11
12
root:Dnakfw28zf38w:8764:0:168:7:::
daemon:*::0:0::::
bin:*::0:0::::
sys:*::0:0::::
adm:*::0:0::::
uucp:*::0:0::::
nuucp:*::0:0::::
auth:*::0:0::::
cron:*::0:0::::
listen:*::0:0::::
lp:*::0:0::::
sam:EkdiSECLWPdSa:9740:0:0::::

系统环境路径

/etc/paths 中规定了系统路径查找顺序

1
2
3
4
5
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

Homebrew 安装的软件都会在 /usr/local/bin 中有一个快捷方式 (具体的文件在 /usr/local/Cellars 中), 因此要将系统环境路径设置为 /usr/local/bin
为第一个检查, 这样在键入 vim 命令时 Homebrew 安装的 vim 就会被先检测到, 内置的 vim 不会被启动

可在终端使用 echo $path 检查当前系统的路径读取顺序.

.zshrc 中追加路径可加入 export PATH="/usr/local/sbin:$PATH", 这样会将 /usr/local/sbin 路径加入到路径列表并成为第一顺位.

源码编译安装

尽管已经有些包管理软件, 但是仍然不可避免地要编译安装一些源码, 本例以 CentOS 编译安装 Python3.8.3 为例

  1. 编译环境准备

    1
    2
    3
    yum groupinstall 'Development Tools'
    yum install -y ncurses-libs zlib-devel mysql-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel \
    db4-devel libpcap-devel xz-devel
  2. 删除系统中已有的 python3

    /usr/bin/usr/local/bin 中查找 python3 与 pip3 的相关文件, 然后删除. 这一步是为了后面我们将编译出的文件链接到此两个文件夹中

  3. 下载 Python3.8.3 源码到桌面并解压

    1
    2
    3
    cd /home/hanley/Desktop/https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
    tar -xvf Python-3.8.3.tgz
    cd Python-3.8.3.tgz
  4. 配置编译选项

    1
    ./configure --prefix=/usr/local/python3.8.3 --enable-optimizations

    解释下这些选项的含义:

    • --prefix 选项是配置安装的路径, 如果不配置该选项, 安装后可执行文件默认放在 /usr/local/bin, 库文件默认放在 /usr/local/lib, 配置文件默认放在
      /usr/local/etc, 其它的资源文件放在 /usr/local/share, 比较凌乱.

    • --enable-optimizations 是优化选项 ( LTO, PGO 等) 加上这个 flag 编译后, 性能有 10% 左右的优化, 但是这会明显的增加编译时间, 老久了.

      ./configure 命令执行完毕之后创建一个文件 Makefile, 供下面的 make 命令使用, 执行 make install 之后就会把程序安装到我们指定的文件夹中去.

  5. 进行编译, 编译结果会放到 [第 4 步](# 第四步) 配置的文件夹中

    1
    make && make install
  6. 进入编译结果文件夹, 将编译出的结果软链接到 /usr/bin

    1
    2
    3
    4
    5
    6
    7
    cd /usr/local/Python3.8.3/bin
    ln -s python3.8 /usr/bin/python
    ln -s python3.8 /usr/bin/python3
    ln -s python3.8 /usr/bin/python3.8
    ln -s pip3.8 /usr/bin/pip
    ln -s pip3.8 /usr/bin/pip3
    ln -s pip3.8 /usr/bin/pip3.8

    因为终端寻找命令是根据我们定义的 PATH 的顺序来查找的, 我们的编译结果文件夹 /usr/local/Python3.8.3 并不在我们的 PATH 中,
    因此我们要将其中的结果软链接到已经在 PATH 的文件夹中

    同时, 如果不想做软链接, 也可以直接将编译结果文件夹加入到 PATH

    1
    2
    3
    vim /etc/profile # 编辑 etc/profile 文件
    export PATH=/usr/local/Python3.8.3/bin:$PATH # 在文件末尾直接加入我们的编译结果文件夹
    source etc/profile # 更新配置

    不过这样的话我们每编译一次软件可能就要编辑一次 PATH, 而且也会导致 PATH 过多, 因此更方便的方法还是使用软链接的方式

工具

yum

yumcentos 上的包管理工具, 作用类似于 Mac 上的 Homebrew, 有如下特点

  • yum 是 Linux 下用于安装 rpm 软件包的一个工具, 要使用它安装软件包, 必须提前配置 yum 源.
  • yum 源分为本地 yum 源和网络 yum 源. 本地 yum 源指软件仓库在本地; 网络 yum 源指软件仓库在远程.
  • 软件仓库里既有软件包也要有 repodata 目录, 即存放软件之间的依赖关系
  • yum 工具安装 rpm 软件包的最大优势就是解决软件包的依赖关系, 提高工作效率

源的安装方式

yum 的源位于 /etc/repos.d/ 文件夹中, 有两种方式安装

  • 自定义书写源

    /etc/repos.d/ 文件夹中直接创建以 .repo 结尾的文件, 格式按照 [源的格式](# 源的格式) 进行书写即可

  • 使用国内镜像源

    1
    2
    3
    4
    5
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 备份当前源
    wget http://mirrors.163.com/.help/CentOS6-Base-163.repo # 下载 163 源
    mv CentOS6-Base-163.repo CentOS-Base.repo # 重命名 163 源
    yum clean all # 清除之前源的缓存
    yum makecache # 生成新 163 源的缓存

源的格式

1
2
3
4
5
[local] #仓库的名字, 不要有特殊符号 (自定义)
name=local #yum 仓库描述, 可以不写
baseurl=file:///mnt #指定 yum 仓库的路径 (重要),file:// 表示本地仓库, 如果是网络仓库的话就是链接地址 (baseusl=http://mirrors.aliyun.com/centos/6/os/x86_64/)
enabled=1 #表示启用该仓库, 1 表示启用; 0 表示不启用
gpgcheck=0 #不用校验仓库里软件包的签名, 0 表示不校验; 1 表示校验

命令

yum 很多命令需要用到超级管理员的权限, 所以你需要在命令的前面加上 sudo, 比如 sudo yum install … 或者先执行一下 su 这个命令.

  • yum search <package name>: 安装包之前, 先搜索一下是否有此包
  • yum info <package name>: 查看此包的具体信息, 包含版本号, 尺寸, 所属仓库, 网址等
  • yum install <package name>: 安装包
  • yum install <package name> -y: 安装包, 提前加上 y, 不需要在中途再次被确认操作
  • yum reinstall <package name>: 重新安装包
  • yum install <repo>: 安装仓库, 比如 yum install epel-release 是安装一个叫 Extra Packages for Enterprise Linux 的仓库
  • yum list available: 列出所有可用的包
  • yum list installed: 列出已经安装的包
  • yum list installed | less: 列出已经安装的包 (以分页方式显示)
  • yum list installed | grep http: 列出已经安装的含有关键字 http 的包
  • yum provides <path>:: 判断文件来自哪个包
  • yum deplist <package name>: 列出软件包的依赖
  • yum repolist: 查看系统里所有被启用的仓库列表
  • yum check-update: 检查所有可以更新的包
  • yum clean packages: 清除暂存中的 rpm 包文件
  • yum clean headers: 清除暂存中的 rpm 包的头文件
  • yum clean oldheaders: 清除暂存中的旧的 rpm 包的头文件
  • yum clean all: 清除缓存中的旧的 rpm 头文件与包文件 (相当于 yum clean packages + yum clean oldheaders )
  • yum update: 更新所有包
  • yum update <package name>: 更新指定包
  • yum remove <package name>: 删除指定包 (还会把仅此包所使用的依赖删除)
  • yum remove all: 删除所有包 (慎用!)
  • yum groupinstall [packages1...] | yum groupupdate [package1...] | yum grouplist [package1...] | yum groupremove [package1...]: 批量操作

DNF

DNF 新一代的 RPM 软件包管理器. 他首先出现在 Fedora 18 这个发行版中. 目前已经取代了 YUM, 正式成为 Fedora 22 的包管理器.

说明: DNF 包管理工具只是代替 yum 客户端的工具, 实质上 dnf 和 yum 都还是使用同一个 YUM 源.

DNF 包管理器克服了 YUM 包管理器的一些瓶颈, 提升了包括用户体验, 内存占用, 依赖分析, 运行速度等多方面的内容.

提示: 实际使用中, dnf 确实比 yum 快很多.

安装

  1. 首先安装 epel-release: sudo yum install epel-release
  2. 通过 yum 安装 dnf: sudo yum install dnf

命令

  • dnf -version: 查看 DNF 包管理器版本
  • dnf repolist: 查看系统中可用的 DNF 软件库
  • dnf repolist all: 查看系统中可用和不可用的所有的 DNF 软件库 (用处: 该命令用于显示系统中可用和不可用的所有的 DNF 软件库)
  • dnf list: 列出所有 RPM 包 (用处: 该命令用于列出用户系统上的所有来自软件库的可用软件包和所有已经安装在系统上的软件包)
  • dnf list installed: 列出所有安装了的 RPM 包 (用处: 该命令用于列出所有安装了的 RPM 包)
  • dnf list available: 列出所有可供安装的 RPM 包 (用处: 该命令用于列出来自所有可用软件库的可供安装的软件包)
  • dnf search <package name>: 搜索软件库中的 RPM 包 (用处: 当你不知道你想要安装的软件的准确名称时, 你可以用该命令来搜索软件包. 你需要在”search” 参数后面键入软件的部分名称来搜索. )
  • dnf provides /bin/bash: 查找某一文件的提供者 (用处: 当你想要查看是哪个软件包提供了系统中的某一文件时, 你可以使用这条命令.)
  • dnf info <package name>: 查看软件包详情 (用处: 当你想在安装某一个软件包之前查看它的详细信息时, 这条命令可以帮到你. )
  • dnf install <package name>: 安装软件包

apt

Debian 与 Ubuntu 的包管理工具

命令

apt 命令 等价的命令 命令的功能
apt install apt-get install 安装软件包
apt remove apt-get remove 移除软件包
apt purge apt-get purge 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get autoremove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系
apt search apt-cache search 搜索应用程序
apt show apt-cache show 显示装细节
apt list 列出包含条件的包 (已安装, 可升级等)
apt edit-sources 编辑源列表

APT 包管理系统会将下载的 .deb 包缓存在 /var/cache/apt/archives

gem

gem 是管理 ruby 库和程序的标准包, 通过 Ruby Gem (如 http://rubygems.org/) 源来查找, 安装, 升级和卸载软件包, 非常的便捷

ruby 语言从 1.9.2 开始默认安装 Ruby Gem

命令

  • gem update --system: 更新 gem 自身, 为了系统的稳定性, 某些 linux 禁止执行此命令
  • gem update: 更新所有已安装的 gem 包
  • gem update [gemname]: 更新指定的 gem 包
  • gem install [gemname]: 安装包
  • gem install -l [gemname].gem: 安装本地包
  • gem install [gemname] --version=[ver]: 安装指定版本的包
    • gem uninstall [gemname]: 卸载包
  • gem uninstall [gemname] --version=[ver]: 卸载指定版本的包
  • gem list [--local]: 列出所有已安装的包

rpm

rpm 用于安装下载到本地的离线包

  • rpm -ivh <package path>: 安装下载到本地的包
  • rpm -q <package name>: 检查包是不是已经被安装了
  • rpm -qi <package path>: 查看包
  • rpm -qf <path>: 检查文件属于哪个包
  • rpm -Uvh <package name>: 更新安装的包
  • rpm -e <package name>: 移除安装的包
  • rpm -qa: 查看所有安装到本地的包
  • rpm -qa | less: 查看安装的包 (以分页的方式显示)

python

python 有包管理工具 pip

  • pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple: 设置清华源安装, 以后安装库时会自动使用清华源 (永久方案)
  • pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package: 使用清华源安装库 (临时方案)
  • pip install --upgrade pip: 升级 pip 到最新版本
  • pip install MySQL_python==1.2.2: 安装指定版本
  • pip install -r file: 根据文件内容安装库
  • pip list --outdated: 列出所有过期的 package
  • pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U: 升级所有 package
  • pip search package: 搜索库, (2020年12月之后不可用)
  • pip show package: 显示本地安装的库的信息
  • pip config:
    • list: 列出所有的配置信息
    • edit: 进入当前配置文件的编辑界面
    • get [name]: 获得相关 key 的 value
    • set [name]: 为相关 key 设置 value
    • unset [name]: 移除相关 key
    • debug: 显示所有的配置文件

pyenv

Python 版本管理工具, 通过添加垫片路径 ~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin 的方式来方便地切换全局, 本地, 系统的 Python 版本. 还能创建
virtual python environments, 通过将 python 安装到一个目录来作为 python 包虚拟环境, 然后通过切换目录实现不同包环境的切换.

安装

  1. CentOS

    1
    2
    sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel # 安装依赖
    curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash # 编译安装 pyenv
  2. MacOS

    1
    2
    brew install pyenv
    eval "$(pyenv init -)" # 在 ~/zshrc 中输入此配置

pyenv 的所有 python 会安装到 ~/.pyenv/ 文件夹中

命令与使用

  • pyenv install 3.8.3: 安装到了 ~/pyenv/versions/

  • pyenv install -l: 显示所有可安装的 Python 版本

  • pyenv uninstall 3.8.3: 或者直接删掉 ~/pyenv/versions/3.8.3 也可以

  • pyenv global: 查看全局版本

  • pyenv global 3.8.3: 设置全局版本为 3.8.3

  • pyenv global system: 设置全局版本跟随 system

  • pyenv local: 查看本地版本

  • pyenv local 3.8.3: 设置本地版本为 3.8.3(local 的优先级比 global 高)

  • pyenv local --unset: 取消设置的 shell 版本 (将删除当前目录下的 .python-version 文件)

  • pyenv shell: 查看 shell 的当前 python 版本

  • pyenv shell 3.8.3: 设置 shell 的 Python 版本, 这个优先级比 local 高

  • pyenv shell system: 取消 pyenv 特制的 Python 版本, 使用 system 默认版本

  • pyenv shell --unset: 取消设置的 shell 版本

  • pyenv virtualenv 3.8.3 test: 创建版本 3.8.3 的以 test 为名的环境; 如果不指定版本, 则使用当前环境的默认版本; 如果指定版本, 指定的版本一定要是已经安装在系统中的版本

  • pyenv virtualenvs: 列出当前虚拟环境

  • pyenv activate test: 激活 test 虚拟环境

  • pyenv deactivate: 退出虚拟环境, 回到系统环境

  • pyenv uninstall test: 删除名为 test 的虚拟环境, 或者删除其真实目录 rm -rf ~/.pyenv/versions/test

  • pyenv update: 更新 pyenv 本体

  • pyenv version: 查看当前系统的 python 版本由谁指定

  • pyenv versions: 查看当前系统的 python 版本由谁指定 (含 system 默认版本)

  • pyenv --version: 查看 pyenv 的系统版本

  • peynv rehash: 每次切换 python 版本后必须使用本命令

pyenv 在寻找 Python 路径的优先顺序是 shell > local > global, 当我们按下 pyenv --versions 时, 首先检索 shell 级别是否被设置, 然后检查 local
级别是否被设置 (即检索当前目录下的 .python-version 文件), 如果都没有被设置的话就使用 global 的设置 (因此 global 没有 --unset 命令)

与 pyenv 类似, 类似的工具还有 java 的 jenv, ruby 的 rbenv

virtualenv

在开发 Python 应用程序的时候, 系统安装的 Python 只有一个版本: 3.9.5 所有第三方的包都会被 pip 安装到 Pythonsite-packages 目录下.

如果我们要同时开发多个应用程序, 那这些应用程序都会共用一个 Python, 就是安装在系统的 Python 3.9.5. 如果应用 A 需要 jinja 2.7, 而应用 B 需要 jinja 2.6 怎么办?

这种情况下, 每个应用可能需要各自拥有一套 独立 的 Python 运行环境. virtualenv 就是用来为一个应用创建一套 隔离Python 运行环境.

安装

1
pip install virtualenv

命令

  • virtualenv venv: 创建一个独立的 python 运行环境, 命名为 venv (也建立了一个名为 venv 的目录)
  • source venv/bin/activate: 新建的 Python 环境被放到当前目录下的 venv 目录. 有了 venv 这个 Python 环境, 可以用 source 进入该环境
  • deactivate: 退出此 python 环境

virtualenv 是如何创建 独立 的 Python 运行环境的呢? 原理很简单, 就是把系统 Python 复制一份到 virtualenv 的环境, 用命令 source venv/bin/activate
进入一个 virtualenv 环境时, virtualenv 会修改相关环境变量, 让命令 pythonpip 均指向当前的 virtualenv 环境.

rbenv

ruby 版本管理工具, 使用方法与 pyenv 相似

安装

1
2
brew install rbenv
echo 'eval"$(rbenv init -)"' >> ~/.bashrc

命令

  • rbenv install -l: 列出所有可用版本
  • rbenv install 2.7.2: 安装 2.7.2 版本到系统中
  • rbenv versions: 显示当前 rbenv 所有已安装的及使用的版本
  • rbenv version: 显示 rbenv 的版本
  • rbenv global 2.7.2: 为 global 级别设置版本
  • rbenv global system: 使用系统版本
  • rbenv local 2.7.2: 为本地设置版本
  • rbenv local --unset: 取消本地版本设置
  • rbenv shell 2.7.2: 为终端设置版本
  • rbenv shell --unset: 取消 shell 版本设置
  • rbenv shell system: 取消 shell 版本设置
  • rbenv rehash: 每次切换 ruby 版本后必须使用本命令

rbenv 在寻找 Ruby 路径的优先顺序是 shell > local > global, 当我们按下 rbenv --versions 时, 首先检索 shell 级别是否被设置, 然后检查 local
级别是否被设置 (即检索当前目录下的 .ruby-version 文件), 如果都没有被设置的话就使用 global 的设置 (因此 global 没有 --unset 命令)

gem

  • gem -v: gem 版本
  • gem source: gem 资源
  • gem sources -a url: gem 添加配置源
  • gem sources -r url: gem 删除配置源
  • gem update: 更新所有包
  • gem update --system: 更新 RubyGems 软件
  • gem install rake: 安装 rake, 从本地或远程服务器
  • gem install rake --remote: 安装 rake, 从远程服务器
  • sudo gem install -n /usr/local/bin cocoapods: 将 cocoapods 安装到 /usr/local/bin 中
  • gem install watir -v 1.6.2: 指定安装版本的
  • gem uninstall rake: 卸载 rake 包
  • gem list d: 列出本地以 d 打头的包
  • gem query -n ''[0-9]'' --local: 查找本地含有数字的包
  • gem search log --both: 从本地和远程服务器上查找含有 log 字符串的包
  • gem search log --remoter: 只从远程服务器上查找含有 log 字符串的包
  • gem search -r log: 只从远程服务器上查找含有 log 字符串的包
  • gem help: 提醒式的帮助
  • gem help install: 列出 install 命令 帮助
  • gem help examples: 列出 gem 命令使用一些例子
  • gem build rake.gemspec: 把 rake.gemspec 编译成 rake.gem
  • gem check -v pkg/rake-0.4.0.gem: 检测 rake 是否有效
  • gem cleanup: 清除所有包旧版本, 保留最新版本
  • gem contents rake: 显示 rake 包中所包含的文件
  • gem dependency rails -v 0.10.1: 列出与 rails 相互依赖的包
  • gem environment: 查看 gem 的环境

find

查找文件的利器

find [path…] [expression]
- path: find 命令所查找的目录路径. 例如用. 来表示当前目录, 用 / 来表示系统根目录
- expression: expression 可以分为——“-options [-print -exec -ok…]”
- -options, 指定 find 命令的常用选项, 下节详细介绍
- -name: 文件名字, find. -name "*.c"
- -iname: 不区分大小写的 name
- -type: 文件类型
- f: 普通文件
- d: 目录
- l: 符号链接文件
- b: 块设备文件
- c: 字符设备文件
- p: 管道文件
- -user: 按照文件属主来查找文件 find ~ -user sam -print
- -perm: 按照文件权限来查找文件 find. -perm 755 -print
- -nogroup: 查找无有效属组的文件
- -nouser: 查找无有效属主的文件
- -size: 查找文件长度为 n 块的文件, 带有 c 时表示文件长度以字节计.
- -depth: 深度
- -follow: 遇到符号链接文件时, 跟踪至链接指向的文件
- -print, find 命令将匹配的文件输出到标准输出
- -exec, find 命令对匹配的文件执行该参数所给出的 shell 命令. 相应命令的形式为 'command' {} \;, 注意 {}\; 之间的空格
- -ok, 和 -exec 的作用相同, 只不过以一种更为安全的模式来执行该参数所给出的 shell 命令, 在执行每一个命令之前, 都会给出提示, 让用户来确定是否执行.

  • find /etc -type d –print: 在 / etc 目录下查找所有的目录
  • find.! -type d –print: 在当前目录下查找除目录以外的所有类型的文件
  • find /etc -type l –print: 在 / etc 目录下查找所有的符号链接文件
  • find / -name "CON.FILE" -depth –print 它将首先匹配所有的文件然后再进入子目录中查找
  • find./ -size 0 -exec rm { } \;: 删除文件大小为零的文件
  • find. -type f -exec ls -l { } \;: 用 ls -l 命令列出所匹配到的文件
  • find. -name '*.tmp' -exec rm { } \;: 找到并删除
  • find /logs -type f -mtime +5 -exec rm { } \;: 在 / logs 目录中查找更改时间在 5 日以前的文件并删除它们
  • find. -size +1000000c –print: 在当前目录下查找文件长度大于 1 M 字节的文件
  • find /home/apache -size 100c –print: 在 / home/apache 目录下查找文件长度恰好为 100 字节的文件
  • find. -size +10 –print: 在当前目录下查找长度超过 10 块的文件 (一块等于 512 字节)

fd

一款基于 Rust 的速度超快的将要取代 find 的命令行搜索工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
USAGE:
fd [FLAGS/OPTIONS] [<pattern>] [<path>...]

FLAGS:
-H, --hidden Search hidden files and directories
-I, --no-ignore Do not respect.(git|fd)ignore files
--no-ignore-vcs Do not respect.gitignore files
-s, --case-sensitive Case-sensitive search (default: smart case)
-i, --ignore-case Case-insensitive search (default: smart case)
-F, --fixed-strings Treat the pattern as a literal string
-a, --absolute-path Show absolute instead of relative paths
-L, --follow Follow symbolic links
-p, --full-path Search full path (default: file-/dirname only)
-0, --print0 Separate results by the null character
-h, --help Prints help information
-V, --version Prints version information

OPTIONS:
-d, --max-depth <depth> Set maximum search depth (default: none)
-t, --type <filetype>... Filter by type: file (f), directory (d), symlink (l),
executable (x)
-e, --extension <ext>... Filter by file extension
-x, --exec <cmd> Execute a command for each search result
-E, --exclude <pattern>... Exclude entries that match the given glob pattern
--ignore-file <path>... Add a custom ignore-file in.gitignore format
-c, --color <when> When to use colors: never, *auto*, always
-j, --threads <num> Set number of threads to use for searching & executing

ARGS:
<pattern> the search pattern, a regular expression (optional)
<path>... the root directory for the filesystem search (optional)

实例

  • fd pace
  • fd -t f pace: 过滤搜索含关键字 pace 的文件, -t 表示类型, 支持 f, d, l, x 四种类型 (文件, 目录, 链接, 可执行文件), 默认不过滤
  • fd -t d pace: 过滤搜索含关键字 pace 的目录
  • fd passwd /etc: 在指定目录搜索, 目录放在第二个参数上
  • fd '^head.*swig$': 搜索以 head 开头且 swig 结尾的文件
  • fd '[a-z]\.png$': 文件名最后一个为字母且后缀为 PNG 的文件
  • fd -H zshrc: 将隐藏文件也纳入搜索范围
  • fd -e md: 搜索扩展名为 md 的文件
  • fd -e md readme: 搜索扩展名为 md 且文件名包含 readme 的资源
  • fd -E lib readme: 搜索当前目录下除 lib 目录外的所有包含关键字 readme 的文件或目录
  • fd -E '*.js' -t f. source/lib/fastclick: 搜索指定目录下除文件名后缀为 js 的所有文件 (patter 不想写可以使用 . 代替)
  • fd -t f -e md Blog -x echo {}: 通过 fd 自带的处理工具在搜索后进行处理, 加 -x, 一定要放在命令的最后部分
  • fd -0 -t f -e md Blog | xargs -0 -I {} echo {}: 使用与 find 相同的 xargs 进行处理
  • fd -e jpg -x chmod 644 {}: 找到所有扩展名为 jpg 的文件并将运行 chmod 644 <path-to-file>
    • {}: 一个占位符, 它将随着搜索结果的路径改变 (wp-content/uploads/01.jpg).
    • {.}: 类似于 {}, 但不使用文件扩展名 (wp-content/uploads/01).
    • {/}: 将被搜索结果的基本名称 (01.jpg) 所取代的占位符.
    • {//}: 发现路径的父目录 (wp-content/uploading).
    • {/.}: 只有基本名称, 没有扩展名 (01).

PlistBuddy

himg

PlistBuddy 是一款修改 plist 文件的终端工具

1
2
3
4
5
#!/bin/sh

info_plist="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_FOLDER_PATH}/Info.plist"
/usr/libexec/PlistBuddy -c "Set:CFBundleShortVersionString'${Version_Code}'""${info_plist}"
/usr/libexec/PlistBuddy -c "Set:CFBundleShortVersionString'${Build_Code}'""${info_plist}"

xargs

很多命令是不支持管道作为其输入的, 比如 echo, echo "hello world" | echo 是不会有任何输出的. 我们可以使用 xargs 将上一管道的输出转换为命令行参数, 进而使本管道的命令可以正常使用. echo "hello world" | xargs echo

绝大多数情况下, xargs 都是配合管道使用的.

参数

  • -d: delim, 分隔符, 默认的 xargs 分隔符是回车, argument 的分隔符是空格, 这里修改的是 xargs 的分隔符.
  • -p: 当每次执行一个 argument 的时候询问一次用户.

himg

  • -t: 表示先打印命令, 然后再执行. 与 -p 的不同是可以不经过确认直接执行, 仅提示

  • -I {}: 将传入的参数命名为 {}, 之后便可以使用 {} 代替传入的参数.

  • -0: find 与 fd 默认的输出文件是以空格为分隔符, find 与 fd 可以使用 -0 命令输出以 null (也叫 \0 ) 分隔的结果, 然后 xargs 指定 -0 便可以接受此类型的数据, 因此正好与之相匹配!

  • -L num: 从标准输入一次读取 num 行转换为命令行参数

    1
    2
    3
    4
    $ echo -e "a\nb\nc" | xargs -L 1 echo
    a
    b
    c
  • -n num: 每次将多少项转换为命令行参数

    1
    2
    3
    4
    5
    6
    $ echo {0..9} | xargs -n 2 echo
    0 1
    2 3
    4 5
    6 7
    8 9
  • -a: file 从文件中读入作为 stdin

  • -e: flag, 注意有的时候可能会是 -E, flag 必须是一个以空格分隔的标志, 当 xargs 分析到含有 flag 这个标志的时候就停止.

  • -r: no-run-if-empty 当 xargs 的输入为空的时候则停止 xargs, 不用再去执行了.

  • -s num: 命令行的最大字符数, 指的是 xargs 后面那个命令的最大命令行字符数.

  • -l: 同 -L.

  • -x: exit 的意思, 主要是配合 -s 使用..

  • -P: 修改最大的进程数, 默认是 1, 为 0 时候为 as many as it can, 这个例子我没有想到, 应该平时都用不到的吧.

范例

  • fd -0 -e md Blog | xargs -0 -I {} echo {}: 查找名字中含 Blog 的 md 文件, 然后打印出来 (xargs 指定参数名为 {} )
  • fd -0 -e md Blog | xargs -0 -p -I {} echo "{}\n": 打印输出结果并换行
  • find. -type f -print | xargs file 查找系统中的每一个普通文件, 然后使用 xargs 命令来测试它们分别属于哪类文件
  • find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件 (core dump), 然后把结果保存到 / tmp/core.log 文件中:
  • find. -type f -print | xargs grep "hostname" 用 grep 命令在所有的普通文件中搜索 hostname 这个词
  • find./ -mtime +3 -print|xargs rm -f –r 删除 3 天以前的所有东西 (find. -ctime +3 -exec rm -rf {} ;)
  • find./ -size 0 | xargs rm -f & 删除文件大小为零的文件

netstat

  • netstat -tunlp | grep 端口号

    • -t: (tcp) 仅显示 tcp 相关选项
    • -u: (udp) 仅显示 udp 相关选项
    • -n: 拒绝显示别名, 能显示数字的全部转化为数字
    • -l: 仅列出在 Listen(监听) 的服务状态
    • -p: 显示建立相关链接的程序名
  • netstat -ntlp: 查看当前所有 tcp 端口

  • netstat -ntulp | grep 3306: 查看所有 3306 端口使用情况

grep

grep (global search regular expression(RE) and print out the line, 全面搜索正则表达式并把行打印出来) 是一种强大的文本搜索工具, 它能使用正则表达式搜索文本, 并把匹配的行打印出来.

匹配模式

  • ^: 锚定行的开始 如: ^grep 匹配所有以 grep 开头的行.
  • $: 锚定行的结束 如: grep$ 匹配所有以 grep 结尾的行.
  • .: 匹配一个非换行符的字符 如: gr.p 匹配 gr 后接一个任意字符, 然后是 p.
  • *: 匹配零个或多个先前字符 如: *grep 匹配所有一个或多个空格后紧跟 grep 的行. .* 一起用代表任意字符.
  • []: 匹配一个指定范围内的字符, 如’[Gg]rep’匹配 Grep 和 grep.
  • [^]: 匹配一个不在指定范围内的字符, 如: [^A-FH-Z]rep 匹配不包含 A-F 和 H-Z 的一个字母开头, 紧跟 rep 的行.
  • \(..\): 标记匹配字符, 如: \(love\), love 被标记为 1.
  • \<: 锚定单词的开始, 如: \<grep 匹配包含以 grep 开头的单词的行.
  • \>: 锚定单词的结束, 如 grep\> 匹配包含以 grep 结尾的单词的行.
  • x\{m\}: 连续重复字符 x, m 次, 如: o\{5\} 匹配包含连续 5 个 o 的行.
  • x\{m,\}: 连续重复字符 x, 至少 m 次, 如: o\{5,\} 匹配至少连续有 5 个 o 的行.
  • x\{m,n\}: 连续重复字符 x, 至少 m 次, 不多于 n 次, 如: o\{5,10\} 匹配连续 5–10 个 o 的行.
  • \w: 匹配一个文字和数字字符, 也就是 [A-Za-z0-9], 如: G\w*p 匹配以 G 后跟零个或多个文字或数字字符, 然后是 p.
  • \W: w 的反置形式, 匹配一个非单词字符, 如点号句号等. \W * 则可匹配多个.
  • \b: 单词锁定符, 如: \bgrep\b 只匹配 grep, 即只能是 grep 这个单词, 两边均为空格.

命令参数

  • -?: 同时显示匹配行上下的? 行, 如: grep -2 pattern filename 同时显示匹配行的上下 2 行.
  • -b, --byte-offset: 打印匹配行前面打印该行所在的块号码.
  • -r, -d recurse: 递归搜索
  • -c,--count: 只打印匹配的行数, 不显示匹配的内容.
  • -f File, --file=File: 从文件中提取模板. 空文件中包含 0 个模板, 所以什么都不匹配.
  • -h, --no-filename: 当搜索多个文件时, 不显示匹配文件名前缀.
  • -i, --ignore-case: 忽略大小写差别.
  • -q, --quiet: 取消显示, 只返回退出状态. 0 则表示找到了匹配的行.
  • -l, --files-with-matches: 打印匹配模板的文件清单.
  • -L, --files-without-match: 打印不匹配模板的文件清单.
  • -n, --line-number: 在匹配的行前面打印行号.
  • -s, --silent: 不显示关于不存在或者无法读取文件的错误信息.
  • -v, --revert-match: 反检索, 只显示不匹配的行.
  • -w, --word-regexp: 如果被 <和 > 引用, 就把表达式做为一个单词搜索.
  • -V, --version: 显示软件版本信息.

范例

  • ls -l | grep '^a': 通过管道过滤 ls -l 输出的内容, 只显示以 a 开头的行.
  • grep 'test' d*: 显示所有以 d 开头的文件中包含 test 的行.
  • grep 'test' aa bb cc: 显示在 aa, bb, cc 文件中匹配 test 的行.
  • grep '[a-z]' aa: 显示所有包含每个字符串至少有 5 个连续小写字符的字符串的行.
  • grep 'w(es)t.*' aa: 如果 west 被匹配, 则 es 就被存储到内存中, 并标记为 1, 然后搜索任意个字符 ( .* ), 这些字符后面紧跟着另外一个 es(),
    找到就显示该行. 如果用 egrep 或 grep -E, 就不用 “”号进行转义, 直接写成 'w(es)t.*' 就可以了.
  • grep -i pattern files: 不区分大小写地搜索. 默认情况区分大小写
  • grep -l pattern files: 只列出匹配的文件名,
  • grep -L pattern files: 列出不匹配的文件名,
  • grep -w pattern files: 只匹配整个单词, 而不是字符串的一部分 (如匹配‘magic’, 而不是‘magical’),
  • grep -C number pattern files: 匹配的上下文分别显示 [number] 行,
  • grep pattern1 | pattern2 files: 显示匹配 pattern1 或 pattern2 的行,
  • grep pattern1 files | grep pattern2: 显示既匹配 pattern1 又匹配 pattern2 的行.

cp

命令参数

  • -a: 此参数的效果和同时指定 “-dpR” 参数相同;
  • -d: 当复制符号连接时, 把目标文件或目录也建立为符号连接, 并指向与源文件或目录连接的原始文件或目录;
  • -f: 强行复制文件或目录, 不论目标文件或目录是否已存在;
  • -i: 覆盖既有文件之前先询问用户;
  • -l: 对源文件建立硬连接, 而非复制文件;
  • -p: 保留源文件或目录的属性;
  • -R/r: 递归处理, 将指定目录下的所有文件与子目录一并处理;
  • -s: 对源文件建立符号连接, 而非复制文件;
  • -u: 使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时, 才复制文件;
  • -S: 在备份文件时, 用指定的后缀 “SUFFIX” 代替文件的默认后缀;
  • -b: 覆盖已存在的文件目标前将目标文件备份;
  • -v: 详细显示命令执行的操作.

范例

  • cp -r aaa/.*./bbb: 将 aaa 目录下的, 所有 . 开头的文件, 复制到 bbb 目录中.
  • cp -rfb./*../backup: 将当前目录下所有文件, 复制到当前目录的兄弟目录 backup 文件夹中
  • cp file /usr/men/tmp/file1: 将文件 file 复制到目录 /usr/men/tmp 下, 并改名为 file1
  • cp -R /usr/men /usr/zh 将目录 /usr/men 下的所有文件及其子目录复制到目录 / usr/zh 中

scp

scp 是基于 ssh 协议的 cp, 我们使用 scp 时相当于使用 ssh 登录后再进行拷贝操作
-p 参数用来保留修改时间 (modification time), 访问时间 (access time), 文件状态 (mode) 等原始文件的信息.

命令参数

1
scp [option] source destination
  • -c: 指定文件拷贝数据传输的加密算法
  • -C: 是否在传输时压缩文件
  • -F: 用来指定 ssh_config 文件, 供 ssh 使用.
  • -l: 用来限制传输数据的带宽速率, 单位是 Kbit/sec. 对于多人分享的带宽, 这个参数可以留出一部分带宽供其他人使用.
  • -P: 用来指定远程主机的 SSH 端口. 如果远程主机使用默认端口 22, 可以不用指定, 否则需要用 - P 参数在命令中指定.
  • -q: 用来关闭显示拷贝的进度条.
  • -r: 表示是否以递归方式复制目录.
  • -v: 用来显示详细的输出.

示例

  • scp SourceFile user@host:directory/TargetFile
  • scp file.txt remote_username@10.10.0.2:/remote/directory
  • scp -r documents username@server_ip:/path_to_remote_directory: 将本机的 documents 目录拷贝到远程主机, 会在远程主机创建 documents 目录
  • scp -r localmachine/path_to_the_directory username@server_ip:/path_to_remote_directory/: 将本机整个目录拷贝到远程目录下
  • scp -r localmachine/path_to_the_directory/* username@server_ip:/path_to_remote_directory/: 将本机目录下的所有内容拷贝到远程目录下
  • scp user@host:directory/SourceFile TargetFile: 远程文件复制到本地
  • scp -r username@server_ip:/path_to_remote_directory local-machine/path_to_the_directory/: 拷贝一个远程目录到本机目录下
  • scp -r username@server_ip:/path_to_remote_directory/* local-machine/path_to_the_directory/: 拷贝远程目录下的所有内容, 到本机目录下
  • scp user@host1:directory/SourceFile user@host2:directory/SourceFile: 两个远程系统之间复制数据

sed

sed 是一种流编辑器, 它是文本处理中非常重要的工具, 能够完美的配合正则表达式使用, 功能不同凡响. 处理时, 把当前处理的行存储在临时缓冲区中, 称为
“模式空间” (pattern space), 接着用 sed 命令处理缓冲区中的内容, 处理完成后, 把缓冲区的内容送往屏幕. 接着处理下一行, 这样不断重复, 直到文件末尾.
文件内容并没有 改变, 除非你使用重定向存储输出. Sed 主要用来自动编辑一个或多个文件; 简化对文件的反复操作; 编写转换程序等.

命令参数

  • -e<script>, --expression=<script>: 以选项中指定的 script 来处理输入的文本文件.
  • -f<script 文件>, --file=<script 文件 >: 以选项中指定的 script 文件来处理输入的文本文件.
  • -h, --help: 显示帮助.
  • -n, --quiet, --silent: 仅显示 script 处理后的结果.
  • -V, --version: 显示版本信息.

动作参数

  • a: 新增, a 的后面可以接字串, 而这些字串会在新的一行出现 (目前的下一行)
  • c: 取代, c 的后面可以接字串, 这些字串可以取代 n1,n2 之间的行!
  • d: 删除, 因为是删除啊, 所以 d 后面通常不接任何咚咚;
  • i: 插入, i 的后面可以接字串, 而这些字串会在新的一行出现 (目前的上一行);
  • p: 打印, 亦即将某个选择的数据印出. p 会与参数 -n 一起运行, 否则会打印两遍
  • n: 读取下一个输入行, 用下一个命令处理新的行而不是用第一个命令.
  • s: 取代, 可以直接进行取代的工作哩! 通常这个 s 的动作可以搭配正规表示法! 例如 1,20s/old/new/g 就是啦!
  • q: 退出 sed
  • r file: 从 file 中读行
  • w file: 写并追加模板快到 file 末尾

范例

  • sed -e 4a\newLine testfile: 在 testfile 文件的第四行后添加一行, 并将结果输出到标准输出
  • nl /etc/passwd | sed '2,5d': 将 /etc/passwd 的内容列出并且打印行号, 同时, 请将第 2~5 行删除!
  • nl /etc/passwd | sed '2d': 只要删除第 2 行
  • nl /etc/passwd | sed '3,$d': 要删除第 3 到最后一行
  • nl /etc/passwd | sed '/root/d': 删除 / etc/passwd 所有包含 root 的行, 其他行输出
  • nl /etc/passwd|sed -n '10p': 打印第 10 行内容
  • sed -n 'p' /etc/passwd
  • sed -n '/root/p' /etc/passwd: 正则匹配打印
  • nl /etc/passwd|sed -n '10,20p': 打印第 10 行到 20 行
  • nl /etc/passwd|sed -n '/news/,/nobody/p': 用正则来指定一个行的范围
  • nl /etc/passwd|sed -n '10,20!p': 不选择 10 到 20 行, ! 代表取反
  • nl /etc/passwd|sed -n '1~2p': 间隔行, 会输出 1,3,5…. 行
  • nl /etc/passwd|sed '1,2a **************' 后面插入
  • nl /etc/passwd|sed '1,2i **************': 前面插入
  • nl /etc/passwd|sed '1c abcd': 选中的行改为新的文本
  • sed 's/false/true/' /etc/passwd: 替换
  • sed 's/:/%/g' /etc/passwd: 全局替换
  • nl /etc/passwd|sed '{44,48d;s/false/true/}': 多个 sed 命令, 用 {} 包住, ; 隔开; 删除 44-48 行内容, 然后将 false 替换为 true
  • sed 's/^[a-z_]\+/& /' /etc/passwd: & 替换固定字符串, 代表前面匹配到的字符
  • sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/: \1, \2 表示前面 () 匹配到的字符
  • sed '1r 123.txt' abc.txt: 读取 123.txt 的内容, 复制到匹配的 abc.txt 文件的第一行, 文件内容均不改变
  • sed '2w 123.txt' abc.txt: 匹配 abc.txt 文件的第二行, 写入到 123.txt 文件中. 123.txt 文件会发生变化, abc
  • nl passwd |sed '2q': 找到结果后提前退出
  • /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
  • /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
  • nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/': e 表示多点编辑, 第一个编辑命令删除 /etc/passwd 第三行到末尾的数据, 第二条命令搜索 bash 替换为 blueshell.
  • sed -i 's/\.$/\!/g' regular_express.txt: 利用 sed 将 regular_express.txt 内每一行结尾若为. 则换成!
  • sed -i '$a # This is a test' regular_express.txt: 利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:

LESS

less 是一个查看输出的工具, 操作的键位风格为 vim.

1
less [option] file
  • -X / --no-init: 阻止 less 退出后清理屏幕
  • -+X: 重置 -X 选项, 使 less 退出后清理屏幕
  • -N: 显示行号
  • +F: 文件内容可能会改变 (打开日志文件时很有用)

rsync

rsync 是一个常用的 Linux 应用程序, 用于文件同步.

它可以在本地计算机与远程计算机之间, 或者两个本地目录之间同步文件 (但不支持两台远程计算机之间的同步). 它也可以当作文件复制工具, 替代 cp 和 mv 命令.

它名称里面的 r 指的是 remote, rsync 其实就是 “远程同步” (remote sync) 的意思. 与其他文件传输工具 (如 FTP 或 scp) 不同, rsync 的最大特点是会检查发送方和接收方已有的文件, 仅传输有变动的部分 (默认规则是文件大小或修改时间有变动).

命令参数

  • -r: 递归同步, 含子目录时是必须的
  • -a: 除了可以递归同步外, 还同步元信息. 因此本命令包含了 -r, 是最常使用的.
  • -n: 模拟执行
  • -v: 将同步结果输出到终端, 这样可以看到哪些内容被同步
  • --delete: 如果要使得目标目录成为源目录的镜像副本, 则必须使用 –delete 参数, 这将删除只存在于目标目录, 不存在于源目录的文件.
  • --exclude=: 排除文件
  • --include: 必须包含文件, 常与 --exclude 结合使用

示例

  • rsync -r source destination
  • rsync -r source1 source2 destination: 多个目录的递归同步 (source1, source2 都会被同步到 destination 目录)
  • rsync -a source destination: 将会形成 destination/source 的目录结构
  • rsync -a source/ destination: 同步 source 中的所有文件到 destination 里面, 不会在 destination 中创建一个 source 文件夹
  • rsync -anv source/ destination: 模拟执行结果并查看
  • rsync -av --delete source/ destination: 删除不存在于源目录中的文件
  • rsync -av --exclude='*.txt' source/ destination: 同步时将某些文件排除在外
  • rsync -av --exclude 'dir1/*' source/ destination: 排除目录内的所有文件, 但不排除目录本身
  • rsync -av --exclude={'file1.txt','dir1/*'} source/ destination: 多个排除目录
  • rsync -av --exclude-from='exclude-file.txt' source/ destination: 使用配置文件的方式排除
  • rsync -av --include="*.txt" --exclude='*' source/ destination: 排除所有文件, 但是会同步 TXT 文件
  • rsync -av source/ username@remote_host:destination: 本地同步到远程
  • rsync -av username@remote_host:source/ destination: 远程同步到本地
  • rsync -av -e ssh source/ user@remote_host:/destination: 使用 -e ssh 指定 ssh 协议, 默认就是 ssh 协议, 因此也可以省略, 但是如果有 ssh 的参数的话必须要加上, 不能省略
  • rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination: 因为有 ssh 参数, 因此不能省略

注意, rsync 会同步以 “点” 开头的隐藏文件, 如果要排除隐藏文件, 可以这样写: --exclude=".*"

tar

命令

  • tar [option] [archived file] [-C] [local path]: 解压或打包

    • -c: 建立压缩档案, creat

    • -x: 解压, extract

    • -t: 查看内容, list

    • -r: 向压缩归档文件末尾追加文件, add/replace

    • -u: 更新原压缩包中的文件, update

      这五个是独立的命令, 压缩解压都要用到其中一个, 可以和别的命令连用但只能用其中一个. 下面的参数是根据需要在压缩或解压档案时可选的.

    • -z: 调用 gzip 来压缩归档文件, 与 -x 联用时调用 gzip 完成解压缩

    • -Z: 调用 compress 来压缩归档文件, 与 -x 联用时调用 compress 完成解压缩

    • -j: 有 bz2 属性的, 调用 bz2 来压缩归档文件

    • -v: 显示所有过程

    • -w: 每一步要求确认

    • -O: 将文件解开到标准输出

    • -f: 指定档案名, 切记, 这个参数是最后一个参数, 后面只能接档案名.

    • -k: 保存已存在的文件不覆盖

    • -m: 还原文件时, 把所有文件的修改时间设置为现在

    • -O: 将条目标准输出, 不还原到磁盘

    • -p: 恢复权限 (包括 ACL, 作者, 文件标记)

范例

  • tar -xzvf /bbs.tar.zip -C /zzz/bbs: 把根目录下的 bbs.tar.zip 解压到 / zzz/bbs 下, 前提要保证存在 / zzz/bbs 这个目录, 与 cp 不同, cp 如果不存在这个目录就会自动创建这个目录
  • tar -czvf /zzz.tar.gz./zzz: 将当前目录下的 zzz 文件打包到根目录下并命名为 zzz.tar.gz
  • tar -cf all.tar *.jpg: 这条命令是将所有.jpg 的文件打成一个名为 all.tar 的包. -c 是表示产生新的包, -f 指定包的文件名.
  • tar -rf all.tar *.gif: 这条命令是将所有.gif 的文件增加到 all.tar 的包里面去
  • tar -uf all.tar logo.gif: 这条命令是更新原来 tar 包 all.tar 中 logo.gif 文件
  • tar -tf all.tar: 这条命令是列出 all.tar 包中所有文件
  • tar -xf all.tar: 这条命令是解出 all.tar 包中所有文件
  • tar -cvf jpg.tar *.jpg: 将目录里所有 jpg 文件打包成 tar.jpg
  • tar -czf jpg.tar.gz *.jpg: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 gzip 压缩, 生成一个 gzip 压缩过的包, 命名为 jpg.tar.gz
  • tar -cjf jpg.tar.bz2 *.jpg: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 bzip2 压缩, 生成一个 bzip2 压缩过的包, 命名为 jpg.tar.bz2
  • tar -cZf jpg.tar.Z *.jpg: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 compress 压缩, 生成一个 umcompress 压缩过的包, 命名为 jpg.tar.Z

解压说明

  • *.tar 用 tar -xvf 解压
  • *.gz 用 gzip -d 或者 gunzip 解压
  • .tar.gz: 用 tar -xzf 解压
  • .tgz: 用 tar -xzf 解压
  • *.bz2: 用 bzip2 -d 或者用 bunzip2 解压
  • *.tar.bz2: 用 tar -xjf 解压
  • *.Z: 用 uncompress 解压
  • *.tar.Z: 用 tar -xZf 解压
  • *.rar: 用 unrar e 解压
  • *.zip: 用 unzip 解压

curl

curl 即 客户端 (client) 的 url 工具的意思, 主要用于调试 HTTP 请求, 运用娴熟后可替代 postman 等图形化调试工具

命令

  • curl [option] [url]

    • -A: 设置 Agent
      • curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com: 将 User-Agent 改成 Chrome 浏览器
      • curl -A '' https://google.com: 移除 Agent 头
    • -H:
      • curl -H 'User-Agent: php/1.0' https://google.com: 直接指定标头, 更改 User-Agent
    • -b: 向服务器发送 Cookie
      • curl -b 'foo=bar' https://google.com: 生成一个标头 Cookie: foo=bar, 向服务器发送一个名为 foo, 值为 bar 的 Cookie.
      • curl -b 'foo1=bar;foo2=bar2' https://google.com: 向服务器发送两个 cookie
      • curl -b cookies.txt https://www.google.com: 读取本地文件 cookies.txt, 里面是服务器设置的 Cookie(参见 - c 参数), 将其发送到服务器.
    • -c: 将服务器设置的 cookie 写入一个文件
      • curl -c cookies.txt https://www.google.com: 将服务器的 HTTP 回应所设置 Cookie 写入文本文件 cookies.txt.
    • -o: 将服务器的回应保存成文件
      • curl -o example.html https://www.example.com: 将 www.example.com 保存成 example.html
    • -O: 将服务器回应保存成文件, 并将 URL 的最后部分当作文件名.
      • curl -O https://www.example.com/foo/bar.html: 将服务器回应保存成文件, 文件名为 bar.html.

lsof

himg

  • lsof -i:8080: 查看 8080 端口占用
  • lsof abc.txt: 显示开启文件 abc.txt 的进程
  • lsof -c abc: 显示 abc 进程现在打开的文件
  • lsof -c -p 1234: 列出进程号为 1234 的进程所打开的文件
  • lsof -g gid: 显示归属 gid 的进程情况
  • lsof +d /usr/local/: 显示目录下被进程开启的文件
  • lsof +D /usr/local/: 同上, 但是会搜索目录下的目录, 时间较长
  • lsof -d 4: 显示使用 fd 为 4 的进程
  • lsof -i -U: 显示所有打开的端口和 UNIX domain 文件

wget

Linux 自带的必不可少的下载工具

命令

  • 启动参数:
    • -V: -version 显示 wget 的版本后退出
    • -h: -help 打印语法帮助
    • -b: -background 启动后转入后台执行
    • -e: -execute=COMMAND 执行.wgetrc 格式的命令, wgetrc 格式参见 /etc/wgetrc 或 ~/.wgetrc
  • 记录和输入文件参数:
    • -o, -output-file=FILE 把记录写到 FILE 文件中
    • -a, -append-output=FILE 把记录追加到 FILE 文件中
    • -d, -debug 打印调试输出
    • -q, -quiet 安静模式 (没有输出)
    • -v, -verbose 冗长模式 (这是缺省设置)
    • -nv, -non-verbose 关掉冗长模式, 但不是安静模式
    • -i, -input-file=FILE 下载在 FILE 文件中出现的 URLs
    • -F, -force-html 把输入文件当作 HTML 格式文件对待
    • -B, -base=URL 将 URL 作为在 - F -i 参数指定的文件中出现的相对链接的前缀
    • -sslcertfile=FILE 可选客户端证书
    • -sslcertkey=KEYFILE 可选客户端证书的 KEYFILE
    • -egd-file=FILE 指定 EGD socket 的文件名
  • 下载参数:
    • -bind-address=ADDRESS 指定本地使用地址 (主机名或 IP, 当本地有多个 IP 或名字时使用)
    • -t, -tries=NUMBER 设置最大尝试链接次数 (0 表示无限制).
    • -O -output-document=FILE 把文档写到 FILE 文件中
    • -nc, -no-clobber 不要覆盖存在的文件或使用.# 前缀
    • -c, -continue 接着下载没下载完的文件
    • -progress=TYPE 设置进程条标记
    • -N, -timestamping 不要重新下载文件除非比本地文件新
    • -S, -server-response 打印服务器的回应
    • -spider 不下载任何东西
    • -T, -timeout=SECONDS 设置响应超时的秒数
    • -w, -wait=SECONDS 两次尝试之间间隔 SECONDS 秒
    • -waitretry=SECONDS 在重新链接之间等待 1…SECONDS 秒
    • -random-wait 在下载之间等待 0…2*WAIT
    • -Y, -proxy=on/off 打开或关闭代理
    • -Q, -quota=NUMBER 设置下载的容量限制
    • -limit-rate=RATE 限定下载输率
  • 目录参数:
    • -nd -no-directories 不创建目录
    • -x, -force-directories 强制创建目录
    • -nH, -no-host-directories 不创建主机目录
    • -P, -directory-prefix=PREFIX 将文件保存到目录 PREFIX/…
    • -cut-dirs=NUMBER 忽略 NUMBER 层远程目录
  • HTTP 选项参数:
    • -http-user=USER 设置 HTTP 用户名为 USER.
    • -http-passwd=PASS 设置 http 密码为 PASS
    • -C, -cache=on/off 允许 / 不允许服务器端的数据缓存 (一般情况下允许)
    • -E, -html-extension 将所有 text/html 文档以. html 扩展名保存
    • -ignore-length 忽略 Content-Length 头域
    • -header=STRING 在 headers 中插入字符串 STRING
    • -proxy-user=USER 设置代理的用户名为 USER
    • -proxy-passwd=PASS 设置代理的密码为 PASS
    • -referer=URL 在 HTTP 请求中包含 Referer: URL 头
    • -s, -save-headers 保存 HTTP 头到文件
    • -U, -user-agent=AGENT 设置代理的名称为 AGENT 而不是 Wget/VERSION
    • -no-http-keep-alive 关闭 HTTP 活动链接 (永远链接)
    • -cookies=off 不使用 cookies
    • -load-cookies=FILE 在开始会话前从文件 FILE 中加载 cookie
    • -save-cookies=FILE 在会话结束后将 cookies 保存到 FILE 文件中
  • FTP 选项参数:
    • -nr, -dont-remove-listing 不移走.listing 文件
    • -g, -glob=on/off 打开或关闭文件名的 globbing 机制
    • -passive-ftp 使用被动传输模式 (缺省值).
    • -active-ftp 使用主动传输模式
    • -retr-symlinks 在递归的时候, 将链接指向文件 (而不是目录)
  • 递归下载参数:
    • -r, -recursive 递归下载--慎用!
    • -l, -level=NUMBER 最大递归深度 (inf 或 0 代表无穷)
    • -delete-after 在现在完毕后局部删除文件
    • -k, -convert-links 转换非相对链接为相对链接
    • -K, -backup-converted 在转换文件 X 之前, 将之备份为 X.orig
    • -m, -mirror 等价于 -r -N -l inf -nr
    • -p, -page-requisites 下载显示 HTML 文件的所有图片
  • 递归下载中的包含和不包含 (accept/reject):
    • -A, -accept=LIST 分号分隔的被接受扩展名的列表
    • -R, -reject=LIST 分号分隔的不被接受的扩展名的列表
    • -D, -domains=LIST 分号分隔的被接受域的列表
    • -exclude-domains=LIST 分号分隔的不被接受的域的列表
    • -follow-ftp 跟踪 HTML 文档中的 FTP 链接
    • -follow-tags=LIST 分号分隔的被跟踪的 HTML 标签的列表
    • -G, -ignore-tags=LIST 分号分隔的被忽略的 HTML 标签的列表
    • -H, -span-hosts 当递归时转到外部主机
    • -L, -relative 仅仅跟踪相对链接
    • -I, -include-directories=LIST 允许目录的列表
    • -X, -exclude-directories=LIST 不被包含目录的列表
    • -np, -no-parent 不要追溯到父目录
    • wget -S -spider url 不下载只显示过程

范例

  • wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 使用 wget 下载单个文件
  • wget -O wordpress.zip http://www.minjieren.com/download.aspx?id=1080: 下载并以不同文件名保存; wget 默认会以最后一个符合”/“ 的后面的字符来命令, 对于动态链接的下载通常文件名会不正确.
  • wget --limit-rate=300k http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 限速下载
  • wget -c http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 断点续传下载
  • wget -b http://www.minjieren.com/wordpress-3.1-zh_CN.zip: 对大文件进行后台下载 (使用 tail -f wget-log 可查看下载进度及速度)
  • wget --spider URL: 测试下载速度
  • wget -i filelist.txt: 下载 filelist.txt 文件中的多个链接文件
  • wget --mirror -p --convert-links -P./LOCAL URL: 使用 wget –mirror 镜像网站
    • –miror: 开户镜像下载
    • -p: 下载所有为了 html 页面显示正常的文件
    • –convert-links: 下载后, 转换成本地的链接
    • -P./LOCAL: 保存所有文件和目录到本地指定目录
  • wget --reject=gif url: 下载整个网站, 但是不下载 gif 图片
  • wget -o download.log URL: 将下载信息存入日志文件
  • wget -Q5m -i filelist.txt: 当下载文件大小大于 5m 时退出下载
  • wget -r -A.pdf url: 下载指定格式的文件

date

date 是 Linux 系统里自带的一个系统命令, 用来显示当前的系统时间, 通过控制格式输出可以得到我们需要的时间字符串

  • %%: 一个文字的 %
  • %a: 当前 locale 的星期名缩写 (例如: 日, 代表星期日)
  • %A: 当前 locale 的星期名全称 (如: 星期日)
  • %b: 当前 locale 的月名缩写 (如: 一, 代表一月)
  • %B: 当前 locale 的月名全称 (如: 一月)
  • %c: 当前 locale 的日期和时间 (如: 2005 年 3 月 3 日 星期四 23:05:25)
  • %C: 世纪; 比如 %Y, 通常为省略当前年份的后两位数字 (例如: 20)
  • %d: 按月计的日期 (例如: 01)
  • %D: 按月计的日期; 等于 %m/%d/%y
  • %e: 按月计的日期, 添加空格, 等于 %_d
  • %F: 完整日期格式, 等价于 %Y-%m-%d
  • %g: ISO-8601 格式年份的最后两位 (参见 %G)
  • %G: ISO-8601 格式年份 (参见 %V), 一般只和 %V 结合使用
  • %h: 等于 %b
  • %H: 小时 (00-23)
  • %I: 小时 (00-12)
  • %c: 按年计的日期 (001-366)
  • %k: 时 (0-23)
  • %l: 时 (1-12)
  • %m: 月份 (01-12)
  • %M: 分 (00-59)
  • %n: 换行
  • %N: 纳秒 (000000000-999999999)
  • %p: 当前 locale 下的 “上午” 或者 “下午”, 未知时输出为空
  • %P: 与 %p 类似, 但是输出小写字母
  • %r: 当前 locale 下的 12 小时时钟时间 (如: 11:11:04 下午)
  • %R: 24 小时时间的时和分, 等价于 %H:%M
  • %s: 自 UTC 时间 1970-01-01 00:00:00 以来所经过的秒数
  • %S: 秒 (00-60)
  • %t: 输出制表符 Tab
  • %T: 时间, 等于 %H:%M:%S
  • %u: 星期, 1 代表星期一
  • %U: 一年中的第几周, 以周日为每星期第一天 (00-53)
  • %V: ISO-8601 格式规范下的一年中第几周, 以周一为每星期第一天 (01-53)
  • %w: 一星期中的第几日 (0-6), 0 代表周一
  • %W: 一年中的第几周, 以周一为每星期第一天 (00-53)
  • %x: 当前 locale 下的日期描述 (如: 12/31/99)
  • %X: 当前 locale 下的时间描述 (如: 23:13:48)
  • %y: 年份最后两位数码 (00-99)
  • %Y: 年份
  • %z +hhmm: 数字时区 (例如, -0400)
  • %:z +hh:mm: 数字时区 (例如, -04:00)
  • %::z +hh:mm:ss: 数字时区 (例如, -04:00:00)
  • %:::z: 数字时区带有必要的精度 (例如, -04, +05:30)
  • %Z: 按字母表排序的时区缩写 (例如, EDT)

默认情况下, 日期的数字区域以 0 填充.
以下可选标记可以跟在 % 后:

  • -: (连字符) 不填充该域
  • _: (下划线) 以空格填充
  • 0: (数字 0) 以 0 填充
  • ^: 如果可能, 使用大写字母
  • #: 如果可能, 使用相反的大小写

在任何标记之后还允许一个可选的域宽度指定, 它是一个十进制数字. 作为一个可选的修饰声明, 它可以是 E, 在可能的情况下使用本地环境关联的 表示方式; 或者是 O, 在可能的情况下使用本地环境关联的数字符号.

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ date "+%Y-%m-%d"
2013-02-19
$ date "+%H:%M:%S"
13:13:59
$ date "+%Y-%m-%d %H:%M:%S"
2013-02-19 13:14:19
$ date "+%Y_%m_%d %H:%M:%S"
2013_02_19 13:14:58
$ date -d today
Tue Feb 19 13:10:38 CST 2013
$ date -d now
Tue Feb 19 13:10:43 CST 2013
$ date -d tomorrow
Wed Feb 20 13:11:06 CST 2013
$ date -d yesterday
Mon Feb 18 13:11:58 CST 2013

top

top 命令是 linux 的性能分析工具, 能实时显示系统的资源占用情况, Mac 下的 top 与 Linux 下的 top 使用方式有所不同, 这里仅记录下 Linux 下 top 命令的使用

界面解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ top

top - 19:02:28 up 2:22, 1 user, load average: 0.00, 0.01, 0.02
Tasks: 277 total, 1 running, 276 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.9 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.1 hi, 0.1 si, 0.0 st
MiB Mem: 7807.3 total, 5265.6 free, 1285.3 used, 1256.4 buff/cache
MiB Swap: 2016.0 total, 2016.0 free, 0.0 used. 6259.5 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11166 hanley 20 0 306196 54624 16036 S 1.0 0.7 0:49.53 Xorg
1505 dbus 20 0 90748 7584 4368 S 0.3 0.1 0:24.50 dbus-daemon
1510 root 20 0 381404 8276 5376 S 0.3 0.1 0:06.27 rngd
2086 root 20 0 1129944 46620 21360 S 0.3 0.6 0:11.45 containerd
11294 hanley 20 0 2689256 170932 62564 S 0.3 2.1 0:39.83 gnome-shell
11797 hanley 20 0 651800 39868 28444 S 0.3 0.5 0:10.27 gnome-terminal-
11835 hanley 20 0 727700 27720 20496 S 0.3 0.3 0:26.27 prlcc
12124 root 20 0 388144 13776 11700 S 0.3 0.2 0:03.05 abrt-dbus
25861 hanley 20 0 64036 5048 4132 R 0.3 0.1 0:17.73 top
1 root 20 0 246080 15172 8968 S 0.0 0.2 0:03.70 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/0
10 root 20 0 0 0 0 I 0.0 0.0 0:03.41 rcu_sched
  • up: 自开机至现在的运行时间
  • user: 多少个用户在占用系统资源
  • load average: 1 分钟, 5 分钟, 15 分钟的负载情况
  • Tasks: 说明现在一共有 277 个进程, 其中处于运行的有一个, 276 个处于休眠状态 ( sleeping ), 0 个处于 stopped 状态, 零个处于僵尸状态 ( zombie )
  • %Cpu(s): cpu 状态信息
    • 0.8% us — 用户空间占用 CPU 的百分比.
    • 0.9% sy — 内核空间占用 CPU 的百分比.
    • 0.0% ni — 改变过优先级的进程占用 CPU 的百分比
    • 98.2 % id — 空闲 CPU 百分比
    • 0.0% wa — IO 等待占用 CPU 的百分比
    • 0.1% hi — 硬中断 (Hardware IRQ) 占用 CPU 的百分比
    • 0.0% si — 软中断 (Software Interrupts) 占用 CPU 的百分比
  • MiB Mem: 内存状态
    • 7807.3 MB total — 物理内存总量
    • 5265.6 free — 空闲内存总量
    • 1285.3 used — 使用中的内存总量
    • 1256.4 buff/cache — 缓存的内存量
  • Mid Swap: 交换分区信息
    2016.0 total — 交换区总量
    2016.0 free — 空闲交换区总量
    0.0 used — 使用的交换区总量
    6259.5 cached — 缓冲的交换区总量
  • 任务属性
    • PID: 进程 id
    • USER: 进程所有者
    • PR: 进程优先级
    • NI: nice 值. 负值表示高优先级, 正值表示低优先级
    • VIRT: 进程使用的虚拟内存总量, 单位 kb. VIRT=SWAP+RES
    • RES: 进程使用的, 未被换出的物理内存大小, 单位 kb. RES=CODE+DATA
    • SHR: 共享内存大小, 单位 kb
    • S: 进程状态. D = 不可中断的睡眠状态 R = 运行 S = 睡眠 T = 跟踪 / 停止 Z = 僵尸进程
    • %CPU: 上次更新到现在的 CPU 时间占用百分比
    • %MEM: 进程使用的物理内存百分比
    • TIME+: 进程使用的 CPU 时间总计, 单位 1/100 秒
    • COMMAND: 进程名称 (命令名 / 命令行)

命令

  • top: 进入资源监控默认页面, 页面显示如上

  • top -c: 显示完整命令

  • top -b: 以批处理模式显示程序信息

  • top -S: 已累计模式显示信息

  • top -d 3: 设置信息更新时间, 表示更新周期为三秒

  • top -n 2: 设置信息更新次数, 表示更新两次后终止更新显示

  • top -p 574: 显示指定的进程信息

  • top 基本视图操作

    • 1: 监控多个核心的各自状态
    • b: 以行背景高亮显示 running 的进程
    • y: 以行前景高亮显示 running 的进程
    • x: 以行背景高亮模式显示当前排序列及当前 running 的进程
    • < / >: 切换当前排序列
    • h: 显示帮助画面, 给出一些简短的命令总结说明
    • k: 终止一个进程.
    • i: 忽略闲置和僵死进程. 这是一个开关式命令.
    • q: 退出程序
    • r: 重新安排一个进程的优先级别
    • S: 切换到累计模式
    • s: 改变两次刷新之间的延迟时间 (单位为 s), 如果有小数, 就换算成 m s. 输入 0 值则系统将不断刷新, 默认值是 5 s
    • f / F: 从当前显示中添加或者删除项目
    • o / O: 改变显示项目的顺序
    • l: 切换显示平均负载和启动时间信息
    • m: 切换显示内存信息
    • t: 切换显示进程和 CPU 状态信息
    • c: 切换显示命令名称和完整命令行
    • M: 根据驻留内存大小进行排序
    • P: 根据 CPU 使用百分比大小进行排序
    • T: 根据时间 / 累计时间进行排序
    • W: 将当前设置写入 ~/.toprc 文件中

htop

一款跨平台的且界面更加友好的系统监控工具

安装

1
2
3
brew install htop
# 或
yum -y install htop

命令

参数
  • -C --no-color 使用单色配色方案
  • -d --delay=DELAY 设置更新之间的延迟, 在十秒
  • -s --sort-key=COLUMN 纵列排序 (try –sort-key=help for a list)
  • -u --user=USERNAME 只显示一个指定用户的进程
  • -p --pid=PID,[,PID,PID...] 只显示给用户
  • -h --help 打印此命令帮助
  • -v --version 打印版本信息
交互式选项
  • h,? F1: 查看 htop 使用说明

  • S F2: 设置

  • / F3: 搜索进程

  • \ F4: 过滤器, 按关键字搜索

  • t F5: 显示树形结构

  • <,> F6: 选择排序方式

  • [ F7: 减少 nice 值, 这样就可以提高对应进程的优先级

  • ] F8: 增加 nice 值, 这样可以降低对应进程的优先级

  • k F9: 杀掉选中的进程

  • q F10: 退出 htop

  • I: 倒转排序顺序

  • M: 按内存占用排序

  • P: 按 CPU 排序

  • T: 按运行时间排序

  • U: 取消标记所有的进程

  • K: 显示 / 隐藏内核线程

  • l: 显示进程打开的文件: 如果安装了 lsof, 按此键可以显示进程所打开的文件

  • u: 显示所有用户, 并可以选择某一特定用户的进程

  • s: 将调用 strace 追踪进程的系统调用

  • H: 显示 / 隐藏用户线程

  • 上下键 /PgUP/PgDn: 移动选中进程

  • 左右键 /Home/End: 移动列表

  • Space(空格): 标记 / 取消标记一个进程. 命令可以作用于多个进程, 例如 “kill”, 将应用于所有已标记的进程

gnu-pg(gpg)

安装

1
brew install gnupg

参数名解释

1
2
3
4
5
6
7
8
$ gpg --list-keys
/Users/hanley/.gnupg/pubring.kbx
--------------------------------
pub rsa4096 2021-04-25 [SC] [expires: 2026-04-24]
EE0B1C08022915F6BC8DF154CC667B059A063C83
uid [ultimate] hanleylee (HanleyLee) <hanley.lei@gmail.com>
sub rsa4096 2021-04-25 [E] [expires: 2026-04-24]

  • 第一行: 公钥文件名 pubring.kbx
  • 第二行: 公钥特征 (key ID 为 EE0B1C08022915F6BC8DF154CC667B059A063C83 (可简写为 CC667B059A063C83 ), 可以替代 user ID 使用)
  • 第三行: 用户名 ( user ID ) hanleylee (HanleyLee) <hanley.lei@gmail.com>
  • 第四行: 私钥特征

命令

  • gpg --help
  • gpg --gen-key: 生成密钥
  • gpg --list-keys: 列出本地所有信任的 key
  • gpg --list-secret-keys: 列出所有本地的 private key
  • gpg --gen-revoke [user ID]: 生成一张”撤销证书”, 以备以后密钥作废时, 可以请求外部的公钥服务器撤销你的公钥.
  • gpg --delete-key [user ID]: 删除某个密钥
  • gpg -a --export BAADF00D > publickey.txt: 导出所有公钥
  • gpg --export-secret-keys [user ID] > private.key: 将私钥导出至一个本地文件中, 然后 copy 到其他电脑上, 并 gpg --import private.key
  • gpg --import [key file]: 将他人的公钥或自己的其他私钥导入到本地
  • gpg --armor --output public-key.txt --export [user ID]: 公钥文件 ~/.gnupg/pubring.kbx 以二进制形式储存, armor 参数可以将其转换为 ASCII 码显示.
  • gpg --armor --output private-key.txt --export-secret-keys [user ID]: 私钥文件 ~/.gnupg/pubring.kbx~ 以二进制形式储存, armor 参数可以将其转换为 ASCII 码显示.
  • gpg --send-keys [user ID] --keyserver hkp://subkeys.pgp.net: 传输公钥到服务器 subkeys.pgp.net, 然后通过交换机制, 所有的公钥服务器最终都会包含你的公钥
  • gpg --fingerprint [user ID]: 由于公钥服务器没有检查机制, 任何人都可以用你的名义上传公钥, 所以没有办法保证服务器上的公钥的可靠性. 通常, 你可以在网站上公布一个公钥指纹, 让其他人核对下载到的公钥是否为真.
  • gpg --search-keys [user ID]: 为了获得他人的公钥, 可以让对方直接发给你文件, 然后用 gpg --import [key file] 进行导入, 也可以直接在公钥服务器上寻找.
  • gpg --keyserver https://hkps.pool.sks-keyservers.net --search-keys [用户 ID]: 同上, 可以指定服务器. 默认使用位于 ~/.gnupg/dirmngr.conf 中的配置, 默认值为 https://hkps.pool.sks-keyservers.net
  • gpg --receive-keys [user ID]: 接受服务器上的 public key
  • gpg --sign-key 4AEE18F83AFDEB23: 当我们 importreceive-keys 后需要使用自己的私钥对该公钥进行签名信任
  • gpg --recipient [用户 ID] --output demo.en.txt --encrypt demo.txt: recipient 参数指定接收者的公钥, output 参数指定加密后的文件名, encrypt 参数指定源文件, demo.en.txt 就是已加密的文件, 可以把它发给对方.
  • gpg --decrypt demo.en.txt --output demo.de.txt: decrypt 参数指定需要解密的文件, output 参数指定解密后生成的文件. 运行上面的命令, demo.de.txt 就是解密后的文件.
  • gpg demo.en.txt: GPG 允许省略 decrypt 参数, 运行上面的命令以后, 解密后的文件内容直接显示在标准输出.
  • gpg --sign demo.txt: 有时, 我们不需要加密文件, 只需要对文件签名, 表示这个文件确实是我本人发出的. sign 参数用来签名.
  • gpg --verify demo.txt.asc demo.txt: 我们收到别人签名后的文件, 需要用对方的公钥验证签名是否为真. verify 参数用来验证.

revoke gpg key

1
2
3
4
5
gpg --list-keys
gpg --output revoke.asc --gen-revoke key-ID
gpg --import revoke.asc # 也可以直接从 ~/.gnupg/openpgp-revocs.d/ 的.rev 文件中 导入 (需要编辑并解除注释)
gpg --keyserver pgp.mit.edu --search-keys key-ID
gpg --keyserver pgp.mit.edu --send-keys key-ID

GitHub 上使用 GPG

1
2
3
4
5
6
7
8
gpg --armor --export CC667B059A063C83 # 导出公钥的 ascii 码到终端中, 将输出结果拷贝到 GitHub 页面中
git config --global user.signingkey CC667B059A063C83 # 指定 git 对 commit 进行签名所用的 gpg key
git config --global commit.gpgsign true # 设置每次都自动使用 gpg 进行 sign, 否则的话需要使用 git commit -S 来启用签名
echo "export GPG_TTY=$(tty)" >> ~/.zshrc # 需要设置, 不设置可能会在 commit 时报错
git log --show-signature # 查看所有 commit 的 signature 情况
curl https://github.com/web-flow.gpg | gpg --import # 将 GitHub 的 public key 导入到本地
gpg --sign-key 4AEE18F83AFDEB23 # 使用自己的私钥对该公钥进行签名信任
gpg --edit-key DEADBEEF trust # 在使用 `git log --show-signature` 时有时会提示别人的证书未经信任, 这时可以使用本方式信任

git 提交使用 gpg 后每次都需要输入密钥的密码

  1. 修改默认缓存时间

    1
    2
    3
    # gpg-agent.conf
    max-cache-ttl 60480000
    default-cache-ttl 60480000
  2. 使用 pinentry-program, mac 下的 pinentry-mac 支持保存密码

    1
    2
    3
    brew install pinentry-mac
    # gpg-agent.conf
    pinentry-program /usr/local/bin/pinentry-mac

on-my-zsh

安装

1
2
3
4
5
6
7
8
// 1. 通过 wget 安装: wget 用来从指定的 URL 下载文件
sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

// 2. 通过 curl 安装: curl 通过发出网络请求来获得并提取数据
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

// 3. 通过 git 下载
git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh

oh-my-zsh 自带插件

由于 oh-my-zsh 自带插件在安装时已经放入了 ~/.oh-my-zsh/plugins 文件夹中, 因此只需要在 .zshrc 的 plugins 中填入相应名称即可设置开启

目录跳转 z
  1. 安装

    1
    2
    3
    plugins=(
    z
    )
  2. 使用

    • -c: 在当前目录下进行子目录匹配
    • -e: echo 最合适的匹配和对应的 rank, 但是不执行 cd 操作
    • -h: 显示帮助信息
    • -l: echo 所有匹配的目录和对应的 rank, 但是不执行 cd 操作
    • -r: 进入所匹配目录列表中 rank 值最高的那个目录
    • -t: 进入所匹配目录列表中最近访问的那个目录
    • -x: 在. z 缓存中清除当前目录的记录
last-working-dir
  1. 安装

    1
    2
    3
    plugins=(
    last-working-dir
    )
osx
  1. 安装

    1
    2
    3
    plugins=(
    osx
    )
  2. 使用

    • cdf: 在终端中跳转到当前 finder 目录
    • o/fd: 在 finder 中打开当前 Terminal 目录
    • pfd: print 出当前 finder 目录
    • tab: 在终端中新建一个 tab, 打开当前 finder 目录
    • pfs: Return the current Finder selection
    • pushdf: pushd to the current Finder directory
    • quick-look: Quick-Look a specified file
    • man-preview: Open a specified man page in Preview app
    • showfiles: Show hidden files
    • hidefiles: Hide the hidden files

虽然插件名叫 oxs, 但是在 linux 系统下也是可以让终端与其文件管理系统互动的

vi-mode

  1. 安装

    1
    2
    3
    plugins=(
    vi-mode
    )
  2. 使用

    • : 进入 vimnormal 模式

    • (或 C-P ): 前一个历史命令

    • (或 C-N ): 后一个历史命令

    • /: 向后查找历史命令

    • ?: 向前查找历史命令

    • n: 向后重复

    • N: 向前重复

    • v: 将当前命令在 vim 中进行编辑 (只适用于大段命令)

      其他的移动插入删除等操作与 vim 操作一致

自动补全 zsh-autosuggestions

himg

官网

自动补全效果 (灰色部分), 默认使用方向键 ➡️以补全内容

安装

1
2
3
4
5
6
7
8
9
// 1. 下载
git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

// 2. 编辑. zshrc 文件
plugins=(zsh-autosuggestions)
bindkey ',' autosuggest-accept

// 3. 更新配置文件或者重启 iterm
source ~/.zshrc

使用

使用逗号 , 快捷键自动补全

命令行高亮 zsh-syntax-highlighting

himg

安装

1
2
3
4
5
6
7
8
// 1. 克隆插件的远程仓库到本地 oh-my-zsh 配置集合中
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting

// 2. 编辑.zshrc 文件使 soure 指向插件仓库地址
echo "source ${(q-)PWD}/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> ${ZDOTDIR:-$HOME}/.zshrc

// 3. 更新配置文件或者重启 iterm
source ~/.zshrc

自定义加粗高亮

默认情况下的错误语法颜色被设为红色加粗, 正确语法为绿色普通. 可以对 main 文件进行修改已达到对各种语法颜色的匹配.

himg

Trash

移动文件 (夹) 到回收站

安装

1
npm install trash

使用

1
trash <filename>

考虑方便起见可以将 rm 作为其别名, 在 .zshrc 中设置

1
alias rm='trash'

lsd

显示文件夹与文件区别, 并显示文件类型图标

前排提示, 此插件的图标显示是基于字体, 必须更改为合适字体才能正常显示图标. 为此我专门将三种字体拟合为一个字体, 需要的话可以去我的 GitHub 仓库进行下载.

himg

官网

安装

1
brew install lsd

常用命令

  • lsd: 显示文件列表

    • --help: 显示帮助信息
    • -l: --long 将每个文件作为一行显示, 列出每个文件的属性信息
    • -1: --oneline, 每个文件作为一行显示, 但是不列出每个文件的属性信息
    • -a: --all, 不忽略任何文件, 包括隐藏文件及 ...
    • -A: --almost-all, 不忽略隐藏文件, 但是忽略 ...
    • --classic: 使用经典模式, 不显示图标与颜色
    • -d, --directory-only, 只显示当前路径下的文件夹, 不显示文件
    • -h: --human-readable, 兼容需要, 默认开启
    • -i: --inode 为每个文件显示 inode 号
    • -R: --recursive, 为每个文件夹进行递归
    • -r: --reverse, 翻转顺序
    • -S: --sizesort, 按照文件大小进行排序
    • -t: --timesort, 按照文件修改时间进行排序
    • --total-size: 显示目录的总大小
    • --tree: 递归地以树形显示目录结构
      --depth <num>: 显示树形结构的深度
    • --no-symlink: 不显示连接符号
    • -V: --version, 显示 lsd 版本信息

方便起见可以在 .zshrc 中绑定 alias

1
alias l='lsd -Alhit'

fzf

fzf 是终端的一款文件及路径模糊查找工具, 其原理是把其他工具的计算结果作为其输入然后展示给用户, 用户在其界面中可进行模糊查找

himg

安装

1
brew install fzf

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
export FZF_DEFAULT_COMMAND="fd --hidden --follow -I --exclude={Pods,.git,.idea,.sass-cache,node_modules,build} --type f"
export FZF_DEFAULT_OPTS="
--color=dark
--color=fg:#707a8c,bg:-1,hl:#3e9831,fg+:#cbccc6,bg+:#434c5e,hl+:#5fff87
--color=info:#af87ff,prompt:#5fff87,pointer:#ff87d7,marker:#ff87d7,spinner:#ff87d7
--height 60%
--layout reverse
--preview-window 'hidden:right:60%'
--preview '(highlight -O ansi -l {} 2> /dev/null || cat {} || tree -N -C {}) 2> /dev/null | head -500'
--bind ',:toggle-preview'
--border
--cycle
"
export FZF_CTRL_T_COMMAND=$FZF_DEFAULT_COMMAND
export FZF_CTRL_T_OPTS=$FZF_DEFAULT_OPTS
export FZF_CTRL_R_OPTS="
--layout=reverse
--sort
--exact
--preview 'echo {}'
--preview-window down:3:hidden:wrap
--bind ',:toggle-preview'
--cycle
"

export FZF_ALT_C_OPTS="--preview 'tree -N -C {} | head -500'"
export FZF_TMUX_OPTS="-d 60%"
export FZF_COMPLETION_TRIGGER='**'

常用操作

  • <C-T>: 查找当前路径下的所有文件, 可以在路径输入中途进行查找, 这时与输入 ** 然后 <TAB> 效果是相同的
  • <C-R>: 搜索历史命令并执行
  • <C-N>: 选择下一个匹配项
  • <C-P>: 选择上一个匹配项

搜索技巧

通常我们在其中输入关键字即可查找, 不过也支持一定级别的正则方式进行查找

  • ^music: 以 music 开头
  • mp3$: 以 mp3 结尾
  • 'word: 严格匹配
  • !word: 不包含 word
  • !.mp3$: 不以.mp3 结尾

fzf 可以与很多其他终端工具进行组合, 让你使用的更加顺手高效. 具体实例可参考 官方教程

speedtest-cli

安装

1
pip3 install speedtest-cli

常用命令

下列命令中的 speedtest 也可以使用 speedtest-cli 代替

  • speedtest -h: 显示帮助
  • speedtest: 使用距离所使用的网络提供商距离最近的服务器节点进行测速 (e.g. 如果当前使用了香港的全局代理, 那么将使用香港的节点进行测速)
  • speedtest --list: 列出 speedtest 所支持的所有服务器列表
  • speedtest --list | grep China: 在所有的 spedtest 支持的服务器列表列表中筛选出含有 China 关键字的
  • speedtest --server <server id>: 使用上一步列出的节点的 id 进行测速
  • speedtest --share: 分享测速结果
  • speedtest --no-download: 不测试下载速度
  • speedtest --no-upload: 不测试上传速度
  • speedtest --secure: 使用 https 进行测速
  • speedtest --bytes: 使用字节测速 (不作用于分享功能)
  • speedtest --json: 使用 json 格式输出结果
  • speedtest --csv: 使用 csv 格式输出结果

tree

显示路径的树形结构

安装

1
brew install tree

常用命令

  • tree: 显示当前路径下的树形结构
    • -a: 显示所有文件和目录.
    • -A: 使用 ASNI 绘图字符显示树状图而非以 ASCII 字符组合.
    • -C: 在文件和目录清单加上色彩, 便于区分各种类型.
    • -d: 显示目录名称而非内容.
    • -D: 列出文件或目录的更改时间.
    • -f: 在每个文件或目录之前, 显示完整的相对路径名称.
    • -F: 根据 ls -F, 为目录添加一个 /, 为套接字文件添加一个 =, 为可执行文件添加一个 *, 为 FIFO 添加一个 |
    • -g: 列出文件或目录的所属群组名称, 没有对应的名称时, 则显示群组识别码.
    • -i: 不以阶梯状列出文件或目录名称.
    • -I: 不显示符合范本样式的文件或目录名称.
    • -l: 跟随目录的符号链接, 就像它们是目录一样. 避免了导致递归循环的链接
    • -n: 不在文件和目录清单加上色彩.
    • -N: 按原样打印不可打印的字符.
    • -p: 列出权限标示.
    • -P: 只显示符合范本样式的文件或目录名称.
    • -q: 将文件名中的不可打印字符作为问号打印.
    • -s: 列出文件或目录大小.
    • -t: 用文件和目录的更改时间排序.
    • -u: 列出文件或目录的拥有者名称, 没有对应的名称时, 则显示用户识别码.
    • -x: 将范围局限在现行的文件系统中, 若指定目录下的某些子目录, 其存放于另一个文件系统上, 则将该子目录予以排除在寻找范围外.

browser-sync

建立本地服务器, 使 html 等网页文件可实时刷新

安装

1
npm install -g browser-sync

常用命令

  • browser-sync start --server --files.: 自动寻找当前目录下的 index.html 文件, 并建立本地服务器进行动态更新
  • browser-sync start --server --files "css/*.css": 寻找 .css 文件并建立本地服务器进行动态更新

yarn

yarn global add @vue/cli: 全局安装某包
yarn global remove vue-cli: 全局删除某包

node 版本管理器 - nvm

nvm 可用来安装 nodejs, 管理多版本的 nodejs. 任意切换版本, 查看当前版本, 查看远端所有可用版本

himg

安装

  1. 使用 Homebrew 进行安装

    1
    brew install nvm
  2. 在环境中定位 nvm 安装位置以使 nvm 命令可用 (同时也是将 node 的路径添加到环境路径 path 的第一位)

    .zshrc 中添加 source $(brew --prefix nvm)/nvm.sh

命令

  • nvm --version: 查看当前 nvm 版本
  • node -v: 查看当前 node 版本
  • nvm ls: 查看已经安装的版本
  • nvm ls-remote: 查看远端可安装的 node 版本
  • nvm install v6.11.4: 安装 6.11.4 版本
  • nvm use v6.11.4: 切换到 6.11.4 版本
  • nvm alias default v6.11.4: 使用 6.11.4 作为默认版本
  • nvm current: 显示当前正在使用的 node 版本

卸载 nvm

如果没有多版本管理 node 的需求的话, 那么使用 Homebrew 安装的 node 已经足够了

  1. 使用 Homebrew 卸载

    1
    brew uninstall nvm
  2. ~/.zshrc 文件中删除关于 nvm 的配置

卸载时可能遇到的问题:

  • 明明将 nvm 删除了, 正在使用 Homebrew 提供的 node, 但是通过 npm install 安装的包全部仍然被放到 nvm 的相关文件夹

    1
    2
    3
    4
    5
    $ npm install hexo-cli hexo-server -g
    /usr/local/opt/nvm/versions/node/v13.5.0/bin/hexo -> /usr/local/opt/nvm/versions/node/v13.5.0/lib/node_modules/hexo-cli/bin/hexo
    + hexo-cli@3.1.0
    + hexo-server@1.0.0
    added 132 packages from 349 contributors in 26.705s

    此时, 应该是 npm 被配置了 prefix, 这时需要删除 npm 被配置的 prefix, 使用命令 npm config delete prefix 即可

包管理器 - npm

npm 是和 Node.js 一起发布的, 只要安装了 Node.js, npm 也安装好了, 可以在安装完 nodejs 后使用 npm -v 查看当前 npm 版本

命令

  • npm install npm -g: 全局更新最新版本 npm, 由于 npm 更新频率比 nodejs 要快得多, 因此此命令很有用, 在此单独列出
  • npm install: 根据当前路径下的 package.json 文件安装相关依赖
  • npm install <module name>: 在当前路径下安装模块
  • npm install <module name> --save: 安装模块到当前路径, 并将依赖写入 dependencies, 运行 npm install 初始化项目时会将模块下载到项目目录中
  • npm install <module name> --g: 全局安装模块, 如果不加 g 只会针对当前路径安装, 在其他路径下不起作用
  • npm install -g: 升级全局的本地包
  • npm ls: 显示所有已安装的 package
  • npm outdated -g --depth=0: 显示所有的待更新的模块
  • npm update: 更新当前路径下所有模块
  • npm update -g: 全局更新
  • npm uninstall <module name>: 在当前路径下卸载模块
  • npm uninstall <module name> --save: 全局卸载模块
  • npm bin -g: 打印全局下 node 包管理器的环境位置, 如果环境位置未在 .zshrc 中列出的话会进行注明, 同时需要在环境中使用 export PATH="/usr/local/opt/nvm/versions/node/v13.5.0/bin:$PATH" 以将其位置加入环境中

模拟器安装 Linux 系统

使用 Parallels Desktop 在 Mac 中安装 centos 系统.

安装 Parallels Tools

如要使 Mac 与安装在虚拟机中的 centos 的文件互通, 剪贴板互通, 则需要在 Mac 与 centos 中都安装 Parallels Tools, Mac 中的安装极其简单, 主要记录下 centos 中的安装

  1. 安装必要依赖

    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

    1
    2
    dnf update -y && yum install epel-release -y
    dnf install checkpolicy elfutils-libelf-devel gcc kernel-devel-4.18.0-147.el8.x86_64 make perl selinux-policy-devel dkms -y
  2. 按下模拟器最右上角的感叹号, 根据提示加载镜像

  3. 将镜像中的文件拷贝出

    1
    2
    mkdir /media/cdrom
    mount -o exec /dev/cdrom /media/cdrom
  4. 安装

    1
    2
    cd /media/cdrom
    ./install
  5. 重启

常用命令含义

  • su: Swith user 切换用户, 切换到 root 用户
  • cat: Concatenate 串联
  • uname: Unix name 系统名称
  • df: Disk free 空余硬盘
  • du: Disk usage 硬盘使用率
  • chown: Change owner 改变所有者
  • chgrp: Change group 改变用户组
  • ps: Process Status 进程状态
  • tar: Tape archive 解压文件
  • chmod: Change mode 改变模式
  • umount: Unmount 卸载
  • ldd: List dynamic dependencies 列出动态相依
  • insmod: Install module 安装模块
  • rmmod: Remove module 删除模块
  • lsmod: List module 列表模块
  • alias:Create your own name for a command
  • bash:GNU Bourne-Again Shell linux 内核
  • grep:global regular expression print
  • httpd:Start Apache
  • ipcalc:Calculate IP information for a host
  • ping: Send ICMP ECHO_Request to network hosts
  • reboot: Restart your computer
  • sudo:Superuser do
  • pwd: print working Directory (打印工作目录).
  • FIFO: First In, First Out
  • GRUB: GRand Unified Bootloader
  • IFS: Internal Field Seperators
  • LILO: LInux LOader
  • MySQL: My 最初作者的名字 SQL: Structured Query Language
  • PHP: Personal Home Page Tools: PHP Hypertext Preprocessor
  • PS: Prompt String
  • Perl: “Pratical Extraction and Report Language”: “Pathologically Eclectic Rubbish Lister”
  • Tcl: Tool Command Language
  • Tk: ToolKit
  • VT: Video Terminal
  • YaST: Yet Another Setup Tool
  • apache: “a patchy” server
  • apt: Advanced Packaging Tool
  • ar: archiver
  • as: assembler
  • bash: Bourne Again SHell
  • bc: Basic (Better) Calculator
  • bg: BackGround
  • cal: CALendar
  • cat: CATenate
  • cd: Change Directory
  • chgrp: CHange GRouP
  • chmod: CHange MODe
  • chown: CHange OWNer
  • chsh: CHange SHell
  • cmp: compare
  • cobra: Common Object Request Broker Architecture
  • comm: common
  • cp: CoPy
  • cpio: CoPy In and Out
  • cpp: C Pre Processor
  • cups: Common Unix Printing System
  • cvs: Current Version System
  • daemon: Disk And Execution MONitor
  • dc: Desk Calculator
  • dd: Disk Dump
  • df: Disk Free
  • diff: DIFFerence
  • dmesg: diagnostic message
  • du: Disk Usage
  • ed: editor
  • egrep: Extended GREP
  • elf: Extensible Linking Format
  • elm: ELectronic Mail
  • emacs: Editor MACroS
  • eval: EVALuate
  • ex: EXtended
  • exec: EXECute
  • fd: file descriptors
  • fg: ForeGround
  • fgrep: Fixed GREP
  • fmt: format
  • fsck: File System ChecK
  • fstab: FileSystem TABle
  • fvwm: F*** Virtual Window Manager
  • gawk: GNU AWK
  • gpg: GNU Privacy Guard
  • groff: GNU troff
  • hal: Hardware Abstraction Layer
  • joe: Joe’s Own Editor
  • ksh: Korn SHell
  • lame: Lame Ain’t an MP3 Encoder
  • lex: LEXical analyser
  • lisp: LISt Processing: Lots of Irritating Superfluous Parentheses
  • ln: LiNk
  • lpr: Line PRint
  • ls: list
  • lsof: LiSt Open Files
  • m4: Macro processor Version 4
  • man: MANual pages
  • mawk: Mike Brennan’s AWK
  • mc: Midnight Commander
  • mkfs: MaKe FileSystem
  • mknod: MaKe NODe
  • motd: Message of The Day
  • mozilla: MOsaic GodZILLa
  • mtab: Mount TABle
  • mv: MoVe
  • nano: Nano’s ANOther editor
  • nawk: New AWK
  • nl: Number of Lines
  • nm: names
  • nohup: No HangUP
  • nroff: New ROFF
  • od: Octal Dump
  • passwd: PASSWorD
  • pg: pager
  • pico: PIne’s message COmposition editor
  • pine: “Program for Internet News & Email”: “Pine is not Elm”
  • ping: Packet InterNet Grouper
  • pirntcap: PRINTer CAPability
  • popd: 发布 P Directory
  • pr: pre
  • printf: PRINT Formatted
  • ps: Processes Status
  • pty: pseudo tty
  • pushd: PUSH Directory
  • pwd: Print Working Directory
  • rc: runcom: run command, shell
  • rev: REVerse
  • rm: ReMove
  • rn: Read News
  • roff: RunOFF
  • rpm: RPM Package Manager: RedHat Package Manager
  • rsh, rlogin,: Remote
  • rxvt: ouR XVT
  • sed: Stream EDitor
  • seq: SEQuence
  • shar: SHell Archive
  • slrn: S-Lang rn
  • ssh: Secure SHell
  • ssl: Secure Sockets Layer
  • stty: Set TTY
  • su: Substitute User
  • svn: SubVersioN
  • tar: Tape Archive
  • tcsh: TENEX C shell
  • telnet: TEminaL over Network
  • termcap: terminal capability
  • terminfo: terminal information
  • tr: traslate
  • troff: Typesetter new ROFF
  • tsort: Topological SORT
  • tty: TeleTypewriter
  • twm: Tom’s Window Manager
  • tz: TimeZone
  • udev: Userspace DEV
  • ulimit: User’s LIMIT
  • umask: User’s MASK
  • uniq: UNIQue
  • vi: VIsual: Very Inconvenient
  • vim: Vi IMproved
  • wall: write all
  • wc: Word Count
  • wine: WINE Is Not an Emulator
  • xargs: eXtended ARGuments
  • xdm: X Display Manager
  • xlfd: X Logical Font Description
  • xmms: X Multimedia System
  • xrdb: X Resources DataBase
  • xwd: X Window Dump
  • yacc: yet another compiler compiler

延伸