这篇文章主要是写一些
Linux中常用的命令,属于入门了哈哈(主要是针对Java的学习)
那么首先既然是入门,我们也得知道Linux这玩意到底是咋读的把?
大家可能多多少少也听旁边的人说过很多种发音
1.李纽克斯
2.李娜克死(官方发音)
3.李ne克死
4.里尼克斯
。。。
这么多种读音,以后工作遇见很多人很多种读法我们也不要去和别人争论对错,特别是面试的时候面对面试官的时候哈哈。我们知道她流传在民间有很多种读法就可以了。
另外再来介绍一下Linux的作者**linus**
先不说这老哥有多牛批,首先帅是真的帅,Linus发明Linux系统的时候,他还在读大学,在一次假期,无聊自己写了一个操作系统玩玩,也就是现在的Linux,当时这老哥就把这个操作系统给发到论坛上面去了,突然之间Linux就爆红了,现在Linux已经变成世界上第一大操作系统。
有的同学可能表示,Linux都是世界第一大操作系统了, 我咋还没听说过? 不, 其实你听说过. 安卓系统本质上就是Linux.以及服务器领域,嵌入式设备,移动端都遍布了Linux的身影。
这老哥无聊的时候做了两个名垂青史的大事,第一个就是Linux,第二个就是GitHub,没想到把哈哈,大概到2000年以后,这老哥觉得已有的代码管理工具,对于Linux来说不方便,于是便自己发明了一个,名字就叫Git
关于这个章鱼猫其实也有一个小故事哈哈,据说,当年Linus老哥在睡觉的时候,梦中遇见了一只隐隐约约长的猫头的大章鱼。因此,就出现了现在这个logo。
Linux 虽然也有图形化界面, 但是在 服务器 / 嵌入式设备上往往都是通过命令行的方式操作的. 因此学习Linux 命令就是使用 Linux 的重要基础. 使用命令相比于使用图形界面主要有以下好处:
节省系统资源: 运行图形界面需要让系统付出一些额外的资源开销. 尤其是对于配置比较低的
嵌入式设备, 这一点至关重要.
节省网络带宽: 如果通过网络访问服务器, 使用图形界面需要传输一帧一帧的图像, 而使用命令只需要传输简单的字符串.
便于批量执行任务: 可以通过一些 “脚本” 代码 (比如 Linux Shell) 来批量执行一些任务, 完成
一些简单的编程工作. (比如定时备份文件, 删除文件等)
Linux 自身提供了一些 API, 供程序猿调用来完成一些更复杂的编程任务(比如文件操作, 多线程编程, socket 编程等). 但是由于 Java 跨平台的特性, 这部分功能已经被 Java 自身封装好了 (流对象, Thread 对象, Socket 对象等). 所以这部分内容我们不必再学习了
我们自己写的 web 程序, 要想让其他的用户能够访问, 就需要发布到服务器上. 这是我接下里重点学习的内容.
小结: 对于 Java 程序猿, 关于 Linux 重点学习 基础命令 和 项目部署 即可
要想学习 Linux , 需要先有一个 Linux 的环境.
主要有四种:
- 直接安装在物理机上. 但是由于
Linux桌面使用起来非常不友好. [不推荐].- 使用虚拟机软件, 将
Linux搭建在虚拟机上. 但是由于当前的虚拟机软件(如VMWare之类的)存在 一些bug, 会导致环境上出现各种莫名其妙的问题, 比较折腾. [非常不推荐]- 使用
WSL (Windows Subsystem for Linux). 这个是Windows近几年开发的新功能, 在Windows系统内集成了一个Linux. 但是目前这个技术还不够成熟. [暂时不推荐].- 使用云服务器, 可以直接在 腾讯云, 阿里云或华为云 等服务器厂商处直接购买一个云服务器. [墙裂 推荐]
使用云服务器不仅环境搭建简单, 避免折腾, 同时还有一个最大的好处, 部署在云服务器上的项目可以直接被外网访问到, 这个时候就和一个公司发布一个正式的网站没有任何区别. 也就能让我们自己写的程序真的去给别人去使用
我自己是买了一个腾讯云的云服务器( CentOS 7.6 64位)用来学习Linux内容。然后使用终端软件来连接到Linux。
常见的终端软件: XShell Putty MobaXTerm Iterm2 SecureCRT …
我自己用的是XShell
下载安装 XShell 下载地址: https://www.netsarang.com/en/free-for-home-school/
这个地方才是今天的重点,
Linux的指令有很多,我们这里只介绍最最最常见常用的操作命令。大概也就十几个,不过就这十几个命令就足以覆盖到了工作中大部分内容。
语法: ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
常用选项:
-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录
-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件
-l 列出文件的详细信息。
-r 对目录反向排序。
-t 以时间排序。
-R 列出所有子目录下的文件。(递归)
语法: pwd
功能:显示用户当前所在的目录
Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。
语法: cd 目录名
功能: 改变工作目录。将当前工作目录改变到指定的目录下.
举例:
cd … : 返回上级目录
cd ~:进入用户家目
cd -:返回最近访问目录
Linux 是一个树形目录结构.
几个特殊的目录: / 称为根目录 . 称为当前目录 … 称为当前目录的上级目录
形如: /usr/share/tomcat/logs/ 以根目录开头的, 称为绝对路径.
形如: ./logs 以 . 或者 …开头的, 称为相对路径.
我们敲的所有的 Linux 命令, 都可以使用 tab 键来尝试补全, 加快效率
如果命令或者目录敲错了, 可以 ctrl + c 取消当前的命令
语法: touch [选项]… 文件…
功能: touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的
文件。
例如:
touch test.txt
语法:cat [选项] [文件]
功能: 查看目标文件的内容
例如:
cat helloworld.java
语法:mkdir [选项] dirname…
功能:在当前目录下创建一个名为 “dirname”的目录
常用选项:
-p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多级目录
举例:
mkdir –p test/test1 : 递归建立多个目录
语法:rm [-f-i-r-v] [dirName/dir]
功能:删除文件或目录
常用选项:
-f 即使文件属性为只读(即写保护),亦直接删除
-i 删除前逐一询问确认
-r 删除目录及其下所有文件
举例:
rm test
重要注意事项:
千万不要运行 rm -rf / , 尤其是在公司的生产服务器上.
理解递归删除的过程:

