ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Python开发者必备Linux命令实战指南:从环境配置到故障排查

Python开发者必备Linux命令实战指南:从环境配置到故障排查 最近部门来了几个刚转Python开发的同事坐在工位上第一周干得最多的不是写代码而是跟Linux终端上的命令较劲有的卡在给服务器装Python包上有的把项目路径搞混导致import报错还有一个折腾了半天才发现自己写的脚本压根儿没被执行。说实话这些事看着是代码问题实际上都是基本功的债。我在Python上写了七八年业务代码带过不少新人最深的体会是Python代码能跑起来只是第一步真正拉开效率差距的是你对操作系统的熟悉程度以及命令行工具的熟练度。今天这篇不讲花哨的Python技巧就聊聊Python程序员每天最常用的那些Linux命令——从装环境、查进程、看日志、测接口到部署服务、排查故障每一节都是我实际踩过坑之后沉淀下来的用法。文章整体是“场景命令原因”的逻辑每个命令我都会说清楚项目里什么时候用得上适合刚转过来还没顺手的兄弟也适合想系统补一补基本功的人。1. Python开发环境的地基装好Python理顺路径1.1 系统自带的Python够用吗从apt到pyenv的真实选择很多Linux发行版默认就带Python3比如Ubuntu 22.04自带3.10Debian 12自带3.11。对写业务代码的人来说系统自带的版本通常够用但如果你同时维护多个项目每个项目依赖的Python版本不一样这时候直接用系统Python就会非常难受。我见过最典型的场景项目A用3.8项目B用3.10有人直接在系统里装了3.10结果项目A的某些依赖编译不过去最后只能整个环境推倒重来。我的建议是分两种情况处理。如果只是跑一些临时脚本、做点自动化直接用系统Python就行命令就这几条# 查看当前版本 python3 --version # 查看可执行文件位置 which python3 # 查看系统里装了哪些Python ls /usr/bin/python*如果你要正经开发多个项目或者想随时切换Python版本直接用pyenv。pyenv的核心价值是“按目录切换版本”它不会污染系统环境所有版本都装在你家目录下。安装方法官方文档写得很清楚这里说几个上手关键点# 查看可安装版本 pyenv install --list # 安装指定版本 pyenv install 3.11.8 # 在当前目录锁定版本 pyenv local 3.11.8 # 全局默认版本 pyenv global 3.11.8注意pyenv local会在当前目录生成一个.python-version文件进到这个目录Python版本就自动切换离开就恢复。这个机制配合poetry或pipenv用几乎可以解决99%的多版本环境问题。1.2 PATH与环境变量为什么python命令总找不到新手碰到“command not found”第一反应是重装其实90%的情况是PATH没配好。PATH就是一套目录清单系统执行命令时会按这个清单挨个目录去找可执行文件。你可以这么理解你喊“python”系统就按PATH里的顺序一家一家问“你有没有叫python的程序”全问一遍都没找到就报command not found。查看当前PATHecho $PATH临时把目录加进去export PATH/usr/local/bin:$PATH永久生效就写进shell配置文件echo export PATH$HOME/.local/bin:$PATH ~/.bashrc source ~/.bashrc这里有个很典型的场景你用pip安装了gunicorn或uwsgi执行时却提示找不到。原因就是pip把可执行文件装到了~/.local/bin或者Python安装目录的bin下而这个目录不在PATH里。解决办法就是把对应bin目录加进PATH而不是卸载重装。我自己在服务器上部署Flask项目时就被这个坑过两次后来习惯性地先在命令行敲python3 -m pip show gunicorn看安装路径再决定要不要改PATH。注意改完~/.bashrc之后要source ~/.bashrc或者重新开一个终端窗口才会生效直接在当前终端里敲命令可能没反应。2. 文件与目录操作Python项目里的高频基本功2.1 快速定位文件find和locate帮你省下半小时写Python项目的时候经常要找一个文件比如“这个settings.py到底在哪”“那个爬虫脚本放哪个目录了”。用文件管理器一层层点太慢直接在命令行用find最痛快。我最常用的几个组合# 在当前目录下按名字找文件 find . -name settings.py # 忽略大小写 find . -iname *.log # 按类型找比如找所有Python文件 find . -type f -name *.py # 排除虚拟环境目录 find . -type f -name *.py -not -path */venv/*这里解释一下为什么加-type f。不加的话find会把目录也打印出来目录名匹配到结果里反而干扰判断。还有一个小技巧2/dev/null可以把“权限不够”这类报错信息丢掉让输出干净一些。比如你想在整个系统里找某个配置文件但又不能保证每个目录都有权限访问可以写成find / -name nginx.conf 2/dev/null另外一个实用场景是批量处理文件。比如清理Python项目里的__pycache__缓存目录find . -type d -name __pycache__ -exec rm -rf {} 这个命令的意思是把找到的每个目录作为参数传给rm -rf一次删干净。如果你写过一段时间的Python应该知道这个缓存目录有多烦人尤其是代码改完跑起来还是旧逻辑的时候先清一遍缓存能解决很多“怪问题”。2.2 磁盘占用与日志清理du、df、truncate的组合拳Python服务跑久了最容易出的问题就是磁盘被日志塞满。一旦磁盘满了进程写不了日志可能直接崩溃表现还很迷惑。排查手段就三步。第一步看磁盘整体使用情况df -h-h的意思是human-readable自动换算成GB、MB。看到某个分区使用率100%基本就是它了。第二步定位是哪个目录占的空间# 看当前目录下一级各子目录的大小 du -h --max-depth1 # 只看当前目录总大小 du -sh . # 展示当前目录所有文件和目录的大小并排序 du -sh * | sort -hr | head -20这条命令我几乎隔两天就要用一次尤其是排查生产环境的服务器时du -sh *一眼就能看出哪个目录异常。第三步清理日志。这里推荐truncate而不是直接rm因为很多正在运行的进程持有日志文件句柄你删了文件进程还在往已删除的文件里写数据磁盘空间不会释放只有重启进程才生效。用truncate把文件内容清空但不删除文件本身进程会接着写空间立刻释放truncate -s 0 /var/log/myapp/app.log如果你确定某个日志文件不再需要也可以rm -rf直接删掉但要确认没有进程在写它。2.3 软链接一条命令解决路径迁移问题我在部署Python项目时经常用ln -s建软链接。软链接你可以理解成Windows里的快捷方式它本身只是一个指向不复制实际内容。最常见的用法是项目代码放在/opt/app但Nginx配置里指定的路径是/var/www/html这时候不用移动文件直接建一个软链接就行ln -s /opt/app /var/www/html/app以后访问/var/www/html/app就等同于访问/opt/app代码更新也是直接在/opt/app里改。查看软链接是否生效ls -l /var/www/html/输出里会看到类似app - /opt/app的箭头指向说明链接正常。软链接有一个特别容易踩的坑如果你把一个软链接指向了相对路径那这个链接就可能失效。比如你在/var/www/html下执行ln -s ../app linkname那么链接linkname指向的实际是/var/www/app而不是你以为的/opt/app。所以建软链接时最好用绝对路径避免理解偏差。检查链接是否失效就执行ls -l看箭头指向再确认目标路径是否存在。3. 进程管理与资源监控Python程序卡死先来这里3.1 ps和top怎么找出吃CPU、吃内存的“元凶”Python程序出问题最直观的表现是CPU冲高、内存暴涨或者整个进程卡住没反应。这时候第一步不是改代码是先把现场看清楚。查看当前有哪些Python相关进程最经典的命令ps aux | grep pythonps aux输出包含用户、PID、CPU占用率、内存占用率、启动命令等字段。grep python用来过滤把只含“python”的行筛出来。这里要提一个细节grep匹配的是命令行里包含“python”的进程如果某个进程叫python3也会被匹配到所以输出很正常。如果你已经知道PID可以直接盯住单个进程top -p 12345想动态看所有进程的实时占用直接敲top然后按ShiftP按CPU排序按ShiftM按内存排序。要注意top看到的CPU占用是百分比有时候你会看到一个Python进程CPU占用率超过100%这是正常的说明它用了多个CPU核心。在实际排障里我发现很多内存问题不是瞬间爆发的而是缓慢上涨。这种情况下用top盯几分钟看不出名堂更好的办法是把进程内存变化记录下来# 每秒记录一次PID 12345的常驻内存输出10行 for i in $(seq 1 10); do ps -o pid,rss,cmd -p 12345; sleep 1; doneRSS就是常驻内存单位是KB可以看出它是不是一直在涨。注意如果你在服务器上发现某个Python进程CPU占用率异常高先别急着kill。先看它的启动参数和日志确认是正常任务比如一个长时间运行的批处理或训练任务还是异常死循环免得误杀。3.2 kill与信号怎么优雅地停下Python进程很多人一遇到进程卡死第一反应是kill -9 PID。这个做法简单粗暴但有个问题-9发的是SIGKILL信号内核直接回收进程进程自己连“善后”的机会都没有。比如你用requests正在写文件强制杀掉可能导致文件写到一半数据损坏。正确的流程是先发kill -15也就是默认的kill PID默认信号就是SIGTERM告诉进程“请主动退出”。Python进程收到SIGTERM后会触发atexit注册的清理函数把该刷的缓冲刷掉该关的文件关掉然后自行退出。如果过了几秒还没退出再升级成kill -9。查看进程还能收到哪些信号以及进程状态kill -l ps -o pid,stat,cmd -p 12345状态字段里常见的是S睡眠、R运行、D不可中断睡眠。如果看到D状态这个进程可能在做磁盘IO你先别急着kill等它IO完成再说否则容易造成数据不一致。3.3 后台运行nohup和systemd帮你把脚本变成服务开发时我们经常在终端里直接跑python app.py一旦关掉终端进程就没了。想让Python脚本在服务器后台持续运行最简单的是nohupnohup python3 app.py app.log 21 拆开讲一下nohup让进程忽略挂断信号即使终端关闭进程也不退出 app.log把标准输出重定向到日志文件21把标准错误也重定向到同一个文件最后的让命令在后台执行。但nohup有个缺点如果进程自己崩溃了没有机制帮你拉起来。正式一点的服务还是用systemd更稳。写一个service文件比如/etc/systemd/system/myapp.service[Unit] DescriptionMy Python App Afternetwork.target [Service] WorkingDirectory/opt/app ExecStart/usr/bin/python3 /opt/app/app.py Restartalways Userwww-data EnvironmentPYTHONUNBUFFERED1 [Install] WantedBymulti-user.target这里有几个关键参数Restartalways表示只要进程异常退出就自动重启EnvironmentPYTHONUNBUFFERED1让Python输出不经过缓冲日志能实时看到。然后执行systemctl daemon-reload systemctl start myapp systemctl enable myapp这几条命令的意图分别是让systemd重新加载配置、启动服务、设置开机自启。之后查看状态就是systemctl status myapp看日志就是journalctl -u myapp -f。4. 文本处理三件套grep、awk、sed的Python日常4.1 grep从日志里筛Python异常写Python的人不可避免要跟日志打交道。Django的日志、爬虫的日志、celery的日志全堆在文件里出了问题第一件事就是搜索关键词。grep就是干这个的。最基本的用法grep Traceback app.log这会打印日志里所有包含“Traceback”的行。想精确知道异常出现在哪一行grep -n Traceback app.log想同时匹配多个关键词比如既想找Traceback又想找Errorgrep -E Traceback|Error|Exception app.log想在整个项目代码里搜索某个函数名或变量名grep -r my_function src/这里-r是递归搜索子目录。如果你不想搜索二进制文件可以加--include*.py只搜Python文件grep -r --include*.py TODO src/grep还常常跟管道搭配比如你想统计日志里某类异常出现了多少次grep -c TimeoutError app.log只输出匹配的总行数这个在汇报问题、定位影响范围时特别好用。我的习惯是先在日志里搜Traceback然后在Traceback前后的几行上下文里找具体报错内容。所以一般用grep -n -A 10 -B 2 Traceback app.log-A 10表示匹配行之后显示10行-B 2表示匹配行之前显示2行这样能直接看到异常栈的完整片段。4.2 awk按列提取日志数据awk最典型的用法是处理“按列分隔”的文本。比如Nginx访问日志的默认格式是IP、时间、请求、状态码、大小等字段用空格分隔。你想快速看每个请求的状态码可以写awk {print $1, $9} access.log$1是第一列IP$9是第九列状态码。awk默认按空格拆分字段这个特性在处理日志时非常实用。我经常用awk加sort统计接口的访问量比如统计每个IP访问了多少次awk {print $1} access.log | sort | uniq -c | sort -rn这条链路的含义是先把所有IP列打印出来排序然后uniq -c统计每个连续相同值的数量最后按数量倒序排。这样一眼就能看出哪个IP在疯狂请求。awk也支持条件过滤比如只看状态码为500的请求awk $9 500 {print $1, $7, $9} access.log这里的$9 500是条件满足条件的行才执行后面的打印。如果你在排查线上接口返回500这条命令能直接帮你列出所有500请求来自哪些IP、请求了哪些路径。4.3 sed批量替换配置文件里的内容sed的核心功能是“流式编辑”最常用的就是批量替换。举个例子你项目里的数据库密码要换配置文件有一堆地方写旧密码手动改容易漏用sed一次搞定sed -i s/old_password/new_password/g config.py-i表示直接修改文件s是替换命令g是全局替换每一行所有匹配都替换而不只是每行第一个。如果不加-ised只把替换结果打印到终端不会改原文件这个很适合先预览效果。只替换特定行可以搭配行号或模式。比如只想修改第20行的内容sed -i 20s/old/new/ config.py或者只替换包含某个关键字的行sed -i /db_host/s/localhost/192.168.1.10/ config.py这个写法是“找到包含db_host的行在这一行内做替换”在改配置文件时非常精准。注意macOS自带的sed是BSD版本-i后面需要跟一个字符串参数比如sed -i s/old/new/g file否则会报错。如果你团队里有人用macOS写这个命令容易踩这个差异建议统一在Linux环境里操作或者加一个参数兼容。4.4 管道与重定向把零散命令串成一条流水线前面其实已经用到管道了这里把概念讲透。管道符|的作用是把前一个命令的输出作为后一个命令的输入。你可以把它想象成一条流水线第一个工人处理完直接把半成品递给第二个工人。重定向符号有三个常见用法# 覆盖写入文件 python3 script.py output.txt # 追加写入文件 python3 script.py output.txt # 把标准错误也融进去 python3 script.py output.txt 2121这个写法是很多新手看不懂的。在Linux里每个进程默认有三个文件描述符0表示标准输入1表示标准输出2表示标准错误。21的意思是把文件描述符2重定向到文件描述符1当前指向的地方也就是“把错误输出也送到和标准输出同一个地方”。这样日志文件才能完整记录所有输出而不是只记一半。如果不想看到任何输出可以重定向到/dev/nullpython3 script.py /dev/null 21/dev/null就是一个“黑洞”所有写进去的内容都被丢弃。在调试一些只有副作用、不需要输出的脚本时这个写法很干净。5. 网络与调试命令接口排查离不开的几招5.1 curl本地联调和线上排查的瑞士军刀Python后端开发跟接口打交道太频繁了。本地起了Flask或FastAPI服务想验证接口正不正常我最常用的工具就是curl。最简单的GET请求curl http://127.0.0.1:8000/api/users带请求头的POST请求curl -X POST http://127.0.0.1:8000/api/users \ -H Content-Type: application/json \ -d {name:test,age:18}如果接口返回的是JSON你直接看终端输出可能是一大串没格式化的字符串建议加一个管道格式化curl -s http://127.0.0.1:8000/api/users | python3 -m json.toolpython3 -m json.tool会把JSON重新格式化打印层级关系一目了然。这个命令在调试返回大量嵌套结构的接口时特别香。想看响应头和完整通信过程# 只看响应头 curl -I http://example.com # 显示完整的请求和响应过程 curl -v http://example.com-v会打印SSL握手、请求头、响应头、响应体等所有细节是排查“接口到底发出去没有”“服务器到底返回了什么”最直接的手段。当你怀疑是代理或者CDN搞的鬼时-v能帮你看到请求真正打到了哪。5.2 ping、telnet、nc快速判断网络通不通排查接口问题首先得确认“通不通”再下结论是谁的锅。ping测试的是三层连通性也就是主机能不能到达ping -c 4 8.8.8.8-c 4表示只ping 4次就停避免一直刷屏。如果ping不通说明网络链路有问题服务器可能都不在线。端口是否开放用telnet或者nc更直接。比如你怀疑服务器8000端口没开telnet 192.168.1.20 8000如果端口通终端会显示连接成功如果不通会卡住或提示无法连接。telnet命令的本职是远程登录但在网络排查里它的“端口探测”能力更常用。不过telnet在部分新系统里没预装碰到这种情况用ncnc -zv 192.168.1.20 8000-z表示只扫描不发送数据-v显示详细信息。这个测端口的方式比telnet更轻量脚本里也可以用它判断服务状态。提示测完连通性之后如果端口通但接口还是报错那问题基本不在网络层回到应用层看日志和代码别在网络上死磕。5.3 ss和netstat查看端口被谁占了端口被占用是Python开发里特别常见的问题。你启动Flask服务提示Address already in use第一反应是“我明明没开过8000端口啊”。这时候用ss查一下谁占着端口ss -lntp | grep 8000拆解一下-l表示只显示监听中的端口-n表示显示数字地址和端口不做域名解析速度快很多-t表示只看TCP连接-p表示显示进程信息。输出里会看到PID和进程名比如某个残留的Python进程。老系统可能没有ss用netstat也行netstat -lntp | grep 8000找到占用端口的PID后确认这个进程确实可以杀再执行kill -15 PID如果还不行再kill -9 PID。更直接的方法是用fuser一条命令杀掉占用端口的进程fuser -k 8000/tcp这个命令会把8000端口上的进程杀掉适合开发环境图省事用。但在生产环境别乱用一定要先看清PID和进程是什么。6. 版本控制与文件传输Git和远程复制命令的日常6.1 高频使用的Git命令Git虽然不是Linux自带的命令但Python程序员在Linux上写代码Git就是日常。这里不展开讲Git原理只说我每天都用、最实用的一组流程。开发一个新功能时第一件事是拉最新代码、建分支git pull origin main git checkout -b feature/login改完代码查看改动和状态git status git diffgit status看哪些文件改了、哪些文件没跟踪git diff看具体改了哪些内容。这个习惯能帮你提交前再检查一遍避免把调试用的print也提交上去。提交代码git add src/ tests/ git commit -m feat: add login endpoint git push origin feature/login提交信息我习惯写得具体一点比如“feat:”表示新功能、“fix:”表示修复这样git log看起来就像一份清晰的变更日志git log --oneline -10临时要切分支但手头工作没做完先存起来git stash git stash popgit stash会把当前未提交的改动暂存起来git stash pop再恢复。很多新手一换分支就panic其实stash在手天下我有。6.2 服务器之间传文件scp和rsyncPython项目部署到服务器后经常需要在本地和服务器之间传文件。最简单的用scp# 本地文件传到服务器 scp ./app.py user192.168.1.20:/opt/app/ # 服务器文件拉回本地 scp user192.168.1.20:/opt/app/requirements.txt ./scp会把文件原样复制过去目录不存在不会自动创建。传整个目录加-rscp -r ./project user192.168.1.20:/opt/如果经常要同步大量文件我更推荐rsync它只传差异部分效率高很多。比如把整个项目同步到服务器rsync -avz --delete ./project/ user192.168.1.20:/opt/project/-a是归档模式保留权限、时间戳等-v显示进度-z传输时压缩--delete表示本地删掉的文件远程也删掉保持两边目录完全一致。我第一次用rsync同步一个包含几万个小文件的项目时scp要跑十几分钟rsync第一次同步稍微慢点后续每次只要几秒钟这个差距非常明显。7. vim没有IDE时的救急编辑器7.1 模式切换与高频操作在服务器上临时改个配置、改个Python脚本没有VS Code怎么办几乎每台Linux机器都自带vim学会基础操作能救命。vim的核心是“模式”普通模式、插入模式、命令行模式。刚打开vim是普通模式按i进入插入模式才能打字按Esc回到普通模式。保存退出是ZZ或者:wq不保存退出是:q!。在普通模式下最常用的几个操作# 向下翻半屏 Ctrld # 跳到文件开头/结尾 gg G # 按行号跳转比如跳到第100行 100G # 搜索关键词按n向下继续查找N向上回退 /error编辑Python代码时最实用的命令是批量缩进。选中多行之后按整体右移、按整体左移能快速修正缩进错误。复制粘贴是yy复制一行、p粘贴删除一行是dd这些基础操作熟练之后在服务器上改代码完全够用。7.2 几个值得写进~/.vimrc的配置vim默认界面很朴素但几行配置就能让它好用很多。我自己一直用的最小配置set number 显示行号 set tabstop4 Tab显示宽度 set shiftwidth4 自动缩进宽度 set expandtab 用空格代替Tab set syntax on 语法高亮 set mousea 支持鼠标操作把这几行写进~/.vimrc再用vim打开Python文件感受完全不同。特别是expandtabPython对缩进极其敏感如果用Tab和空格混用解释器大概率报TabError统一成空格能避免很多恶心的问题。8. 常见问题与排查技巧实录8.1 权限类问题Permission denied怎么办在Linux上跑Python脚本最常见的就是“Permission denied”。比如你写了个deploy.sh执行./deploy.sh却提示权限不够那是因为文件没有执行权限。查看权限用ls -l第一列类似-rw-r--r--如果没有x权限就执行不了。给脚本加执行权限chmod x deploy.sh如果是对某个目录没有写权限比如/var/log那就用sudo执行当前命令或者给当前用户授权sudo python3 app.py但要注意sudo执行Python脚本时脚本里操作的文件路径也都是root权限的后面改起来会有些麻烦。能不用sudo尽量不用宁可把日志目录的所有者改成当前用户sudo mkdir -p /var/log/myapp sudo chown -R $USER:$USER /var/log/myapp这样之后运行脚本就不需要sudo了日志文件也归当前用户管。8.2 “command not found”问题怎么排查这个我在前面谈PATH时提过这里归纳成一套排查步骤。第一步确认命令是否真的装了比如which pip3或pip3 --version如果提示找不到很可能pip3没装用python3 -m pip --version试试。第二步如果python3 -m pip能用而pip3不行说明pip3这个可执行文件不在PATH里。第三步检查PATH里有没有包含Python的bin目录echo $PATH安装Python包之后特别容易出现这种“python能跑但pip命令找不到”的情况我的处理方式是不纠结直接用python3 -m pip install xxx这个写法绝对可靠因为它是通过Python解释器去调用pip模块不依赖PATH。除了pippyenv安装新版本后有时也会出现“python命令还是旧版本”的情况。这时检查一下pyenv versions确认当前环境是否切换成功再which python看可执行文件路径是不是指向pyenv的shims。8.3 Python日志中文乱码问题Python程序在Linux服务器上输出中文日志经常遇到乱码。多数情况下不是程序的问题是系统的字符集不对。先检查当前localelocale如果输出里有LANGPOSIX或C.UTF-8没配置好就可能导致Python的stdout无法正确编码中文。解决办法有两个方向。第一在启动服务前设置环境变量export LANGen_US.UTF-8 export LC_ALLen_US.UTF-8第二在Python代码层面强制指定标准输出编码import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)或者更简单的方案在系统d服务里加上EnvironmentPYTHONIOENCODINGutf-8强制Python输出UTF-8编码。这几个方法对付日志中文乱码基本够用了。8.4 问题排查速查表我在团队内部做了张速查表贴出来供你参考遇到问题先对照一遍现象排查命令大概率原因解决方向端口占用报错ss -lntp | grep 端口残留进程占着端口kill对应PID接口超时ping、telnet、curl -v网络不通或服务未启动逐层确认连通性磁盘满了df -h、du -sh *日志文件过多truncate清理日志进程跑一会就挂systemctl status、journalctl缺少守护或异常退出配置Restartalwayscommand not foundecho $PATH、which 命令PATH没配置好把bin目录加入PATH中文乱码locale字符集不对设置LANG和PYTHONIOENCODINGPermission deniedls -l缺少执行或写入权限chmod或调整目录所有者日志找不到find / -name *.log 2/dev/null日志路径配置错检查配置文件路径我个人的体会是Linux命令这些东西本质上就是一套跟操作系统对话的“短语”你不需要把全网的命令都背下来只要把高频的二十来条练到不用想就能敲出来效率就能提升一大截。我在带新人的时候一直建议他们每天抽出十五分钟用ls、ps、grep、curl这几条命令去折腾一下自己的开发环境坚持两周就会发现很多以前要写一段Python脚本才能干的事命令行里一条管道就搞定了。最后再分享一个我自己的小习惯我会在~/.bashrc里把常用的长命令alias成短命令比如alias pypython3、alias gsgit status少敲几个字符长期下来真的能省不少时间。工具这东西用得顺手比花里胡哨重要希望这篇能帮你把Linux命令真正变成写Python的助力。
返回列表