Linux使用技巧集锦(201x)
2011-04-07 10:21:03 阿炯

本文是我使用Linux以来积累的一些经验与技巧,主要是一些不常见的使用方法但实际却很有用,相信对初学者会有所帮助的。

使用虚拟控制台
登录后按Alt+F2键这时又可以看到"login:"提示符, 这个就是第二个虚拟控制台。一般新安装的Linux有四个虚拟控制台, 可以用Alt+F1~Alt+F4来访问。虚拟控制台最有用的时候是当一个程序出错锁住输入时,可以切换到其他虚拟控制台登录进入后杀掉这个出错的进程.

快速进入某些目录
'cd ~'可进入用户的home目录.。
'cd -'可进入上一个进入的目录。
'cd $OLDPWD'可进入上一次所在的目录。

显示彩色目录列表
打开/etc/bashrc, 加入如下一行: alias ls="ls --color",下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
蓝色-->目录
绿色-->可执行文件
红色-->压缩文件
浅蓝色-->链接文件
灰色-->其他文件

显示文件的类型
用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell script文件或是其他的什么格式。例如: # file startx

查找命令文件的路径
当你键入一些命令或手册,如find, shutdown, mount, startx时是否想过要知道这些文件究竟放在哪个目录里? 用命令 whereis 可以实现,如#whereis ls

强行退出 X
有时候在 X 里由于程序出错鼠标键盘都不起作用, 这时候不用着急,只须键入Ctrl+Alt+BackSpace键就可以回到字符界面下了。通常用于在配置x-window时参数有误的情况使用此法。

目录信息统计
仅列出目录(only list directory)
ls -d path/dir/*/
ls -d *
ls -d */
ls -d -- */

echo */, echo */*/

for i in $(ls -d */); do echo $i; done

查看某目录下文件的个数
ls -l |grep "^-"|wc -l

find ./company -type f | wc -l

查看某目录下文件的个数,包括子目录里的
ls -lR|grep "^-"|wc -l

查看某文件夹下目录的个数,包括子目录里的
ls -lR|grep "^d"|wc -l

说明:
ls -l
长列表输出该目录下文件信息(注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等)

grep "^-"
这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d

wc -l
统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。

查看文件夹/目录大小的方法/命令
du、df(磁盘空间信息)命令详解

a:显示全部的档案系统和各分割区的磁盘使用情形
i:显示i -nodes的使用量
k:大小用k来表示 (默认值)
t:显示某一个档案系统的所有分割区磁盘使用量
x:显示不是某一个档案系统的所有分割区磁盘使用量
T:显示每个分割区所属的档案系统名称

磁盘分区情况查看
常用命令:df -hi

引用指令 df 可以显示目前所有分区的最大可用空间及使用情形,请看下列这个例子:

我们加了参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。

上面的指令输出的第一个字段及最后一个字段分别是档案系统及其挂入点。我们可以看到 /dev/ad0s1a 这个分割区被挂在根目录下。我们在上一小节提到过 ad 所代表的是 IDE 的硬盘,而 s1 表示第一个主要扇区。我另外有一个 SCSI 硬盘,它的代号是 da,它的容量很大,主要用来存放数据。devfs 是一个特别的档案系统,该档案系统并非真的磁盘,而是 FreeBSD 用来管理系统硬件装置的虚拟档案系统。

接下来的四个字段 Size、Used、Avail、及 Capacity 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。

另外,我们还可以使用参数 -i 来查看目前档案系统 inode 的使用情形。有的时候虽然档案系统还有空间,但若没有足够的 inode 来存放档案的信息,一样会不能增加新的档案。

提示:还记得什么是inode吗?所谓的inode是用来存放档案及目录的基本信息 (metadata),包含时间、档名、使用者及群组等。在分割扇区时,系统会先做出一堆 inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。如果要存的档案大部分都很小,则同样大小的硬盘中会有较多的档案,也就是说需要较多的 inode 来挂档案及目录。

du:查询档案或目录的磁盘使用空间
a:显示全部目录和其次目录下的每个档案所占的磁盘空间
b:大小用bytes来表示 (默认值为k bytes)
c:最后再加上总计 (默认值)
s:只显示各档案大小的总合
x:只计算同属同一个档案系统的档案
L:计算所有的档案大小

