这篇文章主要是写一些
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 列出所有子目录下的文件。(递归)
Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。
语法: cd 目录名
功能: 改变工作目录。将当前工作目录改变到指定的目录下.
举例:
cd … : 返回上级目录
cd ~:进入用户家目
cd -:返回最近访问目录
形如: /usr/share/tomcat/logs/ 以根目录开头的, 称为绝对路径.
形如: ./logs 以 . 或者 …开头的, 称为相对路径.
我们敲的所有的 Linux 命令, 都可以使用 tab 键来尝试补全, 加快效率
如果命令或者目录敲错了, 可以 ctrl + c 取消当前的命令
语法: touch [选项]… 文件…
功能: touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的
文件。
例如:
touch test.txt
语法: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
能够大大提高代码编辑效率. 主流的开发工具 (比如 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 指令中可以使用 | 作为管道标记.
意思是将前一个指令标准输出的内容, 作为第二个指令的标准输入内容.