终端原理及操作
本文对 shell 中的概念及命令进行总结, 也涵盖一些终端工具的使用, 涉及到 Linux 及 Mac 系统.
常见概念理解
terminal
: 一个程序,Mac
自带terminal
, 也有第三方软件比如xterm
,iterm
,kvt
等,terminal
是shell
的 UI,shell
运行在terminal
中shell
: 命令行解释器. 根据字面意义来看就是机器外面的一层壳, 用于在机器与人交互过程中传递信息. 不限于操作系统, 编程语言, 操作方式和表现形式. 具体表现是用户输入一条命令后 shell 就立刻进行执行并返回结果. CLI(Command Line Interface
) 与 GUI(Graphic User Interface
) 都是shell
, 只不过是不同的表现形式而已.interactive
与non-interactive
: 如果打开 Mac 上的iterm
, 输入bash
代码, 按下回车后有返回任何信息就被称为interactive
; 如果输入了若干行的shell
脚本, 那么这些shell
代码就运行在non-interactive shell
中login
与non-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 系统就是一个纯命令行的操作系统,GNOME
为Linux
提供了桌面操作环境.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-a
: 光标移动到行首C-e
: 光标移到行尾C-z
: 将当前进程最小化C-l
: 清除整个屏幕C-u
: 从光标位置删除到行首C-k
: 从光标位置删除到行尾C-d
: 删除当前 shell 会话↑/↓
: 浏览已执行的历史记录C-h
: 删除光标前一个字符C-r
: 搜索之前打开过的命令C-w
: 移除光标前一个单词Esc-d
: 删除光标所在字母Esc-f
: 光标右移Esc-b
: 光标左移
常用命令
扩展
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 nowhalt
: 关闭系统, 等同于 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
: 删除文件夹及其下所有的文件rmdir [路径]
: 删除一个文件夹 (无法删除含有文件的文件夹)rt <filename>
: 移动文件到回收站, 是 trash 插件的 trash 命令的 aliasmkdir
: 新建一个文件夹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
: 本机的用户都会在此组中, 注意, 并不包括用户 guesteveryone
: 直译过来就是任何人, 包括任何用户, 比如 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
: 用户组 指定用户所属的用户组.-G
: 用户组, 用户组 指定用户所属的附加组.-s
: Shell 文件 指定用户的登录 Shell.-u
: 用户号 指定用户的用户号, 如果同时有 - o 选项, 则可以重复使用其他用户的标识号.
userdel [option] hanley
: 删除用户 hanley-r
: 将用户的主目录一起删除
usermod [option] hanley
: 修改用户 hanley 的配置-c
: comment 指定一段注释性描述.-d
: 目录 指定用户主目录, 如果此目录不存在, 则同时使用 - m 选项, 可以创建主目录.-g
: 用户组 指定用户所属的用户组.-G
: 用户组, 用户组 指定用户所属的附加组.-s
: Shell 文件 指定用户的登录 Shell.-u
: 用户号 指定用户的用户号, 如果同时有 - o 选项, 则可以重复使用其他用户的标识号.usermod -s /bin/ksh -d /home/z –g developer hanley
: 此命令将用户 sam 的登录 Shell 修改为 ksh, 主目录改为 / home/z, 用户组改为 developer.
passwd [option] hanley
: 修改用户 hanley 的密码-l
: 锁定口令, 即禁用账号.-u
: 口令解锁.-d
: 使账号无口令.-f
: 强迫用户下次登录时修改口令.非 root 下不能修改指定用户名的密码, 只能使用 passwd 修改自身密码
su - hanley
: 切换到用户 hanleysu
: 切换到 rootchmod -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 的属主更改为 mysqlsudo chown -R $(whoami) /Library/Ruby/Gems/*
: 为文件夹下的所有文件的属主改为当前用户chown root:root auth.log
: 将文件 auth.log 的属主与数组更改回 rootchgrp -R mysql apache2
: 把文件apache2
及该文件所属目录下的所有递归文件的所在组更改为 mysqldscl . -list /Groups
: 查看所有组dscl . -list /Group PrimaryGroupID
: 查看所有组及其 iddscl . -read /groups
: 查看所有组的所有详细信息dscl . -read /Groups/admin
查看指定组 admin 的详细信息dscl . -read /Groups/admin GroupMembership
: 查看指定组 admin 的所有成员dscl . -list /Users
: 查看所有用户dscl . -list /Users UniqueID
: 查看所有用户及 IDdscl . 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
: 将用户加入指定用户组 admindscl . -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
: 输出当前系统的路径读取顺序, 以下是不同系统加载path
的顺序:Mac:
/etc/profile
->/etc/paths
-> ->~/.zshenv
-> [~/.zprofile
] ->~/.zshrc
->~/.zlogin
Linux:
/etc/prifile
->~/.zshrc
1
2
3
4
5
6
7
8
9
10
11BASH Bash Shell 的全路径
CDPATH 用于快速进入某个目录.
PATH 决定了 shell 将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 当前用户 Shell 类型
LANGUGE 语言相关的环境变量, 多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PS1 基本提示符, 对于 root 用户是 #, 对于普通用户是 $
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
: 新建一个不带任何环境变量的 Shellfor 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
路径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 identifierps -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
2sudo spctl --master-disable
defaults write com.apple.LaunchServices LSQuarantine -bool false
nmcli g
: 查看网络状态nmcli d
: 查看设备信息nmcli d connect deviceName
: 根据自身真实网卡名字对应修改 deviceNamenmcli connection modify enp0s5 connection.autoconnect yes
: 设置此网卡开机自动连接网络
cat /etc/inittab
: 获得系统支持的模式, CentOS8 只支持multi-user.target
与graphical.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 dr-xr-xr-x. 18 root root 4.0K May 20 00:42 . |
/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 | [root@www /]# ls -l |
实例中, bin 文件的第一个属性用 “d” 表示. “d” 在 Linux 中代表该文件是一个目录文件.
在 Linux 中第一个字符代表这个文件是目录, 文件或链接文件等等.
d
: 则是目录-
: 则是文件;l
: 则表示为链接文档 (link file);b
: 则表示为装置文件里面的可供储存的接口设备 (可随机存取装置);c
: 则表示为装置文件里面的串行端口设备, 例如键盘, 鼠标 (一次性读取装置).
接下来的字符中, 以三个为一组, 且均为 rwx
的三个参数的组合. 其中, r
代表可读 (read), w
代表可写 (write), x
代表可执行 (execute). 要注意的是, 这三个权限的位置不会改变, 如果没有权限, 就会出现减号 -
而已.
每个文件的属性由左边第一部分的 10 个字符来确定 (如下图).
文件的属主与属组
对于一个文件来说, 共有四类用户:
- 属主用户: 文件的所有者
- 属组用户: 与属主用户同组的用户, 使用
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 | root::0:root |
/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 | root:Dnakfw28zf38w:8764:0:168:7::: |
系统环境路径
在 /etc/paths
中规定了系统路径查找顺序
1 | /usr/local/bin |
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
路径加入到路径列表并成为第一顺位.
快捷键
⌃ C
: 取消终端当前正在进行的操作⌃ R
: 向前搜索历史命令, 使用⌃ C
取消搜索状态⌃ S
: 向后搜索历史命令⌃ L
: 清除屏幕内容⌘ E
: 向下滚动一行⌘ Y
: 向上滚动一行双击 Tab
: 列出所有的补全列表并直接进入选择模式, 补全项可以使用 ctrl+n/p/f/b 上下左右切换上下键
: 显示历史的命令, 如果在特定前缀命令下只会显示同样的命令, 比如输入ls
情况下只会查找用过的ls
命令
源码编译安装
尽管已经有些包管理软件, 但是仍然不可避免地要编译安装一些源码, 本例以 CentOS 编译安装 Python3.8.3 为例
编译环境准备
1
2yum 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删除系统中已有的 python3
在
/usr/bin
与/usr/local/bin
中查找 python3 与pip3
的相关文件, 然后删除. 这一步是为了后面我们将编译出的文件链接到此两个文件夹中下载 Python3.8.3 源码到桌面并解压
1
2
3cd /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配置编译选项
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
之后就会把程序安装到我们指定的文件夹中去.
进行编译, 编译结果会放到 [第 4 步](# 第四步) 配置的文件夹中
1
make && make install
进入编译结果文件夹, 将编译出的结果软链接到
/usr/bin
中1
2
3
4
5
6
7cd /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
3vim /etc/profile # 编辑 etc/profile 文件
export PATH=/usr/local/Python3.8.3/bin:$PATH # 在文件末尾直接加入我们的编译结果文件夹
source etc/profile # 更新配置不过这样的话我们每编译一次软件可能就要编辑一次
PATH
, 而且也会导致PATH
过多, 因此更方便的方法还是使用软链接的方式
工具
yum
yum
是 centos
上的包管理工具, 作用类似于 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
5mv /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 | [local] #仓库的名字, 不要有特殊符号 (自定义) |
命令
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 快很多.
安装
- 首先安装 epel-release:
sudo yum install epel-release
- 通过 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>
: 安装软件包
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
: 查看安装的包 (以分页的方式显示)
pyenv
Python 版本管理工具, 通过添加垫片路径 ~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin
的方式来方便地切换全局, 本地, 系统的 Python 版本. 还能创建 virtual python environments
, 通过将 python 安装到一个目录来作为 python 包虚拟环境, 然后通过切换目录实现不同包环境的切换.
安装
CentOS
1
2sudo 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 # 编译安装 pyenvMacOS
1
2brew 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.3pyenv 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
rbenv
ruby 版本管理工具, 使用方法与 pyenv 相似
安装
1 | brew install rbenv |
命令
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.gemgem 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 | USAGE: |
实例
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
PlistBuddy
是一款修改 plist 文件的终端工具
1 |
|
xargs
很多命令是不支持管道作为其输入的, 比如 echo
, echo "hello world" | echo
是不会有任何输出的. 我们可以使用 xargs 将上一管道的输出转换为命令行参数, 进而使本管道的命令可以正常使用. echo "hello world" | xargs echo
绝大多数情况下, xargs 都是配合管道使用的.
参数
-d
: delim, 分隔符, 默认的 xargs 分隔符是回车, argument 的分隔符是空格, 这里修改的是 xargs 的分隔符.-p
: 当每次执行一个 argument 的时候询问一次用户.-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 下, 并改名为 file1cp -r /usr/men /usr/zh
将目录 / usr/men 下的所有文件及其子目录复制到目录 / usr/zh 中
scp
scp 是基于 ssh 协议的 cp, 我们使用 scp
时相当于使用 ssh
登录后再进行拷贝操作
-p 参数用来保留修改时间 (modification time) , 访问时间 (access time) , 文件状态 (mode) 等原始文件的信息.
命令参数
source [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
: 退出 sedr 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 替换为 truesed '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 文件会发生变化, abcnl 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:
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.jpgtar -czf jpg.tar.gz *.jpg
: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 gzip 压缩, 生成一个 gzip 压缩过的包, 命名为 jpg.tar.gztar -cjf jpg.tar.bz2 *.jpg
: 将目录里所有 jpg 文件打包成 jpg.tar 后, 并且将其用 bzip2 压缩, 生成一个 bzip2 压缩过的包, 命名为 jpg.tar.bz2tar -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
: 设置 Agentcurl -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
: 向服务器发送 Cookiecurl -b 'foo=bar' https://google.com
: 生成一个标头 Cookie: foo=bar, 向服务器发送一个名为 foo, 值为 bar 的 Cookie.curl -b 'foo1=bar;foo2=bar2' https://google.com
: 向服务器发送两个 cookiecurl -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
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 系统里自带的一个系统命令, 用来显示当前的系统时间, 通过控制格式输出可以得到我们需要的时间字符串
1 | - `%%`: 一个文字的 % |
默认情况下, 日期的数字区域以 0
填充.
以下可选标记可以跟在 %
后:
-
: (连字符) 不填充该域_
: (下划线) 以空格填充0
: (数字 0) 以 0 填充^
: 如果可能, 使用大写字母#
: 如果可能, 使用相反的大小写
在任何标记之后还允许一个可选的域宽度指定, 它是一个十进制数字. 作为一个可选的修饰声明, 它可以是 E, 在可能的情况下使用本地环境关联的 表示方式; 或者是 O, 在可能的情况下使用本地环境关联的数字符号.
示例
1 | $ date "+%Y-%m-%d" |
top
top
命令是 linux
的性能分析工具, 能实时显示系统的资源占用情况, Mac 下的 top
与 Linux 下的 top
使用方式有所不同, 这里仅记录下 Linux 下 top
命令的使用
界面解释
1 | $ top |
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
: 进程 idUSER
: 进程所有者PR
: 进程优先级NI
: nice 值. 负值表示高优先级, 正值表示低优先级VIRT
: 进程使用的虚拟内存总量, 单位 kb. VIRT=SWAP+RESRES
: 进程使用的, 未被换出的物理内存大小, 单位 kb. RES=CODE+DATASHR
: 共享内存大小, 单位 kbS
: 进程状态. 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 sf
/F
: 从当前显示中添加或者删除项目o
/O
: 改变显示项目的顺序l
: 切换显示平均负载和启动时间信息m
: 切换显示内存信息t
: 切换显示进程和 CPU 状态信息c
: 切换显示命令名称和完整命令行M
: 根据驻留内存大小进行排序P
: 根据 CPU 使用百分比大小进行排序T
: 根据时间 / 累计时间进行排序W
: 将当前设置写入~/.toprc
文件中
htop
一款跨平台的且界面更加友好的系统监控工具
安装
1 | brew 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
: 退出 htopI
: 倒转排序顺序M
: 按内存占用排序P
: 按 CPU 排序T
: 按运行时间排序U
: 取消标记所有的进程K
: 显示 / 隐藏内核线程l
: 显示进程打开的文件: 如果安装了 lsof, 按此键可以显示进程所打开的文件u
: 显示所有用户, 并可以选择某一特定用户的进程s
: 将调用 strace 追踪进程的系统调用H
: 显示 / 隐藏用户线程
上下键或 PgUP, PgDn : 移动选中进程
左右键或 Home, End : 移动列表
Space(空格) : 标记 / 取消标记一个进程. 命令可以作用于多个进程, 例如 “kill”, 将应用于所有已标记的进程
on-my-zsh
安装
1 | // 1. 通过 wget 安装: wget 用来从指定的 URL 下载文件 |
oh-my-zsh 自带插件
由于 oh-my-zsh 自带插件在安装时已经放入了 ~/.oh-my-zsh/plugins
文件夹中, 因此只需要在 .zshrc
的 plugins 中填入相应名称即可设置开启
目录跳转 z
安装
1
2
3plugins=(
z
)使用
-c
: 在当前目录下进行子目录匹配-e
: echo 最合适的匹配和对应的 rank, 但是不执行 cd 操作-h
: 显示帮助信息-l
: echo 所有匹配的目录和对应的 rank, 但是不执行 cd 操作-r
: 进入所匹配目录列表中 rank 值最高的那个目录-t
: 进入所匹配目录列表中最近访问的那个目录-x
: 在. z 缓存中清除当前目录的记录
last-working-dir
安装
1
2
3plugins=(
last-working-dir
)
osx
安装
1
2
3plugins=(
osx
)使用
cdf
: 在终端中跳转到当前 finder 目录o/fd
: 在 finder 中打开当前 Terminal 目录pfd
: print 出当前 finder 目录tab
: 在终端中新建一个 tab, 打开当前 finder 目录pfs
: Return the current Finder selectionpushdf
: pushd to the current Finder directoryquick-look
: Quick-Look a specified fileman-preview
: Open a specified man page in Preview appshowfiles
: Show hidden fileshidefiles
: Hide the hidden files
虽然插件名叫 oxs, 但是在 linux 系统下也是可以让终端与其文件管理系统互动的
vi-mode
安装
1
2
3plugins=(
vi-mode
)使用
⎋
: 进入vim
的normal
模式↑
(或C-P
): 前一个历史命令↓
(或C-N
): 后一个历史命令/
: 向后查找历史命令?
: 向前查找历史命令n
: 向后重复N
: 向前重复v
: 将当前命令在 vim 中进行编辑 (只适用于大段命令)其他的移动插入删除等操作与 vim 操作一致
自动补全 zsh-autosuggestions
自动补全效果 (灰色部分), 默认使用方向键 ➡️以补全内容
安装
1 | // 1. 下载 |
使用
使用逗号 ,
快捷键自动补全
命令行高亮 zsh-syntax-highlighting
安装
1 | // 1. 克隆插件的远程仓库到本地 oh-my-zsh 配置集合中 |
自定义加粗高亮
默认情况下的错误语法颜色被设为红色加粗, 正确语法为绿色普通. 可以对 main 文件进行修改已达到对各种语法颜色的匹配.
Trash
移动文件 (夹) 到回收站
安装
1 | npm install trash |
使用
1 | trash <filename> |
考虑方便起见可以将 rm 作为其别名, 在 .zshrc
中设置
1 | alias rm='trash' |
lsd
显示文件夹与文件区别, 并显示文件类型图标
前排提示, 此插件的图标显示是基于字体, 必须更改为合适字体才能正常显示图标. 为此我专门将三种字体拟合为一个字体, 需要的话可以去我的 GitHub 仓库进行下载.
安装
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' |
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. 任意切换版本, 查看当前版本, 查看远端所有可用版本
安装
使用 Homebrew 进行安装
1
brew install nvm
在环境中定位 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 已经足够了
使用 Homebrew 卸载
1
brew uninstall nvm
在
~/.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
: 显示所有已安装的 packagenpm 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 中的安装
安装必要依赖
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
1
2dnf 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按下模拟器最右上角的感叹号, 根据提示加载镜像
将镜像中的文件拷贝出
1
2mkdir /media/cdrom
mount -o exec /dev/cdrom /media/cdrom安装
1
2cd /media/cdrom
./install重启
常用命令含义
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 commandbash
:GNU Bourne-Again Shell linux 内核grep
:global regular expression printhttpd
:Start Apacheipcalc
:Calculate IP information for a hostping
: Send ICMP ECHO_Request to network hostsreboot
: Restart your computersudo
:Superuser dopwd
: print working Directory (打印工作目录).FIFO
: First In, First OutGRUB
: GRand Unified BootloaderIFS
: Internal Field SeperatorsLILO
: LInux LOaderMySQL
: My 最初作者的名字 SQL: Structured Query LanguagePHP
: Personal Home Page Tools: PHP Hypertext PreprocessorPS
: Prompt StringPerl
: “Pratical Extraction and Report Language”: “Pathologically Eclectic Rubbish Lister”Tcl
: Tool Command LanguageTk
: ToolKitVT
: Video TerminalYaST
: Yet Another Setup Toolapache
: “a patchy” serverapt
: Advanced Packaging Toolar
: archiveras
: assemblerbash
: Bourne Again SHellbc
: Basic (Better) Calculatorbg
: BackGroundcal
: CALendarcat
: CATenatecd
: Change Directorychgrp
: CHange GRouPchmod
: CHange MODechown
: CHange OWNerchsh
: CHange SHellcmp
: comparecobra
: Common Object Request Broker Architecturecomm
: commoncp
: CoPycpio
: CoPy In and Outcpp
: C Pre Processorcups
: Common Unix Printing Systemcvs
: Current Version Systemdaemon
: Disk And Execution MONitordc
: Desk Calculatordd
: Disk Dumpdf
: Disk Freediff
: DIFFerencedmesg
: diagnostic messagedu
: Disk Usageed
: editoregrep
: Extended GREPelf
: Extensible Linking Formatelm
: ELectronic Mailemacs
: Editor MACroSeval
: EVALuateex
: EXtendedexec
: EXECutefd
: file descriptorsfg
: ForeGroundfgrep
: Fixed GREPfmt
: formatfsck
: File System ChecKfstab
: FileSystem TABlefvwm
: F*** Virtual Window Managergawk
: GNU AWKgpg
: GNU Privacy Guardgroff
: GNU troffhal
: Hardware Abstraction Layerjoe
: Joe’s Own Editorksh
: Korn SHelllame
: Lame Ain’t an MP3 Encoderlex
: LEXical analyserlisp
: LISt Processing: Lots of Irritating Superfluous Parenthesesln
: LiNklpr
: Line PRintls
: listlsof
: LiSt Open Filesm4
: Macro processor Version 4man
: MANual pagesmawk
: Mike Brennan’s AWKmc
: Midnight Commandermkfs
: MaKe FileSystemmknod
: MaKe NODemotd
: Message of The Daymozilla
: MOsaic GodZILLamtab
: Mount TABlemv
: MoVenano
: Nano’s ANOther editornawk
: New AWKnl
: Number of Linesnm
: namesnohup
: No HangUPnroff
: New ROFFod
: Octal Dumppasswd
: PASSWorDpg
: pagerpico
: PIne’s message COmposition editorpine
: “Program for Internet News & Email”: “Pine is not Elm”ping
: Packet InterNet Grouperpirntcap
: PRINTer CAPabilitypopd
: 发布 P Directorypr
: preprintf
: PRINT Formattedps
: Processes Statuspty
: pseudo ttypushd
: PUSH Directorypwd
: Print Working Directoryrc
: runcom: run command, shellrev
: REVerserm
: ReMovern
: Read Newsroff
: RunOFFrpm
: RPM Package Manager: RedHat Package Managerrsh
, rlogin,: Remoterxvt
: ouR XVTsed
: Stream EDitorseq
: SEQuenceshar
: SHell Archiveslrn
: S-Lang rnssh
: Secure SHellssl
: Secure Sockets Layerstty
: Set TTYsu
: Substitute Usersvn
: SubVersioNtar
: Tape Archivetcsh
: TENEX C shelltelnet
: TEminaL over Networktermcap
: terminal capabilityterminfo
: terminal informationtr
: traslatetroff
: Typesetter new ROFFtsort
: Topological SORTtty
: TeleTypewritertwm
: Tom’s Window Managertz
: TimeZoneudev
: Userspace DEVulimit
: User’s LIMITumask
: User’s MASKuniq
: UNIQuevi
: VIsual: Very Inconvenientvim
: Vi IMprovedwall
: write allwc
: Word Countwine
: WINE Is Not an Emulatorxargs
: eXtended ARGumentsxdm
: X Display Managerxlfd
: X Logical Font Descriptionxmms
: X Multimedia Systemxrdb
: X Resources DataBasexwd
: X Window Dumpyacc
: yet another compiler compiler