linux命令学习笔记
[TOC]
0. 前言
一篇关于linux简单命令的学习笔记。
在linux的/bin/
目录下包含一些基础命令的可执行文件(二进制文件)。
以下命令格式中,略去命令选项。
1. 文件管理
cd
~
到用户HOME目录/
到系统根目录-
退到上一个进入的目录
ls
格式:ls <选项> <目录>
主要选项:-a
查看当前目录下所有文件和目录,包括隐藏文件-A
同 -a ,但不列出 “.” (目前目录) 及 “..” (父目录)-S
按文件大小排序列表-l
使用长列表格式列出详细信息-t
按文件的最后修改时间排序列表。-c
(1)与-lt一起用时按照存取时间来排序列表,并在列表中显示存取时间的值,其中存取时间是文件状态信息中的最后修改时间;(2)与-l一起用时按照文件名来排序列表,但在列表中显示存取时间。-full-time
显示每个文件的完全日期和时间-h
以人们易读的格式显示文件大小(“K”,”M”,”G”)-i
显示文件的节点号-r
反序列表-R
递归显示子目录中的内容-s
以磁盘块个数的形式显示每个文件的大小-time=WORD
将WORD作为时间显示以代替文件的最后修改时间。
ls -ilh
后显示:
1 | total 28K |
- 第一字段:inode(文件或目录索引点,相当于指向文件在磁盘中数据的指针)
- 第二字段:文件种类(
-
表示正常文件,d
表示目录,l
表示链接文件)和权限(rwx,共9位,分别控制文件属主、所属用户组以及其它用户的权限) - 第三字段:硬链接个数
- 第四字段:文件属主
- 第五字段:文件所归属的用户组
- 第六字段:文件或目录的大小(字节)
- 第七字段和第八字段:最后访问或修改时间
- 第九字段:文件名或目录名
mkdir
创建一个目录
格式:mkdir <dir>
主要选项:-m
设置许可模式-v
为每一个创建的目录显示一条消息
rmdir
删除一个空目录
格式:rmdir <dir>
rm
删除(remove)
格式:rm <选项> <文件或目录>
主要选项:-i
以询问的方式删除-f
强制删除-r
递归删除,删目录时
rm -rf
强制递归删除过于暴力,且删除后还无法复原。因此,我常自定义删除文件/目录的命令,在~/.bashrc
中添加:
1 | alias rm='echo "please use trash"' |
mv
移动(move)
格式:mv <文件A或目录A> <文件B或目录B>
说明:
该命令有重命名的作用,当xxB不存在时,会将xxA重命名为xxB
cp
复制(copy)
格式:cp <文件A或目录A> <文件B或目录B>
pwd
显示当前绝对路径
cat
只读形式显示文件内容
格式:cat <文件>
主要选项:-b
计算所有非空输出行,开始为1。-e
在每行末尾显示$符号。-n
计算所有输出行,开始为1。-s
将相连的多个空行用单一空行代替。
head
显示文件开头。
常用选项:
-n <count> == -<count>
显示前 count 行,默认为 10 。
常用:
head -20 file.log
显示前 20 行
tail
显示文件结尾。
常用选项:
-n <count> == -<count>
显示后 count 行,默认为 10 。-f
不断获取文件新添加的数据。
常用:
tail -f log
查看不断更新的日志。
file
格式:file <file/dir>
查看文件类型
more
分页显示文件的内容
格式:more <file>
说明:
分页显示文件内容查看时:
- 上下左右键进行翻阅
q
键退出。
less
more
命令的进阶版
说明:less
= more
+ vi
在分页查看文件内容时,还可以:
- 使用
/pattern
从头向尾查找显示字符串 - 使用
?pattren
从尾向头查找显示字符串
touch
新建文件
格式:touch <文件>
chmod
修改文件权限。
在linux中,一个文件的权限范围有:
u
:User,即文件或目录的拥有者。g
:Group,即文件或目录的所属群组。o
:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。a
:All,即全部的用户,包含拥有者,所属群组以及其他用户。
而,文件的权限又分为:
r
:读取权限,数字代号为 4w
:写入权限,数字代号为 2x
:执行或切换权限,数字代号为 1-
:不具任何权限,数字代号为 0
查看文件权限用 ls -l
命令,就会显示每个文件u,g,o范围的权限。
修改一个文件的权限大致有两种方法,如:
chmod u+x <file>
file 的 u(即文件所拥有者)
新增 x(执行权限),u-x
即对该范围取消 x 权限
chmod 755 <file>
表示对file的 u,g,o 范围分别赋予 7,5,5 权限。7=1+2+4,指rwx权限;5=1+4,指r-x权限;同理,还有 0,2,4,6 等权限。
理解:
为何任意一个小于7数字就能表示一种三个权限的组合呢?我猜想是因为这是个三位的二进制数。x
是第一位,w
是第二位,r
是第三位,0和1表示权限关和开。所以,7
的二进制为111
,表示三个权限都开启;5
的二进制为101
,表示r
和x
权限开启。
chown
修改文件/目录的属主。
chown root test/
将test/
目录的属主改为root
。
chgrp
修改文件/目录的属组。
chgrp root test/
将test/
目录的属组改为root
。
wc
依次显示文件的行数,单词数和字符数
格式:wc <文件>
主要选项:-l
只显示行数-w
只显示单词数-c
只显示字符数
find
查找文件或目录
主要选项:-name <文件>
匹配要名字相同的文件,要找的文件名字包括在引号中,可以使用通配符(*和?)-perm <模式>
匹配所有模式为指定数字型模式值的文件。不仅仅是读,写和执行,所有模式都必须匹配。如果在模式前是负号(-),表示采用除这个模式外的所有模式。-user <用户号>
匹配所有用户序列号是前面所指定的用户序列号的文件,可以是数字型的值或用户登录名。-atime n
匹配所有在前n天内访问过的文件。-mtime n
匹配所有在前n天内修改过的文件。-newer <文件>
匹配所有修改时间比file文件更新的文件。-size n
匹配所有大小为n 块的文件(若k在n后,则为1K字节块)。-print
显示整个文件路径和名称。一般来说,如果没有这个选项,find命令进行所要求的搜索是不会显示结果的。
示例:find ~/go/src/ -name "beego" -print
通过文件名查找,并打印出文件或目录的路径find ~/go/src/ -name "bb*" -print
根据部分文件名查找。会匹配名字为 bba、bbhj、bbac 等文件或目录。find /etc –size 2500b –print
根据文件的特征查询。例如,知道一个文件尺寸小于为2500bytes
注解:
通配符又称多义符。在描述文件时,有时在文件名部分用到一些通配符,以加强命令的功能。与正则表达式很像。
?
:表示该位置可以是一个任意字符。*
:表示该位置可以是零个或多个任意字符。[charset]
:可选择charset集中的任何单个字符。例如:ls name[1-5].png
会列出name1.png、name2.png…
tar
加密解密,此处参照大神博客。
常用选项:
c
Create archive.tar from files. 压缩到.tar
x
Extract all files from archive.tar. 从.tar
解压f
指定解/压缩文件名v
显示解压过程z
解/压缩.tar.gz
结尾的压缩包C dir/
解压到指定目录
常用示例:
tar -cvf archive.tar file/
压缩成 tartar -czvf archive.tar.gz file/
压缩成 tar.gztar -xvf archive.tar
解压 tartar -xzvf archive.tar.gz
解压 tar.gz
ln
对文件或目录建立链接(其中的软链接,类似于Windows的快捷方式)。
分类:硬链接(Hard Link),符号链接(Symbolic Link)。
硬链接
默认情况下,ln产生硬链接。
建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。有硬链接关系的两个文件的inode值相同。
当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。可以这么理解,互为硬链接关系的文件,他们好象是克隆体,他们的属性几乎是完全一样;硬链接关系的文件是无法区别的。
格式:ln <选项> <源目录/文件> <目标目录/文件>
说明:ln a.c ~/
如果最后一参数是一个已存在的目录,那么ln命令就在目录下创建与各个目标相连的链接,而且名字也与目标相同。ln a.c ~/b.c
如果给出了两个文件名,那么命令生成一个从第二个文件指向第一个文件的链接。ln a.c
如果只给出了一个目标,ln就在当前目录下生成一个指向目标的链接。
软链接
软链接也叫符号链接,其实就是快捷方式。
格式:ln -s 源文文件或目录 目标文件或目录
示例:$ ln -s /mnt/d/my_code/ ~/link_my_code
软链接一个目录到另一个目录下时,用绝对路径
$ ln -s my_code/ ~/link_my_code
这样是错误的,因为~/下没有my_code这个目录
区别
1)硬链接相当于拷贝了指向文件数据的“指针”(文件索引结点信息)过来。而软链接记住的,是文件索引结点所在的目录,似乎是一个“指针”的指针。
2)若一个文件有多个硬链接,删除其中一个文件后,文件数据其实并未删除,还可以通过其它硬链接找到这个文件,只是文件的硬链接个数会减一。而软链接,删除源文件后,软链接就不可用了,此处很像window的快捷方式。
注:不管软硬链接,修改一个文件,另一个文件也会被修改。
2.进程与内存管理
ps
查看进程(process)
主要选项:-A
显示所有进程(等价于-e)-a
显示一个终端的所有进程,除了会话引线-N
忽略选择。-d
显示所有进程,但省略所有的会话引线-x
显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。-p pid
进程使用cpu的时间-u uid 或 username
选择有效的用户id或者是用户名,如 -u test 查看test用户-g gid 或 groupname
显示组的所有进程。U username
显示该用户下的所有进程,且显示各个命令的详细路径。如: U test-f
全部列出,通常和其他选项联用。如:ps -fa 或 ps -fx-l
长格式(有F,wchan,C 等字段)-j
操作格式-o
用户自定义格式。v
以虚拟存储器格式显示s
以信号格式显示-m
显示所有的线程-H
显示进程的层次(和其它的命令合用,如:ps -Ha)e
命令之后显示环境(如:ps -d e; ps -a e)h
不显示第一行
常用:
ps -aux
,执行后,显示的头部如下:
1 | 用户 进程id CPU使用率 内存使用率 状态 开始日期 开始时间 命令 |
其中STAT
有以下几种状态:
D
: 不可中断的静止R
: 正在执行中S
: 静止状态T
: 暂停执行Z
: 不存在但暂时无法消除W
: 没有足够的记忆体分页可分配<
: 高优先序的行程N
: 低优先序的行程L
: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
kill
kill -stop pid
发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。
kill -cont pid
发送SIGCONT (19,18,25)重新开始一个停止的进程。
kill -kill pid
发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。
kill -9 -1
终止你拥有的全部进程。
top
动态显示任务管理器。
free
查看内存使用情况。
-h
自动转换单位,显示 B K M 等。
常用:
free -h
,输出示例如下:
1 | $ free -h |
3. 用户管理
linux多用户概念
root 权限最高的主用户,HOME目录为 /root/
其它(如test) 权限较小的用户,HOME目录一般为 /home/test/
~
用户HOME目录。 cd ~
或 cd
回到HOME目录,cd ~/go/src/
去HOME目录下的go/src/目录
/
系统根目录。 /bin/ 为系统根目录下的bin目录
su
切换用户
格式:su <name>
切换到某个用户,没加用户名则默认登录root用户。
useradd
创建新用户
格式:useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name
主要选项:-c
:加上备注文字,备注文字保存在passwd的备注栏中。-d
:指定用户登入时的主目录。默认值/home/<用户名>-D
:变更预设值。-e
:指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12。缺省表示永久有效。-f
:指定在密码过期后多少天即关闭该账号。如果为0账号立即被停用;如果为-1则账号一直可用。默认值为-1.-g
:指定用户所属的群组。值可以使组名也可以是GID。用户组必须已经存在的,期默认值为100,即users。-G
:指定用户所属的附加群组。-m
:自动建立用户的登入目录。-M
:不要自动建立用户的登入目录。-n
:取消建立以用户名称为名的群组。-r
:建立系统账号。-s
:指定用户登入后所使用的shell。默认值为/bin/bash。-u
:指定用户ID号。该值在系统中必须是唯一的。0~499默认是保留给系统用户账号使用的,所以该值必须大于499。
说明:
用 useradd 创建账号之后,再使用passwd设定账号的密码。
各用户的信息都保存在 /etc/passwd
文件中。
各用户组的信息都保存在 /etc/group
文件中。
示例:useradd -m test
创建test用户并自动建立用户登录目录
passwd
格式:passwd <name>
为name用户创建密码
赋予用户管理员权限
修改 /etc/sudoers
文件如下:
1 | # User privilege specification |
注意: 该文件是只读权限,需要先给文件增加写权限,再进行修改。
1 | root@iZuf697sx3nms8k9zb2kw4Z:~# chmod a+w /etc/sudoers |
修改完后还要将该文件改回只读权限,不然用户使用sudo
时会报错:
1 | sudo: /etc/sudoers is world writable |
userdel
格式:userdel <name>
删除名为name的用户
4.网络管理
netstat
主要选项:
-t
仅显示TCP相关选项-u
仅显示UDP相关选项-n
拒绝显示别名,能显示数字的全部转化为数字。直接通过ip地址,而不通过域名服务器-l
仅列出在Listen(监听)的服务状态-p
显示建立相关链接的程序名-a
显示所有连接中socket
常用:
netstat -tnlp
ssh
远程连接。
一般默认安装,若不存在,则服务端需安装 openssh-server
,客户端需安装 openssh-clients
。
ssh 服务名为 sshd
,可通过 service sshd start
启动。
常用选项:
-p
指定端口。-i
指定密钥。
示例:
ssh root@192.168.0.20
口令验证(密码)或密钥免密验证ssh -i test.key test@192.168.0.12
密钥登录指定密钥
若采用密钥登录且登录时不需指定密钥,则需:
ssh-keygen
生成公密钥,默认在~/.ssh
下生成公钥id_ras.pub
和密钥id_rsa
,可重命名。ssh-copy-id -i ~/.ssh/id_rsa.pub user@ip
将公钥传到服务器。登录时指定密钥,或在
~/.ssh/config
中指定,如下:1
2
3
4Host 192.168.0.20
Port 22
User root
IdentityFile ~/.ssh/root.key
scp
远程文件传输(上传/下载)。
常用选项:
-p
指定端口。-i
指定密钥。-r
递归文件夹,用于传文件。
常用:
scp -r dir/ root@ip:~/dir
上传文件夹。scp root@ip:~/file file
下载文件。
curl
用于网络请求。
常用选项:
-X <method>
指定请求方法 GET
POST
等。-d <data>
参数用于发送 POST 请求的数据体,上传文件内的数据时,使用 @file
。-H <header>
参数添加 HTTP 请求的标头。-x <proxy>
参数指定 HTTP 请求的代理。-v
参数输出通信的整个过程,用于调试。-o <output file>
参数将服务器的回应保存成文件
常用:
- POST 发送 json 数据:
1 | curl -d '{"name": 6}' -X POST 192.168.0.1:8080/report |
参考:
5.磁盘管理
blkid
查看Linux系统上所有设备与分区(可以理解为每个硬盘)的文件系统类型、UUID、LABEL标签、挂载目录等信息。
换而言之,就是查看系统中的如磁盘、CD/DVD、U盘之类的文件(linux将所有储存的东西都称为文件)位置及信息。
mount
将设备挂载到Linux上。
格式:mount [-t vfstype] [-o options] <device> <dir>
主要选项:
1.-t vfstype
指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。
常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs
2.-o options
主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
3.device
指明要挂载的设备(是一个文件),设备文件通常在/dev/
目录下。比如插入的CD/DVD会是/dev/sr0
文件。
4.dir
设备在系统上的挂载点(是一个目录)。
示例:mount /dev/sr0 /data
将设备挂载到 /data
目录下。
umount
取消挂载,类似于弹出u盘
格式:
umount <dir>
dir
是挂载点目录
du
说明:
显示文件和目录的磁盘使用空间大小。
命令选项:
-a
显示目录中文件的大小,单位KB。
-b
显示目录中文件的大小,以字节byte为单位。
-c
显示目录中文件的大小,同时也显示总和;单位KB。
-k
\-m
显示目录中文件的大小,-k 单位KB,-m 单位MB。
-s
仅显示目录的总值,单位KB。
-h
以K M G为单位显示,提高可读性。
-x
以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L
显示选项中所指定符号链接的源文件大小。
-S
显示个别目录的大小时,并不含其子目录的大小。
-X
在<文件>指定目录或文件。
--exclude=<目录或文件>
略过指定的目录或文件。
-D
显示指定符号链接的源文件大小。
-H\--si
与-h选项相同,但是K,M,G是以1000为换算单位。
-l
重复计算硬件链接的文件。
常用:
1 | # 显示当前目录下各文件/文件夹的大小 |
df
显示系统上可使用的磁盘空间。
主要选项:
-h
以容易阅读的方式显示-T
输出时显示文件系统类型
常用:
1 | df -hT |
fdisk
划分磁盘分区。
常用:
- 查看所有磁盘信息:
1 | fdisk -l |
- 对 /dev/sdb 磁盘进行分区操作:
1 | $ fdisk /dev/sdb |
对于 fdisk 各子命令的使用,请参考:df、du、fdisk:Linux磁盘管理命令整理
6. 文本管理
grep
查找字符串。在一个或多个输入文件中查找含有与指定模式(正则表达式)相匹配的字符串的行。
格式:grep <string> <dir>
主要选项:
-c
对匹配的行计数-l
只显示包含匹配的文件的文件名-h
抑制包含匹配文件的文件名的显示-n
每个匹配行只按照相对的行号显示-i
产生不区分大小写的匹配,缺省状态是区分大小写-v
列出不匹配的行-E
使用正则表达式-o
只打印匹配的部分-P/--perl-regexp
高级正则。Interpret PATTERN as a Perl regular expression. This is highly experimental and grep -P may warn of unimplemented features.
示例:
grep magic /usr/src/*
在‘/usr/src’目录下搜索带字符串‘magic’的文件。cat hello.c | grep hello
在 cat hello.c 后显示出来的内容中,查找hello字符串blkid | grep -oP '(?<=UUID=").*?(?=")'
获取磁盘的UUID
echo
将文本原样(参数)输出。
示例:
1 | $ echo hello world |
-n
默认情况下,echo输出的文本末尾会有一个回车符,-n 可以取消末尾的回车符。-e
默认情况下,echo参数加引号(双引号和单引号)会让特殊字符变成普通字符,-e会解释引号里面的特殊字符(比如换行符\n)。
1 | $ echo -e "Hello\nWorld" |
sed
强大的文本编辑工具,可以使用模式匹配进行替换编辑,与 vim 类似,但 sed 使用的是流式编辑:
- 每次仅读取一行内容;
- 根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
- 将执行结果输出。
常用选项:
-i
直接修改源文件,慎用。
常用示例:
sed "s/my/your/g" pets.txt
详情参考:
awk
一个强大的文本文件处理分析工具,和 sed 命令类似,awk 命令也是逐行扫描文件。
经典格式:
1 | awk '<pattern>{<action>}' <file> |
pattern模式对每一行进行匹配,若匹配成功则对当前行执行action操作。模式和操作都是可选的,如果没有模式,则action应用到全部记录,如果没有action,则输出匹配全部记录。
常用选项:
-F
指定分割符,默认分割符为空格或Tab,awk 会根据分隔符将每行分成多个字段。示例:-F :
指定冒号、-F '[;:]'
指定多个。
常用内建变量:
$0
当前记录(这个变量中存放着整个行的内容)$1~$n
当前记录的第n个字段,字段间由FS分隔FS
输入字段分隔符,默认是空格或TabNF
当前记录中的字段个数,就是有多少列NR
已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。FNR
当前记录数,与NR不同的是,这个值会是各个文件自己的行号RS
输入的记录分隔符,默认为换行符OFS
输出字段分隔符,默认也是空格ORS
输出的记录分隔符,默认为换行符FILENAME
当前输入文件的名字
常用示例:
输出第1列和第4列
1
2
3
4
5
6$ netstat -tnlp | awk '{print $1, $4}'
Proto Local
tcp 0.0.0.0:29503
tcp 127.0.0.1:1988
tcp 0.0.0.0:8648
tcp 0.0.0.0:8649条件判断、输出表头、格式化输出
1
2
3
4
5
6$ netstat -tnlp | awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}'
Local Address Foreign
0.0.0.0:29503 0.0.0.0:* LISTEN
127.0.0.1:1988 0.0.0.0:* LISTEN
0.0.0.0:8648 0.0.0.0:* LISTEN
0.0.0.0:8649 0.0.0.0:* LISTEN指定分隔符和输出分隔符:
1
2
3$ awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
root 0 /root
bin 1 /bin模式匹配(正则),格式如
/模式/
、~
表示匹配正则、!~
表示不匹配正则:1
2
3
4$ netstat -tnlp | awk '$6~/LIS*/ || NR==1 {print NR,$4,$5,$6}' netstat.txt
1 Local Address Foreign
2 0.0.0.0:29503 0.0.0.0:* LISTEN
3 127.0.0.1:1988 0.0.0.0:* LISTEN可自定义变量、
BEGIN{}
指定读取文件前运行的动作、END{}
指定读取文件后运行的动作,如下示例统计文件的行数:1
awk 'BEGIN{count=0}{count=count+1}END{print count}' /etc/passwd
详情参考:
tr
将输入字符串中,属于集合一的字符都替换成集合二中对应位置的字符,并输出。
1 | tr [OPTION] SET1 [SET2] |
常用选项:
-d
删除集合一中的字符-s
删除所有连续重复出现的属于集合一的字符,只保留第一个-c
用集合一的补集替换此集合,通常 -cd
连用
示例:
- 小写转大写:
1 | tr [:lower:] [:upper:] "adasfa" |
- 删除非数字:
1 | echo asdf121341hjhio9h0 | tr -cd 0-9 # 12134190 |
- 将多个空格转换为一个减号:
1 | echo "20 1 3" | tr -s " " "-" # 20-1-3 |
7. 杂项
man
查看命令介绍。
history
显示历史的输入指令。
bc
进入计算器模式,输入 quit
退出。
alias
为命令取别名。例如: 执行 alias look='ll -a'
,即使得命令 look
等价于 ll -a
。当然,这样的别名意义不大。
我们可以用 unalias look
来删除这个别名。
我们也可以在bash配置文件添加这个自定义的命令(别名),vim ~/.bashrc
或 vim /etc/bashrc
,一个相对于当前用户,一个相对于全体用户。
在**~/.bashrc中加入:alias serverOpen="python -m SimpleHTTPServer $1"
。保存退出后,再执行 source ~/.bashrc
使得该配置生效**。这样之后,我们就可以用 serverOpen 8080
开启一个简单的8080端口的web服务器,不加端口则默认是8000端口。
whereis
whereis命令只能用于搜索程序名,而且只搜索二进制文件(选项-b)、man说明文件(选项-m)和源代码文件(选项-s)。如果省略选项,则返回所有信息。
主要选项:-b
搜索二进制文件-m
man说明文件-s
源码文件
示例:
1 | $ whereis vim |
which
which命令是查找命令是否存在,以及命令的存放位置在哪儿。
示例:
1 | $ which vim |
whoami
显示当前用户的用户名