常用命令:du -a
引用指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。例如:
# du -h /etc
104K /etc/defaults
6.0K /etc/X11
1.7M /etc

我们目样使用 -h 参数来显示 human-readable 的格式。在应用时,我们可以使用 du 这个指令来查看哪个目录占用最多的空间。不过,du 的输出结果通常很长,我们可以加上 -s 参数来省略指定目录下的子目录,而只显示该目录的总合即可:
# du -sh /etc
1.7M /etc

在查看目录的使用情形时,我们可以将输出结果导到 sort 指令进行排序,以了解哪个档案用了最多的空间:
$ du debian | sort -nr
15340892    debian
8059120    debian/deb5live
4801164    debian/squeeze
1816976    debian/etch
663628    debian/lenny

sort 的参数 -nr 表示要以数字排序法进行反向排序,因为我们要对目录大小做排序,所以不可以使用 human-readable 的大小输出,不然目录大小中会有 K、M 等字样,会造成排序不正确。

创建任意大小的文件
在linux下面产生任意大小的测试文件其实很简单,命令:
dd if=/dev/zero of=/var/ftp/pub/test.iso bs=1K count=100000
上面这个命令在/tmp目录产生了一个100M的测试文件test.iso。改变count大小,就可以调整产生的文件大小了。

彻底修改 Linux 系统时区
1). 查看当前时区
# vim /etc/sysconfig/clock

2). 修改设置时区
方法(1)
# tzselect
方法(2 仅限于RedHat Linux 和 CentOS)
# timeconfig

3). 复制相应的时区文件,替换系统默认时区
# cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
对于中国服务器则执行:
# cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4). 将当前时间写入BIOS永久生效(避免重启后失效)
# hwclock -w

5). 使用clock
clock –r 对系统Bios中读取时间参数
clock –w 将系统时间(如由date设置的时间)写入Bios

调整网卡工作状态
Q. How do I change the speed, duplex on for my Ethernet card?

A. Under Linux use mii-tool or ethtool package which allows a Linux sys admin to modify/change and view the negotiated speed of network interface card (NIC) i.e. it is useful for forcing specific Ethernet speed and duplex settings.

Depending on which type of Ethernet card is installed on the system you need to use either mii-tool or ethtool. I recommend installing both and use one of the tool, which will work with your card.

Task: 取得网口eth0的速率及其它信息

# ethtool eth0
有较多的输出。
# mii-tool eth0
eth0: negotiated 100baseTx-FD flow-control, link ok

Task: 更改网卡的速率及双工设置

使用'mii-tool'来设置'eth0'协商速率
禁用协商并强制其使用指定的速率(100baseTx-FD, 100baseTx-HD, 10baseT-FD, or 10baseT-HD),前提是网卡本身硬件要支持。
# mii-tool -F 100baseTx-HD
# mii-tool -F 10baseT-HDSetup eth0 negotiated speed with ethtool
# ethtool -s eth0 speed 100 duplex full
# ethtool -s eth0 speed 10 duplex half

为了永久使用设置生效,需要对上面的操作进行保存,以便在下次启动时它能在次设置并生效。比如可以写到/etc/rc.lcoal文件中或创建一个启动脚本等。

更多信息请参考'mii-tool'与'ethtool'手册了。

文件及目录的比较
diff dir1 dir2
比较目录1与目录2的文件列表是否相同,但不比较文件的实际内容,不同则列出。

diff file1 file2
比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的。

comm file1 file2 比较文件,显示两个文件不相同的内容。

只取得文件名称,不带扩展
basename filename .extension

示例:
basename /path/to/dir/filename.txt .txt

>filename


控制光驱
eject umout掉CDROM并将光碟弹出,但cdrom不能处于busy的状态,否则无效。

仅显示文件里的ascii内容
strings file显示file文件中的ASCII字符内容

字符模式下磁盘分区
fdisk /dev/hda 就像执行了dos的fdisk一样
cfdisk /dev/hda 比fdisk界面稍为友好些

跟踪程序的运行过
strace netscape 跟踪程序netscape的执行,看调用的库,环境变量设置,配置文件,使用的设备,调用的其它应用程序等,在strace下程序干了什么东东一目了然。

