在黝黑的终端窗口中输入命令,这样的方式对某些人群来说可能好像过时了,但对许多专业计算机人员来说,这几乎是计算机完成能够执行的所有任务的最有效、最简便和最清晰的方式。如今,一些项目将开源命令引入了 macos 和 windows 等非开放平台,因此终端命令不仅仅是针对 linux 和 bsd 用户,更是与每个人都息息相关。你可能会惊讶地发现,在一台普通的 posix计算机上安装了数千个命令,当然,其中很多命令并不是真的有用,至少不是直接或经常性被使用。而其中的一部分命令虽然不是有效终端必须使用的命令,但相比其他命令而言使用频率较高,值得大家学习一下。
以下是终端用户最可能会使用的前 20 个命令:
cd
在终端外,你可以单击图标从一个文件夹移动到另一个文件夹,但在终端中,你需要使用 cd
。cd
命令代表变更目录change directory,是用户在 linux 系统中移动的方式。这是 linux 中从一个地方到另一个地方最快、最直接的路线。
例如,在桌面上,当你想从你的主目录(你保存所有文件夹的地方)移动到一个名为 presentations
的文件夹时,你首先要打开你的documents
文件夹,然后打开一个名叫work
的文件夹,然后是projects
文件夹,然后是conference
文件夹,最后是presentations
文件夹,里面存放的是 libreoffice impress 幻灯片。这个过程包含了很多次的双击操作。同时屏幕上还需要许多鼠标移动动作,这取决于新窗口出现的位置,以及大脑需要跟踪的许多路径点。许多人通过将所有文件都放在桌面上来避免这个看似微不足道的任务。
而终端用户只需键入以下内容即可避免此问题:
$ cd ~/documents/work/projects/conference/presentations
一些有经验的终端用户甚至都懒得输入所有这些,而是使用 tab
键自动完成单词填充。更甚者,有时你都不必依赖自动完成,而是改用通配符:
$ cd ~/doc*/work/*/conf*/p*
pwd
用 buckaroo banzai 的话来说:“无论你走到哪里,你就在那里。”
当你想弄清楚确切位置时,就可以使用 pwd
命令。pwd
代表打印工作目录print working directory,这正是它的作用。--physical
(在某些情况时缩写为-p
)显示解析所有符号链接后的确切位置。
$ pwd
/home/tux/presentation
$ pwd --physical
/home/tux/documents/work/projects/conference/presentations
sed
流编辑器 sed
更广为人知的是一个强大的批量查找和替换命令,但它同时也是一个正当合理的文本编辑器。你可以通过阅读我的介绍性文章来学习使用它,然后通过我的高级教程和备忘录成为老手。
grep
grep
命令使用很普遍,以至于经常被用作动词(例如 “我会对一些文件进行 grep”)和动名词(例如 “grep 一些输出”)。无论是查看日志文件还是解析其他命令的输出,它都是在 shell 中解析文本时的关键组件。这是忙碌的用户专注于特定信息的一种方式。考虑一下计算世界中的数据量,grep
命令的流行就见怪不怪了。你可以通过阅读我的介绍性文章了解grep
,然后下载备忘录学习。
file
当你需要知道文件包含什么类型的数据时,请使用 file
命令:
$ file example.foo
example.foo: riff (little-endian) data, web/p image [...]
$ file example.bar
example.bar: elf 64-bit lsb executable, x86-64 [...]
当然,file
命令并不神奇。它只不过是根据文件如何标识自身而进行输出的,并且文件可能是错误的、损坏的或伪装的。使用hexdump进行严格检查的方式确定性更强,但对于日常使用而言,file
命令非常方便。
awk
awk
不仅仅是一个命令,它还是一种字面意义上的编程语言。点此下载我们的免费 awk 电子书进行学习,你可能会写出远超你想象的脚本。
curl
curl
命令是用于终端的非交互式 web 浏览器。它是面向 web 和 api 开发人员的开发工具。它是一个复杂灵活的命令,但如果你想从你的终端顺利地与 web 服务交互,该命令是很值得学习的。
下载我们免费的 curl 备忘录,你可以从中学会curl
的许多选项。
ps
管理系统资源主要由内核负责,当你更喜欢或更需要手动管理时,可以使用 ps
命令。读者可以在我的使用 procps-ng 监控 linux 系统文章中了解ps
。
cat
cat 命令是连接concatenate的缩写,它曾因为能将若干小文件合并而显得非常有用,这些小文件可能是由于大小限制而(使用split
命令)拆分的。如今,cat
主要是用来将文本文件的内容转储到终端中以供快速阅读,除非你为此专门去使用head
、tail
、more
或less
等命令。
尽管它的原始用途几乎已被弃用,并且其他几个命令也主要提供了其次要功能,但 cat
仍然是一个有用的工具。例如,它可以是复制(cp
)命令的替代品:
$ cat myfile.ogg > /backups/myfile.ogg
它可以显示文件中不便观察的隐形字符。例如,使用 --show-tabs
选项,分割yaml的tab
字符就会显示为^i
:
$ cat --show-tabs my.yaml
---
- hosts: all
tasks:
- name: make sure the current version of 'sysstat' is installed.
dnf:
name:
^i- sysstat
^i- httpd
^i- mariadb-server
state: latest
它还可以用 --show-nonprinting
显示非打印字符,用--show-ends
标记行尾,用--number
提供行号,等等。
find
find
命令可以用来查找文件,但它还有许多选项,这些选项可以帮助你通过各种过滤器和参数查找文件。读者可以从我的介绍性文章中学习该命令的基础知识。
如果你一直想知道为什么最基本的、不起眼的 ls 命令,不在本文列表中,那是因为find
的灵活性。它不仅可以列表文件:
$ find .
./bar.txt
./baz.xml
./foo.txt
[...]
它还可以提供包含详细信息的长列表功能:
$ find . -ls
3014803 464 -rw-rw-r-- 1 tux users 473385 jul 26 07:25 ./foo.txt
3014837 900 -rwxrwxr-x 1 tux users 918217 nov 6 2019 ./baz.xml
3026891 452 -rw-rw-r-- 1 tux users 461354 aug 10 13:41 ./foo.txt
[...]
这是一个技术问题,但也是很一个巧妙的技巧。
tar
人们有时会引用 bsd 的 tar
语法来拿 linux 命令开玩笑。尽管有这样的名声,但tar
命令实际上非常直观。读者可以阅读我的如何解压缩 tar.gz 文件文章,了解在需要时使用tar
命令的简单知识。
more、less 和 most
这些统称为分页命令。分页命令与 cat
类似,但前者会在屏幕底部暂停输出,直到你向下滚动查看更多内容。这些命令比较简单,但每个之间都有细微差别。用户是用箭头键还是空格键滚动?是必须手动退出,还是在显示的文件末尾自动退出?用户的首选搜索行为是什么样的?选择你最喜欢的分页命令并将其设置在.bashrc
中吧!
ssh 和 scp
openssh 不仅有助于保护与远程系统的连接安全,还可以用于启用其他命令。例如,对于许多用户来说,有了 .ssh
目录,他们才能与 git 存储库顺利交互、将更新发布到网站、登录云控制平台。
mv
mv
命令有双重作用:它既可以移动文件又可以重命名文件。它有几个可用的保护措施,例如--interactive
和--no-clobber
选项避免破坏现有文件,--backup
命令确保数据在新位置验证之前被保留,以及--update
选项确保旧版本不会替换新版本文件。
sudo
当某个用户账户的用户名已知,且具有 全部系统权限时,该用户很快就会成为**攻击的目标。sudo
命令消除了对字面上root
用户的需求,从而优雅地移除了有关系统的重要信息。不过这还不是全部,使用sudo
你还可以轻松地管理单个命令、用户和组的权限。你可以在选定的命令上启用无密码执行、记录用户会话、使用摘要验证来验证命令,等等。
alias
使用 alias
命令将长命令变成易于记忆的快捷方式:
$ alias ls='ls --classify --almost-all --ignore-backups --color'
clear
有时终端会显得很混乱,输入 clear
(或在某些 shell 中按ctrl l
)后,你就能得到漂亮、刷新的屏幕了。
setfacl
传统上,posix 文件权限由 chown
和chmod
决定。然而,如今系统变得更加复杂,因此有一个灵活性更高的命令。setfacl
命令允许创建一个访问控制列表(acl),可以配置任意用户所需权限,并可以为文件夹及其中创建的内容设置默认权限。
netcat
可能需要使用 netcat
(nc
)的人不多,但这些使用它的人确离不开它。nc
命令是一个通用的网络连接工具。
它可以连接到一个端口,类似于 telnet
命令:
$ nc -u 192.168.0.12 80
它可以 ping 一个端口,类似于 ping
命令:
$ nc -zvn 192.168.0.12 25
它可以探测开放端口,类似于 nmap
命令:
$ nc -zv 192.168.0.12 25-80
以上仅是该命令的一小部分用途。
你自己构建的命令
在某种程度上,linux 终端是一个创造性解决问题的平台。当你学习命令时,你也在学习可用于创建自己的命令的组块。我的 shell 历史中的许多命令都是自己编写的 shell 脚本,从而实现了根据自己想要的工作方式定制工作流程。你为自己的效率和舒适度而设计的命令也可以作为 shell 中的基本命令。花些时间了解一些很棒的命令,然后试着构建自己的命令吧。当你构建出的命令非常好用时,把它开源,这样就可以与他人分享你的想法啦!