Skip to content

7-管道、管道、环境变量与其他常用命令

7.1 管道

概念

  • 管道类似于文件重定向,可以将前一个命令的 stdout 重定向到下一个命令的 stdin

要点

  • 管道命令仅处理 stdout,会忽略 stderr
  • 管道右边的命令必须能接受 stdin
  • 多个管道命令可以串联。

与文件重定向的区别

  • 文件重定向左边为命令,右边为文件。
  • 管道左右两边均为命令,左边有 stdout,右边有 stdin

例如

  • 统计当前目录下所有 python 文件的总行数
shell
find . -name '*.py' | xargs cat | wc -l

xargs 可以将 stdin 转化为 cat 命令的参数。


7.2 环境变量

概念

Linux 系统中会用很多环境变量来记录配置信息。

环境变量类似于全局变量,可以被各个进程访问到。我们可以通过修改环境变量来方便地修改系统配置。

查看

列出当前环境下的所有环境变量:

shell
env  # 显示当前用户的变量
set  # 显示当前shell的变量,包括当前用户的变量
export  # 显示当前导出成用户变量的shell变量

输出某个环境变量的值:

shell
echo $PATH

修改

环境变量的定义、修改、删除操作可以参考 shell 语法的内容。

为了将对环境变量的修改应用到未来所有环境下,可以将修改命令放到 ~/.bashrc 文件中。修改完 ~/.bashrc 文件后,记得执行 source ~/.bashrc,来将修改应用到当前的 bash 环境下。

为何将修改命令放到 ~/.bashrc,就可以确保修改会影响未来所有的环境呢?

  • 每次启动 bash,都会先执行 ~/.bashrc
  • 每次 ssh 登陆远程服务器,都会启动一个 bash 命令行给我们。
  • 每次 tmux 新开一个 pane,都会启动一个 bash 命令行给我们。
  • 所以未来所有新开的环境都会加载我们修改的内容。

常见环境变量

  • HOME:用户的家目录。
  • PATH:可执行文件(命令)的存储路径。路径与路径之间用 : 分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。
  • LD_LIBRARY_PATH:用于指定动态链接库(.so 文件)的路径,其内容是以冒号分隔的路径列表。
  • C_INCLUDE_PATH:C 语言的头文件路径,内容是以冒号分隔的路径列表。
  • CPLUS_INCLUDE_PATH:CPP 的头文件路径,内容是以冒号分隔的路径列表。
  • PYTHONPATH:Python 导入包的路径,内容是以冒号分隔的路径列表。
  • JAVA_HOME:JDK 的安装目录。
  • CLASSPATH:存放 Java 导入类的路径,内容是以冒号分隔的路径列表。

7.3 其他常用命令

系统状况

  • top:查看所有进程的信息(Linux的任务管理器)
    bash
    * 打开后,输入 `M`:按使用内存排序
    * 打开后,输入 `P`:按使用 CPU 排序
    * 打开后,输入 `q`:退出
  • df -h:查看硬盘使用情况
  • free -h:查看内存使用情况
  • du -sh:查看当前目录占用的硬盘空间
  • ps aux:查看所有进程
  • kill -9 pid:杀死编号为 pid 的进程
    bash
    * 传递某个具体的信号:`kill -s SIGTERM pid`
  • netstat -nt:查看所有网络连接
  • w:列出当前登录的用户
  • ping lys2021.com:检查是否连网

文件权限

  • chmod:修改文件权限
    • chmod +x xxx:给 xxx 添加可执行权限
    • chmod -x xxx:去掉 xxx 的可执行权限
    • chmod 777 xxx:将 xxx 的权限改成 777
    • chmod 777 xxx -R:递归修改整个文件夹的权限

文件检索

  • find /path/to/directory/ -name '*.py':搜索某个文件路径下的所有 *.py 文件
  • grep xxx:从 stdin 中读入若干行数据,如果某行中包含 xxx,则输出该行;否则忽略该行。
  • wc:统计行数、单词数、字节数
    bash
    * 既可以从 `stdin` 中直接读入内容;也可以在命令行参数中传入文件名列表;
    * `wc -l`:统计行数
    * `wc -w`:统计单词数
    * `wc -c`:统计字节数
  • tree:展示当前目录的文件结构
    bash
    * `tree /path/to/directory/`:展示某个目录的文件结构
    * `tree -a`:展示隐藏文件
  • ag xxx:搜索当前目录下的所有文件,检索 xxx 字符串
  • cut:分割一行内容
    bash
    *`stdin` 中读入多行数据
    * `echo $PATH | cut -d ':' -f 3,5`:输出 `PATH` `:` 分割后第 3、5 列数据
    * `echo $PATH | cut -d ':' -f 3-5`:输出 `PATH` `:` 分割后第 3-5 列数据
    * `echo $PATH | cut -c 3,5`:输出 `PATH` 的第 3、5 个字符
    * `echo $PATH | cut -c 3-5`:输出 `PATH` 的第 3-5 个字符
  • sort:将每行内容按字典序排序
    bash
    * 可以从 `stdin` 中读取多行数据
    * 可以从命令行参数中读取文件名列表
  • xargs:将 stdin 中的数据用空格或回车分割成命令行参数
    bash
    * `find . -name '*.py' | xargs cat | wc -l`:统计当前目录下所有 Python 文件的总行数

查看文件内容

  • more:浏览文件内容
    bash
    * 回车:下一行
    * 空格:下一页
    * `b`:上一页
    * `q`:退出
  • less:与 more 类似,功能更全
    bash
    * 回车:下一行
    * `y`:上一行
    * `Page Down`:下一页
    * `Page Up`:上一页
    * `q`:退出
  • head -3 xxx:展示 xxx 的前 3 行内容
    bash
    * 同时支持从 `stdin` 读入内容
  • tail -3 xxx:展示 xxx 末尾 3 行内容
    bash
    * 同时支持从 `stdin` 读入内容

用户相关

  • sudo su user:切换为 user 用户
  • adduser user:创建用户 user
  • usermod -aG sudo user:给用户 user 分配 sudo 权限
  • history:展示当前用户的历史操作。内容存放在 ~/.bash_history

工具

  • md5sum:计算 md5 哈希值
    bash
    * 可以从 `stdin` 读入内容
    * 也可以在命令行参数中传入文件名列表;
  • time command:统计 command 命令的执行时间
  • ipython3:交互式 python3 环境。可以当做计算器,或者批量管理文件。
    bash
    * `! echo "Hello World"``!` 表示执行 `shell` 脚本
  • watch -n 0.1 command:每 0.1 秒执行一次 command 命令
  • tar:压缩文件
    bash
    * `tar -zcvf xxx.tar.gz /path/to/file/*`:压缩
    * `tar -zxvf xxx.tar.gz`:解压缩
  • diff xxx yyy:查找文件 xxxyyy 的不同点

安装软件

  • sudo command:以 root 身份执行 command 命令
  • apt-get install xxx:安装软件
  • pip install xxx --user --upgrade:安装 python 包