将程序锁定的指定目录下
chroot . 将根目录切换至当前目录,调试新系统时使用
chroot /tomlinux 将根目录切换至/tomlinux目录

chroot /tomlinuxsbin/init 将根目录切换至/tomlinux并执行sbin/init

终端 ctrl+s 锁屏问题
用ssh登录linux远程终端时,应该常会碰到误按ctrl+s把屏幕锁定的问题。简单的按下 ctrl+q 就能解锁。如果不想再遇到,可以在 .bashrc 写上
'stty –ixon'
来把 flow control 整个关掉,同时 ctrl+s 可以解放出来用做 readline 历史搜索。

Linux命令查找顺序
alias -> keyword -> function -> builtin -> $PATH

查找到$PATH的时候,按$PATH中目录的顺序,找到后会立即返回。

列出机器的块设备
"lsblk"就是列出块设备。除了RAM外,以标准的树状输出格式,整齐地显示块设备。“lsblk -l”命令以列表格式显示块设备(而不是树状格式)。
注意:lsblk是最有用和最简单的方式来了解新插入的USB设备的名字,特别是当你在终端上处理磁盘/块设备时。

使用dd将iso写到u盘做成启动盘
“dd”命令代表了转换和复制文件。可以用来转换和复制文件,大多数时间是用来复制iso文件(或任何其它文件)到一个usb设备(或任何其它地方)中去,所以可以用来制作USB启动器。

# dd if=/home/freeoa/os/debian.iso of=/dev/sdb1 bs=512M; sync
注意:在上面的例子中,usb设备就是sdb1(你应该使用lsblk命令验证它,否则你会重写你的磁盘或者系统),请慎重使用磁盘的名,切忌。
dd 命令在执行中会根据文件的大小和类型以及 usb设备的读写速度,消耗几秒到几分钟不等。

使find命令忽略大小写
find指令: '-name'选项是搜索大小写敏感。可以使用'-iname'选项,这样在搜索中可以忽略大小写。(*是通配符,可以搜索所有的文件;'.sh'你可以使用文件名或者文件名的一部分来制定输出结果)

grep的不常见用法
grep还可以使用以下选项:
-w 搜索单词 (egrep -w 'word1|word2' /path/to/file).
-c 用于统计满足要求的行 (i.e., total number of times the pattern matched) (grep -c ‘word‘ /path/to/file).
–color 彩色输出 (grep –color server /etc/passwd).

非root就可以使用tcpdump
运行tcpdump发现无权限执行:tcpdump: socket: Operation not permitted
需要使用setuid,也就是s权限
设置s权限位
(1)、s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root(文件所有者)身份执行。在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(chmod命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们 ls -l时看到rwS,大写S说明s权限未生效)。

其实Linux修改密码的passwd便是个使用了SUID的程序,普通用户无读写/etc/shadow文件的权限确可以修改自己的密码。

ls -al /usr/bin/passwd
-rwsr-xr-x 1 root root 32988 2008-12-08 17:17 /usr/bin/passwd

使用root用户修改tcpdump文件权限
chmod u+s tcpdump

这样非特权用户就可以使用它来抓取网络包了。

64bit linux os: libstdc++.so.6 not found
所谓的'so'文件,即'dynamically linked library' (shared object),与windows下的'.dll’文件性质相同,动态链接库。如果出现缺少这种文件,可建立一个'symbolic link'可解决问题,但大部分情况下是不行的,甚至链接的时候改一名。在debian 6 下使用Firefox的二进制版本,运行发现有报错:
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

原因是只有64bit(x86-64)的so,没有安装32bit的so,但是程序是32bit,自然不能运行了。

需要安装32bit version of libstdc++6
# apt-get install lib32stdc++6

在centos上会报出像:
/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

原因在于libstdc++.so.6的版本过低,需要下载个新版本的lib文件重新建立软连接。
在终端里执行:strings /usr/lib/libstdc++.so.6 | grep GLIBC
而返回结果没有GLIBCXX_3.4.9,所以会这个错误。
执行ls -l  /usr/lib/libstdc++.so.6
可发现/usr/lib/libstdc++.so.6 -> /usr/lib/libstdc++.so.6.0.8,其实这里需要使用的是libstdc++.so.6.0.15。
从网上下载这个文件libstdc++.so.6.0.15,把libstdc++.so.6.0.15这个库文件放到/usr/lib文件夹下,然后删除/usr/lib/libstdc++.so.6,重新链接到该库文件,重新测试看是否正常。

