ARTICLE DETAIL

资讯详情

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

Linux基础入门:高频命令与程序编译实战指南

Linux基础入门:高频命令与程序编译实战指南 在带过不少新人之后我越来越觉得“Linux 基础”这门课最难的地方不是命令本身而是很多人在还没理解命令行工作方式的时候就开始疯狂抄写网上的“linux 常用命令大全”最后抄了满满几页纸真到了服务器上还是不知道从哪下手。这篇文章不搞大而全的罗列只围绕两条主线来写日常高频的 Linux 常用命令以及程序编译的完整流程。前者解决“怎么用”后者解决“怎么编”两条线串起来基本就能覆盖从登录一台 Linux 机器到把自己写的 C/C 程序跑起来的全过程。适合刚入门 Linux 的学生、刚转运维或嵌入式开发的朋友也适合那些折腾过虚拟机但对命令行始终没有建立体系感的人。1. 先建立正确的命令学习思路1.1 一切皆文件先理解 Linux 的设计哲学再记命令很多新人打开终端第一反应是“我要背 ls、cd、mkdir、rm”然后背完很快就忘。我见过太多这样的情况原因很简单——你在死记硬背而不是在理解一个操作系统的工作方式。Linux 有一个非常核心的设计哲学一切皆文件。普通文件是文件目录是文件磁盘设备是文件甚至进程信息、网络连接状态也会以文件的形式暴露在/proc、/sys这类虚拟目录下。理解这一点之后你就会发现很多命令其实是围绕“文件”在做操作ls是列出目录内容目录也是一种文件rm是删除文件所以删除目录要加-r递归cat、less、more是查看文件内容用它们也能看设备信息cp、mv的本质是对文件数据的复制和重命名ln创建链接其实是在目录里创建一个指向目标文件的新名字。一旦你建立了“一切皆文件”的思维就不会再觉得 Linux 命令是一盘散沙。你只需要记住“操作文件”的几类动作再配合具体的参数绝大多数场景都能覆盖。还有一个很容易被忽略但极其重要的事实Linux 命令执行后默认没有成功提示。rm file执行完命令不吭声往往就是成功的报错才会有输出。这一点跟 Windows 弹窗式的交互完全不同很多新人第一次在 Linux 上删文件看到没有提示反而慌了以为没删掉。1.2 把 man、help 和 Tab 补全当成你的随身助手我在指导新人时反复强调一句话你不必记所有参数但你必须知道怎么查参数。Linux 本身已经给了你一套非常完整的帮助体系不用白不用。查看命令帮助有三种常见方式man 命令最完整的参考手册适合系统了解一个命令的全部功能命令 --help或命令 -h快速查看常用参数比 man 更容易读apropos 关键词当你忘记命令名、只记得功能时用关键词反查命令。实际操作中我的习惯是先用command --help解决 80% 的问题只有需要深入了解某个命令的全部细节时才会去看man。举个例子我想知道tar有哪些参数直接执行tar --help里面会列出常用的-c创建归档、-x解压、-f指定文件名、-zgzip 压缩等基本一眼就能找到答案。Tab 补全则是效率神器。输入命令、路径、参数时按两下 Tab 可以列出候选值。我见过很多资深工程师敲命令都特别快秘密之一就是他们很少完整输入长路径都是敲前几个字符然后 Tab 补全。这样既快又不容易打错。另外说一句man 手册打开之后是按空格翻页、按 q 退出的 Vim 操作模式我第一次用的时候卡在里面出不来差点以为终端崩了。这种小细节我会在后面的章节里一并提醒。1.3 先准备一个可以随便折腾的虚拟机环境学习 Linux 命令和编译别一上来就在生产服务器上试。我的建议是本地装一个虚拟机用 VM 虚拟机或 VirtualBox 都行装上 CentOS Stream、Ubuntu Server 或 Debian 这类主流发行版然后随便折腾。装坏了、配置乱了、删错文件了重置快照就能恢复。如果你用的是 Windows虚拟机创建向导一般就是“新建虚拟机 → 选择镜像 → 分配 CPU 和内存 → 磁盘大小 → 完成安装”这几步。配置方面有个经验值内存至少分 2GB硬盘至少 40GB网络用 NAT 模式方便宿主机访问虚拟机。装完系统后建议再安装一个 SSH 服务端这样你就能用宿主机上的终端工具比如 FinalShell 或 VSCode 的 Remote-SSH连进去操作体验比在虚拟机窗口里敲命令好得多。如果你已经在用 WSLWindows Subsystem for Linux也可以把 WSL 当作练习环境日常跑命令完全够用。但 WSL 和真实 Linux 虚拟机在系统初始化、内核模块、服务管理上还是有一些差异的如果你以后要从事运维工作我建议还是优先用虚拟机。2. 日常高频的 Linux 常用命令脉络2.1 文件与目录操作高频命令的语义和区别文件操作是使用频次最高的命令群也是很多新人在参数上最容易混淆的地方。我把最常用的一组整理出来并解释每个命令的核心语义而不是只罗列参数。pwd显示当前所在目录。没有太多可说的迷路时先敲它。ls列出目录内容。常用组合ls -l长格式显示权限、属主、大小、时间、ls -a显示隐藏文件、ls -lh人类可读大小。cd切换目录。这里有个容易踩坑的点cd和cd ~都是回到当前用户的家目录但cd /是切到根目录cd ..是返回上一级。新人经常在“根目录”和“家目录”之间搞混。cp复制文件或目录。复制目录必须加-r即cp -r source_dir target_dir。保留文件原有属性可以用cp -p这在备份配置文件时非常有用。mv移动文件或重命名。mv oldname newname就是重命名mv file /path/to/dir就是移动。mv 在同一文件系统内是“改个目录项”的操作速度很快跨文件系统移动则涉及真正的拷贝和删除。rm删除文件或目录。删除目录同样要加-r即rm -r dir。新手务必记住Linux 没有回收站rm删掉的文件很难再找回来。重要文件删除前我建议先ls确认路径再执行rm或者干脆用mv file /tmp/先把文件挪到临时目录确认不用了再清掉。ln创建链接。不加参数创建的是硬链接加-s创建的是软链接符号链接。软链接类似 Windows 的快捷方式指向目标文件的路径硬链接则是多个文件名指向同一个文件节点。实际操作中软链接用的更多比如把某个程序的安装路径软链接到/usr/local/bin下。还有两个查看文本文件的高频命令cat把文件全部内容打到屏幕上适合短文件less支持分页和上下滚动适合长文件、日志按 q 退出。对于日志文件这种可能很大的内容千万别上来就cat你会被刷屏到怀疑人生用less或者tail -n 50看末尾部分才是常态。2.2 权限是新手第一道坎用户、组、chmod 与 chown 的配合Linux 是多用户操作系统权限管理是它的命根子也是新手最容易被卡住的地方。出现Permission denied这类报错八成就是权限没配置对。先看权限表示方式。执行ls -l后输出中类似-rw-r--r--的一段就是权限位。第一位是文件类型-表示普通文件d表示目录l表示软链接。后面九位分成三组每组三个字符分别代表“属主user”、“属组group”、“其他用户others”的权限r是读、w是写、x是执行。修改权限用chmod有两种常见写法符号模式chmod ux script.sh表示给属主增加执行权限chmod go-w file表示去掉属组和其他人的写权限数字模式把r记为 4、w记为 2、x记为 1三者相加得到一组权限的数字例如chmod 755 script.sh表示属主有 rwx7属组和其他人有 r-x5。修改属主和属组用chown例如chown user:group file或chown user file。注意修改属主通常需要 root 权限所以命令前面一般要加sudo。如果你是刚入门我给一个安全建议权限宁严勿松。普通文件和脚本用755或644就够了别图省事直接chmod 777。777意味着所有用户都能读写执行这在多用户的服务器上是非常危险的习惯。用户管理方面useradd用来创建用户passwd设置或修改密码userdel删除用户。实际操作中经常配合sudo使用sudo是让普通用户临时以 root 身份执行命令。配置一个用户能否使用 sudo通常是在/etc/sudoers文件里添加一行授权记录但这个文件一定要用visudo命令编辑直接改文件一旦语法错误可能导致整个 sudo 无法使用。2.3 看系统状态进程、资源、磁盘和网络拿到一台 Linux 服务器第一步不是急着跑业务而是先看它的“身体状况”。这组命令是运维排查的基础也是高频面试题。查看进程用ps。最常用的组合是ps -ef或ps aux两者都能显示进程的 PID、父进程、CPU 和内存占用、启动命令等。如果想实时查看系统资源占用用top它相当于 Linux 的任务管理器按P按 CPU 排序按M按内存排序按q退出。排查内存问题时free -h是最快的命令-h表示以人类可读的 G/M 为单位显示。这条命令看的是内存总量、已用、可用和缓存占用我在实际中经常用它判断“内存到底够不够”。需要注意Linux 会把空闲内存用作缓存所以“可用”值通常比“空闲”值更重要别看到 used 很高就慌张。磁盘使用情况用df -h查看整体分区占用用du -sh 目录名查看某个目录占了多少空间。排查“磁盘满了”的问题时我的习惯是先用df -h找到满的分区再进到该分区下用du -sh *逐级找大目录定位哪个目录在“吃”空间。网络这块早期ifconfig用得很多现在更推荐用ip addr查看网卡 IP用ss -tlnp查看监听端口和对应进程。排查网络连通性用ping需要看到达某个域名或 IP 的延迟和丢包情况排查端口通不通可以telnet ip 端口或者用/dev/tcp方式测试。服务管理方面CentOS 7 之后的主流系统都使用systemctl例如systemctl start nginx、systemctl enable nginx开机自启、systemctl status nginx查看状态。这个命令体系替代了老的service和chkconfig你只需要记住 start、stop、restart、enable、status 这几个动作基本就够用了。3. 程序编译从源码到可执行文件的全过程3.1 一次编译的四个阶段预处理、编译、汇编、链接很多人在 Windows 上用 Visual Studio 点一下“生成”就能跑程序对背后发生了什么完全没概念。到了 Linux 上用 gcc/g 编译程序需要手动敲命令、看报错就蒙了。其实程序编译的过程并不复杂它本质上是在做“翻译”把 C/C 源码翻译成机器能执行的指令。以 C 语言为例一个hello.c文件用gcc hello.c -o hello编译看似是一条命令实际上内部经历了四个阶段预处理Preprocessing处理#include、#define等预处理指令。这一步相当于把#include stdio.h的内容展开把宏替换成实际内容。可以通过gcc -E hello.c -o hello.i查看预处理后的文件里面会多出大量头文件的内容。编译Compilation把预处理后的 C 代码翻译成汇编代码。汇编代码是介于高级语言和机器码之间的文本可以通过gcc -S hello.c -o hello.s查看能隐约看到一些指令助记符。汇编Assembly把汇编代码翻译成机器码生成目标文件hello.o这个文件是二进制格式还不能直接运行。链接Linking把目标文件与所需的库文件链接在一起生成最终的可执行文件。比如你调用了printf链接阶段就要把 C 标准库中printf的实现代码“接”进来。明白了这四个阶段你就知道编译出错时该怎么定位问题了。如果在预处理阶段出错通常是你写错了头文件路径或宏定义如果在编译或汇编阶段出错通常是源码有语法问题如果在链接阶段出错最常见的报错是“undefined reference to xxx”说明你声明了某个函数但链接器找不到它的实现常见原因是缺少了对应的库文件。比如用到 math 库函数编译命令需要加-lm用到 pthread 线程库要加-lpthread。C 程序用g编译基本逻辑和 gcc 一样。比如一个 cpp 文件后面还跟着一连串的图片根本没法看。后来我就只用less或tail -100来翻日志。排查的顺序也有讲究。我习惯先看系统层再看应用层。系统层看内存和磁盘free -h看内存是否耗尽df -h看磁盘是否写满应用层看日志journalctl -u 服务名 --since 10 minutes ago看 systemd 服务的近期日志或者直接去/var/log/下面找对应的日志文件。网络日志排查时先用ping判断基础连通性再用ss -tlnp看端口是否在监听最后才去看防火墙规则。很多“连不上数据库”“连不上 Redis”的问题其实都是端口没监听或被防火墙拦住了。大多数入门级报错按照“先系统层、后应用层、最后代码层”的顺序走一遍基本都能定位到问题所在。4.2 新手最容易踩的坑清单权限、路径、编码和空格我整理了一份高频踩坑清单都是我在带人和实际运维中反复见到的问题。第一个坑是权限。Permission denied出现时先检查文件属主和当前用户是否一致检查目录是否有执行权限。这里有个很容易忽略的细节进入一个目录需要该目录的执行权限而不只是读权限。你有一个目录权限是rw-没有x你是无法cd进去的即使你能看到目录内容。第二个坑是路径。Linux 的路径分隔符是/不是 Windows 的\。新手经常把 Windows 路径直接搬过来用导致No such file or directory。另外相对路径和绝对路径要分清脚本里建议多使用绝对路径避免因为当前目录不对而找不到文件。第三个坑是编码。在 Windows 上编辑过的文件传到 Linux 下经常会出现中文乱码尤其是日志和配置文件。这是因为文件编码不一致Windows 常用 GBK/GB18030Linux 常用 UTF-8。处理方法之一是安装dos2unix工具执行dos2unix 文件名转换格式解压 zip 文件时出现中文乱码可以尝试unzip -O GBK 文件名.zip指定编码。第四个坑是文件名里的空格。Linux 命令行按空格切分参数所以遇到文件名里有空格的文件必须加引号或转义符。比如要查看my file.txt正确做法是cat my file.txt或cat my\ file.txt。写脚本时如果遍历到带空格的文件名处理起来特别容易出 bug我个人的建议是给文件命名时尽量用下划线代替空格。第五个坑是 shell 脚本的换行符。Windows 下写的.sh脚本拿到 Linux 上执行经常报bad interpreter: /bin/bash^M这也是编码和换行问题用dos2unix处理脚本文件即可解决。还有一个 WSL 用户经常遇到的现象在 WSL 里删除了一个大文件但 Windows 侧磁盘空间没有立即释放。这通常是因为 WSL 的虚拟磁盘不会在删除文件后自动回缩。解决方法是执行wsl --shutdown关闭 WSL 实例然后在 Windows 侧执行Optimize-VHD针对 Hyper-V 虚拟磁盘或使用diskpart的compact vdisk指令压缩虚拟磁盘。在虚拟机里删除文件后物理磁盘空间不释放也是同样的原理。4.3 我常用的几个提高效率的小习惯最后分享几个我自己的使用习惯这些细节不一定会出现在教科书里但对日常工作效率的提升非常明显。第一是善用历史命令。按上箭头可以翻出上一条命令按Ctrl R可以反向搜索历史命令。你敲过一遍的长命令第二次就不用再敲了。历史记录默认存在当前用户家目录的.bash_history文件里用history命令也能查看。第二是给高频命令做别名。打开~/.bashrc文件在里面加alias llls -lh、alias lals -a重新登录或执行source ~/.bashrc后生效。我自己常年保留几个固定的 alias比如alias ..cd ..把退目录的操作缩短到两个字符。第三是写脚本时先加set -x或set -e。set -x会在执行脚本时打印每一条实际执行的命令排查问题的时候视野清晰很多set -e则让脚本在某条命令失败时立即退出避免“带着错误继续跑”导致更严重的后果。第四是把 Tab 补全养成肌肉记忆。不仅是路径命令参数也能补全比如 systemctl 服务名、yum 包名都可以用 Tab 补全。多练一段时间你会发现敲命令的速度提升非常明显。说到编译和运维很多新人会问“要不要背命令”。我的看法是命令是工具不是考点。你不需要把几百条命令全部背下来但要把最常用的那几十条练到条件反射的程度剩下的靠--help和 man 随时查。真正值钱的能力是你拿到一台机器后能快速搞清楚它现在的状态遇到报错能顺着日志一步步定位原因而不是把手册背得滚瓜烂熟。带新人这几年我常说一句话Linux 不是背出来的是用出来的。你在一台虚拟机上把文件操作、权限设置、编译流程完整地跑过几遍比看十篇“linux 常用命令大全”都管用。这篇文章给了你两条清晰的路径——高频命令和程序编译接下来要做的就是打开终端把命令敲一遍把编译流程走一遍。开始动手吧。
返回列表