Bash 命令和运算符
每个 shell 语言都有其最常用的命令。 接下来,我们将探讨最常用命令以生成 Bash 指令系统。
Bash 命令
接下来了解常用的 Bash 命令及其用法。
ls
命令
ls
列出当前目录中的内容或命令参数所指定目录中的内容。 它本身会列出当前目录中的文件和目录:
ls
名称以句点开头的文件和目录默认隐藏。 若要在目录列表中添加这些项,请使用 -a
标志:
ls -a
若要详细了解当前目录中的文件和目录,请使用 -l
标志:
ls -l
以下是目录中的一些示例输出,该目录中包含一些 JPEG 和 PNG 以及一个名为 gifs 的子目录:
-rw-rw-r-- 1 azureuser azureuser 473774 Jun 13 15:38 0001.png
-rw-rw-r-- 1 azureuser azureuser 1557965 Jun 13 14:43 0002.jpg
-rw-rw-r-- 1 azureuser azureuser 473774 Mar 26 09:21 0003.png
-rw-rw-r-- 1 azureuser azureuser 4193680 Jun 13 09:40 0004.jpg
-rw-rw-r-- 1 azureuser azureuser 423325 Jun 10 12:53 0005.jpg
-rw-rw-r-- 1 azureuser azureuser 2278001 Jun 12 04:21 0006.jpg
-rw-rw-r-- 1 azureuser azureuser 1220517 Jun 13 14:44 0007.jpg
drwxrwxr-x 2 azureuser azureuser 4096 Jun 13 20:16 gifs
每一行都介绍了相应文件或目录的详细信息。 该信息包括为其分配的权限、所有者、大小(以字节为单位)、上次修改时间以及文件或目录名称。
cat
命令
假设要查看文件中的内容。 可以使用 cat
命令进行查看。 文件是文本文件时,输出才有意义。 以下命令显示存储在 /etc 目录中的 os-release 文件的内容:
cat /etc/os-release
此命令有用,因为它会告诉你正在运行哪个 Linux 分发版:
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.2 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
/etc 目录是 Linux 中的一种特殊目录。 它包含系统配置文件。 不建议删除此目录中的任何文件,除非你了解要执行的操作。
sudo
命令
一些 Bash 命令只能由根用户(系统管理员或超级用户)运行。 如果在权限不足的情况下尝试其中一个命令,该命令会失败。 例如,只有以超级用户身份登录的用户才可以使用 cat
显示 /etc/at.deny 的内容:
cat /etc/at.deny
at.deny 是一个特殊文件,用于确定可使用其他 Bash 命令提交作业以供后续执行的用户。
不建议在大部分时间内以根身份运行;太过危险。 若要在不以超级用户身份登录的情况下运行需要管理员权限的命令,请在命令前加上 sudo
:
sudo cat /etc/at.deny
sudo
表示“超级用户适用”。你使用它时,shell 知道对于此命令而言,你具有根用户级别的权限。
cd
、mkdir
和 rmdir
命令
cd
表示“change directory”,其功能也恰如其名:将当前目录更改为其他目录。 与 Windows 中的对应命令相同,它可实现从一个目录到另一个目录的移动。 使用以下命令将移动到名为 orders 的当前目录的子目录:
cd orders
可以通过将 ..
指定为目录名称来向上移动目录:
cd ..
使用此命令将移动到主目录,即首次登录时所访问的目录:
cd ~
可以使用 mkdir
命令创建目录。 以下命令会在当前的工作目录中创建名为 orders 的子目录:
mkdir orders
如果要使用一个命令创建子目录及其所属子目录,请使用 --parents
标志:
mkdir --parents orders/2019
rmdir
命令可以删除(移除)目录,前提是目录为空。 如果目录不为空,你将收到警告。 幸运的是,可以搭配使用 rm
命令和 -r
(递归)标志,删除不为空的目录。 然后,命令将如下所示,rm -r
。
rm
命令
rm
命令是“remove”的缩写。如你所想,rm
删除了文件。 因此,此命令可以删除 0001.jpg:
rm 0001.jpg
此命令可以删除当前目录中的所有文件:
rm *
请谨慎使用 rm
。 此命令太过危险。
运行带有 -i
标志的 rm
可以让你在删除之前有考虑时间:
rm -i *
养成在每个 rm
命令中添加 -i
的习惯,避免造成 Linux 中的重大误操作。 功能强大的 rm -rf /
命令可以删除整个驱动器上的所有文件。 其工作方式是递归删除根的所有子目录及其所属子目录。 -f
(表示“force”)标志会隐藏提示从而将问题复杂化。 请勿这样操作。
如果要删除名为 orders 且不为空的子目录,可以通过以下方式使用 rm
命令:
rm -r orders
这会删除 orders 子目录和其中的所有内容,包括其他子目录。
cp
命令
如果需要,cp
命令不仅可以复制文件,还可以复制整个目录(和子目录)。 若要创建名为 0002.jpg 的 0001.jpg 副本,请使用以下命令:
cp 0001.jpg 0002.jpg
如果 0002.jpg 已存在,则 Bash 会在无提示情况下将其替换。 如果这是你所需的结果,这样做很好,但如果你没有意识到将要覆盖旧版本,就很糟糕。
幸运的是,如果使用 -i
(表示“interactive”)标志,Bash 会在删除现有文件之前发出警告。 此方法更安全:
cp -i 0001.jpg 0002.jpg
可以使用通配符一次复制多个文件。 若要将当前目录中的所有文件复制到名为 photos 的子目录中,请使用以下命令:
cp * photos
若要将名为 photos 的子目录中的所有文件复制到名为 images 的子目录中,请使用以下命令:
cp photos/* images
此命令假定 images 目录已存在。 如果不存在,则可以创建该目录,然后使用以下命令复制 photos 目录的内容:
cp -r photos images
-r
表示“递归”。-r
标志的另一个优点是,如果 photos 包含自己的子目录,则子目录也会复制到 images 目录中。
ps
命令
ps
命令可以提供当前运行的所有进程的快照。 它本身不带参数,可显示所有 shell 进程,换言之,它无法显示太多进程。 但如果你添加 -e
标志,情况就会有所变化:
ps -e
-e
会列出所有运行中的进程,通常数量很多。
若要更全面地了解系统中正在运行的进程,请使用 -ef
标志:
ps -ef
此标志显示所有正在运行的进程的名称、其进程标识号 (PID)、其父进程的 PID (PPID) 及其开始时间 (STIME)。 还显示其连接到 (TTY) 的终端(如果有)、其占用的 CPU 时间 (TIME) 及其完整路径名。 以下是简化示例:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 13:35 ? 00:00:03 /sbin/init
root 2 0 0 13:35 ? 00:00:00 [kthreadd]
root 3 2 0 13:35 ? 00:00:00 [rcu_gp]
root 4 2 0 13:35 ? 00:00:00 [rcu_par_gp]
root 5 2 0 13:35 ? 00:00:00 [kworker/0:0-cgr]
root 6 2 0 13:35 ? 00:00:00 [kworker/0:0H-kb]
root 8 2 0 13:35 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 13:35 ? 00:00:01 [ksoftirqd/0]
root 10 2 0 13:35 ? 00:00:02 [rcu_sched]
另外,你可能会发现显示通过以下方式使用的 ps
的文档:
ps aux
ps aux
和 ps -ef
是相同的。 这种双重性可追溯到 POSIX Unix 系统(Linux 属其中之一)与 BSD Unix 系统(最常见的是 macOS)之间的历史差异。 最初,POSIX 使用 -ef
,而 BSD 采用 aux
。 现在,两种操作系统系列都接受这两种格式。
这很好地提醒了你应仔细阅读相关手册,了解所有的 Linux 命令。 学习 Bash 如同学习第二语言英语。 规则存在很多例外。
w
命令
用户总是不断变化,有时甚至会是预料之外的用户。 员工辞职后,系统管理员需要确保该员工无法再登录公司的计算机系统。 系统管理员还需了解哪些是已登录用户,哪些是不应登录的用户。
为查找出服务器上的用户,Linux 提供了 w
(表示“who”)命令。 它显示当前计算机系统上的用户及其活动相关的信息。 w
显示用户名、用户 IP 地址、用户登录时间、用户当前正在运行的进程及其运行时间。 它是系统管理员的重要工具。
Bash I/O 运算符
通过使用 Bash 命令及其许多选项可以在 Linux 中执行许多操作。 但你也可以在合并命令时使用以下 I/O 运算符执行这些操作:
<
,用于将输入重定向到键盘以外的源>
,用于将输出重定向到屏幕以外的目标>>
,用于执行相同的操作,但只是追加,并不进行覆盖|
,用于将一个命令的输出通过管道传输到另一个命令的输入
假设要列出当前目录中的所有内容,并捕获名为 list.txt 的文件中的输出。 以下命令可实现此操作:
ls > listing.txt
如果 listing.txt 已存在,它会被覆盖。 如果改用 >>
运算符,则 ls
的输出将追加到 listing.txt 的现有内容中:
ls >> listing.txt
管道运算符功能非常强大(且经常使用)。 它可以将第一个命令的输出重定向到第二个命令的输入。 假设使用 cat
显示大型文件的内容,但内容滚动过快,你无法阅读。 可以将结果管道传输给 more
等其他命令,使输出更易于管理。 以下命令列出所有当前正在运行的进程。 但屏幕填满后,输出会暂停显示,直到你选择“Enter”后才会显示下一行:
ps -ef | more
还可以将输出管道传输到 head
,以查看前几行:
ps -ef | head
或者,假设要筛选输出,使其只包括含有词“daemon”的行。实现此目的的一种方法是将 ps
的输出管道传输到有用的 Linux grep
工具:
ps -ef | grep daemon
输出如下所示:
azureus+ 52463 50702 0 23:28 pts/0 00:00:00 grep --color=auto deamon
azureuser@bash-vm:~$ ps -ef | grep daemon
root 449 1 0 13:35 ? 00:00:17 /usr/lib/linux-tools/4.18.0-1018-azure/hv_kvp_daemon -n
root 988 1 0 13:35 ? 00:00:00 /usr/lib/accountsservice/accounts-daemon
message+ 1002 1 0 13:35 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon 1035 1 0 13:35 ? 00:00:00 /usr/sbin/atd -f
root 1037 1 0 13:35 ? 00:00:00 /usr/bin/python3 -u /usr/sbin/waagent -daemon
root 1039 1 0 13:35 ? 00:00:00 /usr/lib/linux-tools/4.18.0-1018-azure/hv_vss_daemon -n
azureus+ 52477 50702 0 23:28 pts/0 00:00:00 grep --color=auto daemon
还可以将文件用作输入。 标准输入默认来自键盘,但也可以进行重定向。 若要从文件而不是键盘获取输入,请使用 <
运算符。 系统管理员的一项常见任务是对文件内容进行排序。 顾名思义,sort
会按字母顺序对文本进行排序:
sort < file.txt
若要将排序结果保存到新文件,可以重定向输入和输出:
sort < file.txt > sorted_file.txt
可以根据需要使用 I/O 运算符链接 Linux 命令。 请考虑以下命令:
cat file.txt | fmt | pr | lpr
cat
的输出转到 fmt
,fmt
的输出转到 pr
,依此类推。 fmt
将结果格式化为整齐段落。 pr
对结果进行分页处理。 lpr
将分页输出发送到打印机。 一行命令即可完成所有操作!