另外是操作系统的版本不同而应用软件却需要旧版本的链接库
如有软件需要'libstdc++.so.5'这样的动态库,但系统源却没有。

先去Debian Packages找到该套件的deb包(注意体系结构要与目标主机一致)
$ wget http://debian.nctu.edu.tw/debian/pool/main/g/gcc-3.3/libstdc++5_3.3.6-18_amd64.deb

将包解开
$ dpkg-deb -x libstdc++5_3.3.6-18_amd64.deb libstdc++5

把其中的库放到/usr/lib中 (注意不要覆盖原来的文件)
$ sudo mv libstdc++5/usr/lib/libstdc++.so.5* /usr/lib/

更新系统linker的cache
$ sudo ldconfig

再去启动程序看下是否还报此类错误,如果实在不行,就只能从源码编译来实现了。

transmission在rhel5下的安装
使用了新2.7版本,它需要libevent-2.0的运行库,通过yum搜索到的libevent只是1.x版本的。在编译安装好'libevent-2.0'后,使用'./configure  --enable-nls --enable-cli --enable-daemon'编译时报错:
checking for LIBEVENT... configure: error: Package requirements (libevent >= 2.0.10) were not met:

No package 'libevent' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

即提示找不到libevent-2.0运行库,它的安装路径在'/usr/local/lib'目录下,并已经将其加入到链接库的搜索路径下(ldconfig)。
解决办法如下:

升级'intltool'工具,在当前终端里重置下的pkg路径:
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

然后'configure'即可通过。

pwd指令显示链接文件的真实路径
pwd 使用的时候增加-P参数可以将一个链接到的目录显示出目标的真实路径。

创建目录时指定其权限
mkdir -m 参数可以像使用chmod那样去为要创建的目录指定权限

反斜杠特殊字符的转义
echo 在默认情况下是关闭了对反斜杠特殊字符的转义,但是通过使用-e参数,可以让转义有效:通过 -E 选项来关闭对反斜杠特殊字符的转义。
 
简单查看系统设备
使用lspci命令可以查看链接到PCI总线上的设备,常见的PCI总线设备比如显卡、声卡、网卡。-v 可以看到更加详细的硬件信息,也可通过访问/proc文件系统来查看设备信息。

一次性删除大量文件
我在Linux系统下发现文件数量到达一定数量后,rm指令就不行执行了。

解决方法:
cd 文件所在目录
ls . | xargs rm -f
或者
echo * | xargs rm
或者
find . -name "*" -exec rm {} \; -print

rm删除应该没有文件个数限制,所说的限制我认为应该类似这样的限制吧:
rm -rf `ls ./*`
这不是rm地 限制,linux/unix对命令行参数长度的限制一般的命令的参数的总长度不能超过4096个字节。

Linux下批量删除.svn文件,用这个命令就可以了:
find . -type d -name “.svn”|xargs rm -rf

[一次删除一百万个文件的最快方法]
这里没有使用find 或 xargs,他很有创意的利用了rsync的强大功能,使用rsync –delete将目标文件夹以一个空文件夹来替换。可行的方法有如下:
rsync -a –delete empty/ s1/    1000000    6m50.638s
find s2/ -type f -delete    1000000    87m38.826s
find s3/ -type f | xargs -L 100 rm    1000000    83m36.851s
find s4/ -type f | xargs -L 100 -P 100 rm    1000000    78m4.658s
rm -rf s5    1000000    80m33.434s
使用 –delete 和 –exclude,你可以选择性删除符合条件的文件。还有一点,当你需要保留这个目录做其它用处时,这种方法是再适合不过了。

Man 手册种类
可执行程序或 Shell 命令;
系统调用(Linux 内核提供的函数);
库调用(程序库中的函数);
文件(例如 /etc/passwd );
特殊文件(通常在 /dev 下);
游戏;
杂项(man(7),groff(7));
系统管理命令(通常只能被 root 用户使用);
内核子程序。

man + 数字 + 命令