语法:cp [选项] 源文件或目录 目标文件或目录
功能: 复制文件或目录
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息
常用选项:
-f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
-i 或 --interactive 覆盖文件之前先询问用户
-r递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录
或符号链接,则一律视为普通文件处理
-R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理
语法: mv [选项] 源文件或目录 目标文件或目录
功能
1 视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移 至一个新的目录中。
2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目 录名),它将所给的源文件或目录重命名为给定的目标文件名。
3. 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源 文件均移至目标目录中。
常用选项
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
举例:
Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。
语法: man [选项] 命令
常用选项
-k 根据关键字搜索联机帮助
num 只在第num章节找
man man 能够看到 man 手册中的若干个章节及其含义
举例:
man ls
语法: less [参数] 文件
功能:查看文件内容. 不会立刻把所有文件内容加载到内存中. 也能进行查找.
选项:
j k / 方向键: 向上向下滚动屏幕.
-N 显示每行的行号
/字符串:向下搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
q: 退出
语法:head [参数]… [文件]…
功能:head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
选项:
-n<行数> 显示的行数
语法: tail [必要参数] [选择参数] [文件]
功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
选项:
-f 循环读取
-n<行数> 显示行数
举例:有一个文件共有100行内容,请取出第50行内容
方法1
head -n50 test > tmp # 将前50行装入临时文件 tmp
tail -n1 tmp # 得到中间行
#方法2
head -n50 test | tail -n1
date 指定格式显示时间: date +“%Y-%m-%d %H:%M:%S”
date 用法:date [OPTION]… [+FORMAT]
1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记
%H : 小时(00…23)
%M : 分钟(00…59)
%S : 秒(00…61)
%X : 相当于 %H:%M:%S
%d : 日 (01…31)
%m : 月份 (01…12)
%Y : 完整年份 (0000…9999)
%F : 相当于 %Y-%m-%d
2 时间戳
时间->时间戳:date +%s
时间戳->时间:date -d@1508749502
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从1970年1月1日 (UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒.
vim 是一个知名的文本编辑器. 前面学习的 cat, less, head, tail 等命令只能查看文本, 不能编辑文本. 使 用 vim 就可以进行编辑了
vim 就相当于 Windows 的记事本. 只不过功能比记事本强大一些.
1)创建文件/打开文件
vim [文件名]
2)进入插入模式
vim 打开文件后默认是普通模式. 普通模式下键盘的按键表示一些特殊功能的快捷键. (例如按下 j 并不是输入字母 “j”, 而是表示光标往下移动一行). 需要进入插入模式才能进行文本编辑. 使用 i 键可以进入到插入模式. (左下角提示 --INSERT-- ) 然后就可以像记事本一样正常编辑了.
3)保存
在插入模式下不能保存文件, 需要先回到 普通模式 . 按下 Esc 回到普通模式.
在普通模式下输入 :w , 再按下回车, 即可保存文件.
4)退出
在插入模式下不能退出, 需要先回到 普通模式.
在普通模式下输入 :q , 再按下回车, 即可退出.
也可以直接使用 :wq 同时执行保存和退出.
关于 Vim 的用法还有很多. 此处不做过多介绍了. 有兴趣的小伙伴可以参考 vimtutor (直接在终端输入vimtutor 即可进入官方教程) 和 <<Vim 实用技巧>>

