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 知道对于此命令而言,你具有根用户级别的权限。

cdmkdirrmdir 命令

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 auxps -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 的输出转到 fmtfmt 的输出转到 pr,依此类推。 fmt 将结果格式化为整齐段落。 pr 对结果进行分页处理。 lpr 将分页输出发送到打印机。 一行命令即可完成所有操作!