输入 man + 数字 + 命令/函数,可以查到相关的命令和函数,若不加数字,man 默认从数字较小的手册中寻找相关命令和函数

man 3 rand    --> 表示在手册的第三部分查找 rand 函数
man ls    --> 查找 ls 用法手册

man 手册核心区域解析:(以 man pwd 为例)

NAME # 命令名称和简单描述
pwd -- return working directory name

SYNOPSIS # 使用此命令的所有方法
pwd [-L | -P]

DESCRIPTION # 包括所有参数以及用法
The pwd utility writes the absolute pathname of the current working directory to the standard output.

Some shells may provide a builtin pwd command which is similar or identical to this utility.  Consult the builtin(1) manual page.

The options are as follows:
-L    Display the logical current working directory.

-P    Display the physical current working directory (all symbolic links resolved).

If no options are specified, the -L option is assumed.

SEE ALSO # 扩展阅读相关命令
builtin(1), cd(1), csh(1), sh(1), getcwd(3)

help

man 命令像词典一样可以查询到命令或函数的详细信息,但其实还有更加快捷的方式去查询,command --help 或 command -h ,其提供了更加易于阅读的简易参考。


less:分页显示文件内容,更适合查看大的文件。
less freeoa-init.log

空格键:前进一页(一个屏幕);
b 键:后退一页;
回车键:前进一行;
y 键:后退一行;
上下键:回退或前进一行;
d 键:前进半页;
u 键:后退半页;
q 键:停止读取文件,中止 less 命令;
= 键:显示当前页面的内容是文件中的第几行到第几行以及一些其它关于本页内容的详细信息;
h 键:显示帮助文档;
/ 键:进入搜索模式后,按 n 键跳到一个符合项目,按 N 键跳到上一个符合项目,同时也可以输入正则表达式匹配。


w

帮助快速了解系统中目前有哪些用户登录着以及他们在干什么。
# w
06:31:53 up 25 days,  9:53,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    ip-address    05:56    1.00s  0.02s  0.00s w

06:31:53:表示当前时间
up 25 days, 9:53:表示系统已经正常运行了“25天9小时53分钟”
1 user:表示一个用户
load average: 0.00, 0.01, 0.05:表示系统的负载,3个值分别表示“1分钟的平均负载”,“5分钟的平均负载”,“15分钟的平均负载”

USER:表示登录的用于
TTY:登录的终端名称为pts/0
FROM:连接到服务器的ip地址
LOGIN@:登录时间
IDLE:用户有多久没有活跃了
JCPU:该终端所有相关的进程使用的 CPU 时间,每当进程结束就停止计时,开始新的进程则会重新计时
PCPU:表示 CPU 执行当前程序所消耗的时间,当前进程就是在 WHAT 列里显示的程序
WHAT:表示当下用户正运行的程序是什么,这里我运行的是 w

ps

用于显示当前系统中的进程, ps 命令显示的进程列表不会随时间而更新,是静态的,是运行 ps 命令那个时刻的状态或者说是一个进程快照。

# ps
PID TTY          TIME CMD
1793 pts/0    00:00:00 bash
4756 pts/0    00:00:00 ps

PID:进程号,每个进程都有唯一的进程号
TTY:进程运行所在的终端
TIME:进程运行时间
CMD:产生这个进程的程序名,如果在进程列表中看到有好几行都是同样的程序名,那么就是同样的程序产生了不止一个进程

常用参数
-ef 列出所有进程;
-efH 以乔木状列举出所有进程;
-u 列出此用户运行的进程;
-aux 通过 CPU 和内存使用来过滤进程 ps -aux | less ;
-aux --sort -pcpu 按 CPU 使用降序排列,-aux --sort -pmem 表示按内存使用降序排列;
-axjf 以树形结构显示进程, ps -axjf 它和 pstree 效果类似。

进程状态

主要是切换进程的状态。我们先了解下 Linux 下进程的五种状态:
状态码 R:表示正在运行的状态;
状态码 S:表示中断(休眠中,受阻,当某个条件形成后或接受到信号时,则脱离该状态);
状态码 D:表示不可中断(进程不响应系统异步信号,即使用kill命令也不能使其中断);
状态码 Z:表示僵死(进程已终止,但进程描述符依然存在,直到父进程调用 wait4() 系统函数后将进程释放);
状态码 T:表示停止(进程收到 SIGSTOP 、 SIGSTP 、 SIGTIN 、 SIGTOU 等停止信号后停止运行)。

