管道、环境变量与常用命令
管道 Pipeline
概念 about pipeline
管道类似于文件重定向,可以将前一个命令的 stdout
重定向到下一个命令的 stdin
。
要点
- 管道命令仅处理
stdout
,会忽略stderr
。 - 管道右边的命令必须能接受
stdin
。 - 多个管道命令可以串联。
与文件重定向的区别
- 文件重定向左边为命令,右边为文件。
- 管道左右两边均为命令,左边有
stdout
,右边有stdin
。
举例
统计当前目录下所有python文件的总行数,其中 find
、 xargs
、 wc
等命令可以参考常用命令这一节内容。
find . -name '*.py' | xargs cat | wc -l
环境变量 environment variables
概念 about ev
Linux系统中会用很多环境变量来记录配置信息。
环境变量类似于全局变量,可以被各个进程访问到。我们可以通过修改环境变量来方便地修改系统配置。
查看
列出当前环境下的所有环境变量:
env # 显示当前用户的变量
set # 显示当前shell的变量,包括当前用户的变量;
export # 显示当前导出成用户变量的shell变量
输出某个环境变量的值:
echo $PATH
修改
环境变量的定义、修改、删除操作可以参考 3. shell语法——变量 这一节的内容。
当前 shell
环境下修改的环境变量只在当前环境中有效。为了将对环境变量的修改应用到未来所有环境下,可以将修改命令放到 ~/.bashrc
文件中(直接把修改语句写在文件最后,因为每次执行 bash
都是从上往下执行,后执行的可以覆盖先执行的)。
修改完 ~/.bashrc
文件后,记得执行 source ~/.bashrc
,来将修改应用到当前的 bash
环境下。
为何将修改命令放到 ~/.bashrc
,就可以确保修改会影响未来所有的环境呢?
- 每次启动
bash
,都会先执行~/.bashrc
。 - 每次
ssh
登陆远程服务器,都会启动一个bash
命令行给我们。 - 每次
tmux
新开一个pane
,都会启动一个bash
命令行给我们。 - 所以未来所有新开的环境都会加载我们修改的内容。
常见环境变量
HOME
:用户的家目录。PATH
:可执行文件(命令)的存储路径。路径与路径之间用:分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。- 当执行一个命令时,操作系统会在
PATH
的存储路径里从左到右依次找,直到找到第一个匹配的可执行文件。因此新加入命令时,最好把路径写在原PATH
的前面,保证命令能够被执行 - 当一个库出现在多个环境变量的路径中时,系统只会找到最左路径里的库文件。如果只修改了靠后路径中该库的代码,程序执行时依然会执行修改前的版本而不会执行修改后的版本。因此在更新库文件的代码时一定要更新最左路径里的库文件(最好全部更新)
- 当执行一个命令时,操作系统会在
LD_LIBRARY_PATH
:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表(除了这里的目录,操作系统也会去一些默认的专门放.so文件的目录找动态链接库)。- 静态库VS动态库
- C或C++程序使用的库函数来自静态链接库或动态链接库。
- 静态链接库的函数代码在编译时会被载入目标程序中,程序运行时不需要再次访问静态库;会导致可执行文件体积增大,且修改静态库函数后,涉及的程序需要重新编译
- 动态链接库的函数代码不会载入目标程序,目标程序在编译链接后只会保留库函数的接口。当程序执行到使用库函数时,程序会根据操作系统
LD_LIBRARY_PATH
里的路径找到相应动态库里的函数并执行。程序执行时需要访问动态库;可执行文件体积不受函数影响,且修改动态库后涉及的程序不需要重新编译
C_INCLUDE_PATH
:C语言的头文件路径,内容是以冒号分隔的路径列表。CPLUS_INCLUDE_PATH
:CPP的头文件路径,内容是以冒号分隔的路径列表。PYTHONPATH
:Python导入包的路径,内容是以冒号分隔的路径列表。JAVA_HOME
:jdk的安装目录。CLASSPATH
:存放Java导入类的路径,内容是以冒号分隔的路径列表。
常用命令
Linux命令非常多,本节讲解几个常用命令。其他命令依赖于大家根据实际操作环境,边用边查。
系统状况
top
:查看所有进程的信息(Linux的任务管理器)- 打开后,输入
M
:按使用内存排序 - 打开后,输入
P
:按使用CPU排序 - 打开后,输入
q
:退出
- 打开后,输入
df -h
:查看硬盘使用情况free -h
:查看内存使用情况du -sh
:查看当前目录占用的硬盘空间ps aux
:查看所有进程kill -9 pid
:杀死编号为pid
的进程- 传递某个具体的信号:
kill -s SIGTERM pid
(某些程序必须要用term结束而不能杀死,因此关闭某个程序最好先查文档看应该怎么关) 9
是SIGKILL
信号的编号,SIGTERM
的编号是15
- kill表示杀死进程,term表示正常结束一个进程
- 传递某个具体的信号:
netstat -nt
:查看所有网络连接w
:列出当前登陆的用户ping www.baidu.com
:检查是否连网
文件权限
chmod
:修改文件权限chmod +x xxx
:给xxx
添加可执行权限chmod -x xxx
:去掉xxx
的可执行权限chmod 777 xxx
:将xxx
的权限改成777- 三位数,每一位对应一组的权限。每位数字取值0~7,转化成二进制就是三位,每一位上,1表示有权限,0表示无权限
chmod 777 xxx -R
:递归修改整个文件夹的权限- 补充:文件的权限表示有10位
- 第一位表示是否是文件夹或超链接(快捷方式)
- 后9位按序每三位一组
- 三位中从前往后分别表示可读权限,可写权限,可执行权限
- 三组从前往后分别表示自己的权限,同组用户的权限,其他用户的权限
文件检索
find /path/to/directory/ -name '*.py'
:搜索某个文件路径下的所有*.py
文件grep xxx
:从stdin
中读入若干行数据,如果某行中包含xxx
,则输出该行;否则忽略该行。wc
:统计行数、单词数、字节数- 既可以从
stdin
中直接读入内容;也可以在命令行参数中传入文件名列表; wc file
按序输出行数、单词数,字节数wc -l
:统计行数wc -w
:统计单词数wc -c
:统计字节数
- 既可以从
tree
:展示当前目录的文件结构tree /path/to/directory/
:展示某个目录的文件结构tree -a
:展示隐藏文件
ag xxx
:搜索当前目录下的所有文件,检索xxx
字符串,输该字符串所在的文件,行号和该行内容- 不区分大小写
cut
:分割一行内容- 从
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
:将每行内容按字典序排序- 可以从
stdin
中读取多行数据 - 可以从命令行参数中读取文件名列表
- 可以从
xargs
:将stdin
中的数据用空格或回车分割成命令行参数find . -name '*.py' | xargs cat | wc -l
:统计当前目录下所有python文件的总行数- 如果不加
xargs
也会有输出,但是这个输出统计的不是.py
文件。不加xargs
,cat
输出的就是stdin
文件的内容,统计的也就是stdin
的行数
查看文件内容
more
:浏览文件内容- 回车:下一行
- 空格:下一页
b
:上一页q
:退出
less
:与more
类似,功能更全- 回车:下一行
y
:上一行Page Down
:下一页Page Up
:上一页q
:退出
head -3 xxx
:展示xxx
的前3行内容- 同时支持从
stdin
读入内容
- 同时支持从
tail -3 xxx
:展示xxx
末尾3行内容- 同时支持从
stdin
读入内容
- 同时支持从
用户相关
history
:展示当前用户的历史操作。内容存放在~/.bash_history
中history
展示的历史操作包含当前bash界面用户使用过的后2000条操作,而.bash_history
里的历史操作不包含当前未关闭的bash里的操作。只有关闭bash之后,才会把操作写入.bash_history
文件
工具
md5sum
:计算md5
哈希值- 计算任意长度的字符串的哈希值
- 可以从
stdin
读入内容 - 也可以在命令行参数中传入文件名列表;
- 一般计算文件的哈希值,用于核对文件是否准确且完好无损
- 也可以用于加密信息,比如加密密码
- 数据库存储密码时都不会存储原密码字符串,而是存储密码的哈希值。哈希值几乎不可能反推。用户输入密码后,先转化成哈希值再比对。所以如果忘记密码就只能重设密码,而不能找回密码
time command
:统计command
命令的执行时间ipython3
:交互式python3环境。可以当做计算器,或者批量管理文件。! echo "Hello World"
:!
表示执行shell
脚本
watch -n 0.1 command
:每0.1秒执行一次command
命令tar
:压缩文件tar -zcvf xxx.tar.gz /path/to/file/*
:将目标文件夹压缩为xxx.tar.gz
文件tar -zxvf xxx.tar.gz
:解压缩diff xxx yyy
:查找文件xxx
与yyy
的不同点
安装软件
sudo command
:以root
身份执行command
命令apt-get install xxx
:安装软件pip install xxx --user --upgrade
:安装python包
版权信息
- 作者:yxc
- 修改:jaylenwang
- 链接:https://www.acwing.com/file_system/file/content/whole/index/content/3030412/
- 来源:AcWing
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。