熟练使用 Vim 能够大大提高代码编辑效率. 主流的开发工具 (比如 IDEA, VSCode 等) 都支持 Vim 风格的快捷键. 遗憾的是熟练使用 Vim 并不是一件容易的事情, 可能需要长达几年的练习.
语法:grep [参数]… [文件]…
功能:用于查找文件中是否包含指定字符串, 并显示对应的行.
选项:
-n<行数> 显示的行数
-w 全字匹配. 要求整个单词都完全相同的结果才能匹配出来, 而不仅仅是一个单词的一部分.
-r 递归查找. 可以搜索多级目录下的所有文件.
–color 高亮查找到的结果
–include 指定查找某些文件
–exclude 指定排除某些文件
举例:
grep “hello” Hello.java
语法:ps [参数]… 功能:用于查看当前系统上运行的进程
选项:
a 显示一个终端的所有进程
u 以用户为主的格式来显示程序状况
x 显示所有程序,不以终端机来区分
举例:
ps aux # 显示系统上所有的进程
ps aux | grep “进程名”
ps aux | grep “进程id”
语法:netstat [参数]… 功能:查看系统上的网络状态.
选项:
-a 显示所有正在或不在侦听的套接字
-n 显示数字形式地址而不是去解析主机、端口或用户名
-p 显示套接字所属进程的PID和名称
举例:
netstat -anp
netstat -anp | grep “进程名”
netstat -anp | grep “端口号”
Linux 的很多指令, 如 cat head tail 等都是默认输出到 “标准输出” 中, 也就是显示器上的. 可以通过 > 这样的符号把本来要输出到标准输出上的内容写到特定文件中. 这样的操作称为 “重定向”.
重定向有三种方式:
先构造一个文件, 里面添加一些内容.
cat < test.txt
cat test.txt > test2.txt
尝试删除一个不存在的文件
rm aaa > test.txt
输出结果, 这个提示并没有被重定向到 test.txt 文件中.
rm: cannot remove ‘aaa’: No such file or directory
正确做法
rm aaa 2> test.txt
标准输入, 标准输出, 标准错误是三个特殊的文件, 每个进程在启动的时候都会默认打开. 分别对应到键盘, 显示器, 显示器这样的设备.
在 Java 中, 分别对应到 System.in , System.out , System.err
管道是一种古老的 “进程间通信” 方式. 在 Linux 指令中可以使用 | 作为管道标记.
意思是将前一个指令标准输出的内容, 作为第二个指令的标准输入内容.