前台进程与后台进程
默认情况下,用户创建的进程都是前台进程,前台进程从键盘读取数据,并把处理结果输出到显示器。例如运行 top 命令,这就是一个一直运行的前台进程。后台进程的优点是不必等待程序运行结束,就可以输入其它命令。在需要执行的命令后面添加 & 符号,就表示启动一个后台进程。

&
后台进程的缺点是后台进程与终端相关联,一旦关闭终端,进程就自动结束了。因此需要nohup来帮忙。
cp name.csv name-copy.csv &

nohup
使进程不受挂断(关闭终端等动作)的影响。
nohup cp name.csv name-copy.csv

nohup 命令也可以和 & 结合使用。
nohup cp name.csv name-copy.csv &

bg
使一个“后台暂停运行”的进程,状态改为“后台运行”。

bg %1 # 不加任何参数的情况下,bg命令会默认作用于最近的一个后台进程,如果添加参数则会作用于指定标号的进程

实际案例1:
1. 执行 grep -r "log" / > grep_log 2>&1 命令启动一个前台进程,并且忘记添加 & 符号
2. ctrl + z 使进程状态转为后台暂停
3. 执行 bg 将命令转为后台运行             

实际案例2:
前端开发时经常会执行 yarn start 启动项目
此时执行 ctrl + z 先使其暂停
然后执行 bg 使其转为后台运行
这样当前终端就空闲出来可以干其它事情了,如果想要唤醒它就使用 fg 命令即可(后面会讲)

jobs
显示当前终端后台进程状态。

fg
fg 使进程转为前台运行,用法和 bg 命令类似。

用一张图来表示前后台进程切换:


可以使程序在后台运行,成为后台进程,这样在当前终端中我们就可以做其他事情了,而不必等待此进程运行结束。

守护进程

一个运行起来的程序被称为进程。在 Linux 中有些进程是特殊的,它不与任何进程关联,不论用户的身份如何,都在后台运行,这些进程的父进程是 PID 为1的进程, PID 为1的进程只在系统关闭时才会被销毁。它们会在后台一直运行等待分配工作。我们将这类进程称之为守护进程 daemon 。

守护进程的名字通常会在最后有一个'd',表示 daemon 守护的意思,例如 systemd、httpd。

systemd
systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。通过命令也可以看到 PID 为1的进程就是 systemd 的系统进程。其常用命令(它是一组命令的集合):
systemctl start nginx # 启动服务
systemctl stop nginx # 停止服务
systemctl restart nginx # 重启服务
systemctl status nginx # 查看服务状态
systemctl reload nginx # 重载配置文件(不停止服务的情况)
systemctl enable nginx # 开机自动启动服务
systemctl disable nginx # 开机不自动启动服务
systemctl is-enabled nginx # 查看服务是否开机自动启动
systemctl list-unit-files --type=service # 查看各个级别下服务的启动和禁用情况


重定向 管道 流

在 Linux 中一个命令的去向可以有3个地方:终端、文件、作为另外一个命令的入参。命令一般都是通过键盘输入,然后输出到终端、文件等地方,它的标准用语是 stdin、 stdout 以及 stderr 。

标准输入 stdin ,终端接收键盘输入的命令,会产生两种输出;
标准输出 stdout ,终端输出的信息(不包含错误信息);
标准错误输出 stderr ,终端输出的错误信息。

重定向
把本来要显示在终端的命令结果,输送到别的地方(到文件中或者作为其他命令的输入)。

输出重定向 >、>>、2>、2>>、2>&1

输入重定向 <、<<

管道 |
把两个命令连起来使用,一个命令的输出作为另外一个命令的输入,英文是 pipeline,可以想象一个个水管连接起来,管道算是重定向流的一种。


流并非一个命令,在计算机科学中,流(stream)的含义是比较难理解的,记住一点即可:流就是读一点数据,处理一点点数据。其中数据一般就是二进制格式。上面提及的重定向或管道,就是把数据当做流去运转的。

关于流和管道在其它语言中也有广泛的应用,Angular 中的模板语法中可以使用管道,Node.js 中也有 stream 流的概念。


Vim编译器

Vim是什么?
Vim是从 vi 发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。

Vim常用模式
交互模式、插入模式、命令模式、可视模式。

交互模式
也成为正常模式,这是 Vim 的默认模式,每次运行 Vim 程序的时候,就会进入这个模式。

交互模式特征:
在这个模式下不能输入文本;它可以文本间移动,删除一行文本,复制黏贴文本,跳转到指定行,撤销操作,等等。

插入模式
这个模式是我们熟悉的文本编辑器的模式,就是可以输入任何你想输入的内容。进入这个模式有几种方法,最常用的方法是按字母键 i ( i、I、a、A、o、O 都可以进入插入模式,只是所处的位置不同),退出这种模式,只需要按下 Esc 键。

i, I 进入输入模式 Insert mode :i 为“从目前光标所在处输入”, I 为“在目前所在行的第一个非空格符处开始输入”;

a, A 进入输入模式 Insert mode :a 为“从目前光标所在的下一个字符处开始输入”,A 为“从光标所在行的最后一个字符处开始输入”;

o, O 进入输入模式 Insert mode :o 为“在目前光标所在的下一行处输入新的一行”;O 为在目前光标所在处的上一行输入新的一行。

命令模式
命令模式也称为底线命令模式,这个模式下可以运行一些命令例如“退出”,“保存”,等动作。也可以用这个模式来激活一些 Vim 配置,例如语法高亮,显示行号等。甚至还可以发送一些命令给终端命令行,例如 ls 、cp 。

为了进入命令模式,首先要进入交互模式,再按下冒号键。

用一张图表示三种模式如何切换:


基本操作

打开Vim
在终端命令行中输入 vim 回车后 Vim 就会被运行起来,也可以用 Vim 来打开一个文件,只需要在 vim 后面再加文件名。如 vim file.name ,如果文件不存在,那么会被创建。

插入
进入文件之后,此时处于交互模式,可以通过输入 i 进入插入模式。

移动
在交互模式下可以在文本中移动光标。
h 向左移动一个字符
j 向下移动一个字符
k 向上移动一个字符
i 向右移动一个字符

当然也可以使用四个方向键进行移动,效果是一样的。

跳至行首和行末
行首:在交互模式下,为了将光标定位到一行的开始位置,只需要按下数字键 0 即可,键盘上的 Home 键也有相同效果。

行末:在交互模式下,为了将光标定位到一行的末尾,只需要按下美元符号键 $ 即可,键盘上的 End 键也有相同效果。

按单词移动
在交互模式下,按字母键 w 可以一个单词一个单词的移动。

退出文件
在交互模式下,按下冒号键 : 进入命令模式,再按下 q 键,就可以退出了。

如果在退出之前又修改了文件,就直接想用 :q 退出 Vim ,那么 Vim 会显示一个红字标明错误信息。此时我们有两个选择:
保存并退出 :wq 或 :x ;
不保存且退出 :q! 。

标准操作

删除字符
在交互模式下,将光标定位到一个你想要删除的字符上,按下字母键 x 你会发现这个字符被删除了。

也可以一次性删除多个字符,只需要在按 x 键之前输入数字即可。

删除(剪切)单词,行
删除一行:连按两次 d 来删除光标所在的那一行。
删除多行:例如先输入数字 2 ,再按下 dd ,就会删除从光标所在行开始的两行。
删除一个单词:将光标置于一个单词的首字母处,然后按下 dw 。
删除多个单词:例如先按数字键 2 再按 dw 就可以删除两个单词了。
从光标所在位置删除至行首:d0 。
从光标所在位置删除至行末:d$ 。

复制单词,行
复制行:按两次 y 会把光标所在行复制到内存中,和 dd 类似,dd 用于“剪切”光标所在行。
复制单词:yw 会复制一个单词。
复制到行末:y$ 是复制从光标所在处到行末的所有字符。
复制到行首:y0 是复制光标所在处到行首的所有字符。

粘贴
如果之前用 dd 或者 yy 剪切复制过来的,可以使用 p 来粘贴。同样也可以使用 数字+p 来表示复制多次。

替换一个字符
在交互模式下,将光标置于想要替换的字符上。按下 r 键,接着输入你要替换的字符即可。

撤销操作
如果要撤销最近的修改,只需要按下 u 键,如果想要撤销最近四次修改,可以按下4,再按下 u 。

重做
取消撤销,也就是重做之前的修改使用 ctrl + r 。

跳转到指定行
Vim编辑的文件中,每一行都有一个行号,行号从1开始,逐一递增。
行号默认是不显示,如果需要它显示的话,可以进入命令模式,然后输入 set nu;要隐藏行号的话,使用 set nonu 。
跳转到指定行:数字+gg ,例如 7gg ,表示跳转到第7行。
要跳转到最后一行,按下 G 。
要跳转到第一行,按下 gg 。

高级操作

查找
处于交互模式下,按下 / 键,那么就进入查找模式,输入要查找的字符串,然后按下回车。光标就会跳转到文件中下一个查找到的匹配处。如果字符串不存在,那么会显示 "pattern not found"。
n 跳转到下一个匹配项;
N 跳转到上一个匹配项。

[注意] 用斜杠来进行的查找是从当前光标处开始向文件尾搜索,如果你要从当前光标处开始,向文件头搜索则使用?,当然也可以先按下 gg 跳转到第一行在进行全文搜索。

查找并替换
替换光标所在行第一个匹配的字符串:
# 语法
:s/旧字符串/新字符串

合并文件
可以用冒号 +r (:r) 实现在光标处插入一个文件的内容。
:r filename # 可以用Tab键来自动补全另外一个文件的路径

分屏
Vim有一个特别便捷的功能那就是分屏,可以同时打开好几个文件,分屏之后,屏幕每一块被称为一个 viewport ,表示“视口”。
横向分屏 : sp 文件名
垂直分屏 : vsp 文件名

分屏模式下的快捷键
Ctrl + w 再加 Ctrl + w ,表示从一个 viewport 移动光标到另外一个 viewport ;
Ctrl + w 再加 “方向键”,就可以移动到这个方向所处的下一个视口了;
Ctrl + w 再加 + 号,表示扩大当前视口;
Ctrl + w 再加 - 号,表示缩小当前视口;
Ctrl + w 再加 = 号,表示平均当前视口;
Ctrl + w 再加 r 键,会反向调换视口位置;
Ctrl + w 再加 q 键,会关闭当前视口;
Ctrl + w 再加 o 键,会关闭除当前视口以外的所有视口;

运行外部命令 :!
在 Vim 中可以运行一些终端命令,只要先输入 :! ,然后接命令名称。

例如:
:!ls # 在Vim中打开的文件所在的目录运行ls命令

可视模式
前面只讲了 Vim 的三种模式,其实还有一种模式叫做可视模式。进入它的三种方式(都是从交互模式开始):
v 字符可视模式,进入后配合方向键选中字符后,然后再按 d 键可以删除选中。
V 行可视模式,进入后光标所在行默认被选中,然后再按 d 键可以删除所在行。
Ctrl + v 块可视模式,它是可视模式最有用的功能了,配合 d 和 I 键可以实现删除选中的内容和插入内容。

同时选中多行,并在选中行头部插入内容的具体操作步骤:
1. ctrl + v 进入块可视模式
2. 使用方向键进行选中(上下左右)假设选中5行
3. 输入 I 键进行多行同时插入操作
4. 插入完成后连续按两下 esc 键,实现多行同时插入相同字符

进入可视模式之后的操作键:
d 键,表示删除选中;
I 键,表示在选中之前插入;
u 键,表示选中变为小写;
U 键,表示选中变为大写;

Vim配置参考

选项参数
在 Vim 被启动后,可以运行一些指令来激活一些选项参数,但是这些选项参数的配置在退出 Vim 时会被忘记,例如前面讲解的激活行号。如果希望所在的配置是永久性的,那么需要在家目录( cd ~ )创建一个 Vim 的配置文件 .vimrc 。

.vimrc
Vim 配置非常丰富,可以通过个性化配置把 Vim 打造成属于自己的 IDE 等等。在 github 上也可以搜索到一些强大的 Vim 配置文件。


该文章最后由 阿炯 于 2024-05-14 14:38:21 更新,目前是第 3 版。