输出文字、选项与帮助

echo 输出文字

认识一个很常用的小命令 echo,它会把后面的文字直接打印到终端上:

crow@opsbox:~$ echo hello
hello
crow@opsbox:~$ echo "hello crow"
hello crow

如上所示,如果只输出一个单词,不需要加引号,例如 echo hello。如果内容中包含空格,就应当用双引号把它括起来,例如 echo "hello crow"。

之所以要加引号,是因为 Shell 会按空格把命令行切分成几段。不加引号时,连续的多个空格会被当作一个分隔符,输出时只剩一个空格;加上引号后,引号里的内容会被当作一个整体,原样保留:

crow@opsbox:~$ echo hello     crow
hello crow
crow@opsbox:~$ echo "hello     crow"
hello     crow

文件名或路径中含有空格时,也需要用同样的方法把它括起来。

命令选项

大多数命令都支持在命令名后面加上以连字符 - 开头的选项(也常叫 flag 或 switch),用来调整命令的行为。

比如默认运行 ls 时,它只会列出普通文件,不显示隐藏文件:

crow@opsbox:~$ ls
handover  README.txt

加上 -a 选项(--all 的缩写)之后,输出里就多出了好几个以 . 开头的文件和目录:

crow@opsbox:~$ ls -a
.
..
.bash_history
.bash_logout
.bashrc
.local
.profile
README.txt
handover

Linux 中名字以 . 开头的文件和目录都是隐藏文件,通常用来存放个人配置(如 .bashrc)或命令历史(如 .bash_history)。列表最开头的 . 和 .. 分别代表当前目录和上一级父目录。

--help 选项摘要

忘记某个命令有哪些选项时,可以在命令后面加上 --help,看看它的简短说明和用法:

crow@opsbox:~$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
[...省略...]

第一行 Usage: ls [OPTION]... [FILE]... 是语法格式:方括号 [ ] 表示可省略,省略号 ... 表示可以写多个。

下面的 -a, --all 写在同一行,说明它们是同一个选项的两种写法:一个减号加单个字母的是短选项,两个减号加完整单词的是长选项。多个短选项可以合并写在一个减号后面,比如 ls -la 和 ls -l -a 完全一样。

man 手册页查询

--help 给出的是简明摘要,更完整的说明保存在系统的手册页(man page)里。运行 man 加上命令名即可打开:

crow@opsbox:~$ man ls
LS(1)                            User Commands                            LS(1)

NAME
       ls - list directory contents

SYNOPSIS
       ls [OPTION]... [FILE]...

DESCRIPTION
       List  information  about the FILEs (the current directory by default).
       Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

       -a, --all
              do not ignore entries starting with .
[...省略...]

进入手册页后,用方向键或空格键翻页,输入 /关键词 在文档内搜索,按 q 退出。

如果精简版容器或实验机没装手册页,man 会提示 No manual entry for ls,这时可以去网上查同一份手册(比如 man7.org 的 ls 手册)。另外,像 cd、echo、export 这类由 Bash 自身提供的内置命令(built-in)没有独立的外部手册页,可以用 help cd 查看。

常见终端报错

命令执行失败时,先看终端报了什么错:

crow@opsbox:~$ pwdd
bash: pwdd: command not found
crow@opsbox:~$ cat missing-demo.txt
cat: missing-demo.txt: No such file or directory
  1. command not found:Bash 在 $PATH 的所有目录里都没找到这个命令。通常是命令名拼错了(比如敲成了 pwdd),或者软件包还没装。
  2. No such file or directory:cat 已经运行起来了,但在指定路径下没找到目标文件。检查一下文件名拼写、大小写(Linux 严格区分大小写)和当前所在目录。
  3. Permission denied:文件或目录存在,但当前用户没有读、写、执行或进入它的权限。

常用终端快捷键

记几个顺手的快捷键和历史命令,平时敲终端会快很多:

  • Tab 自动补全:敲完命令或文件名开头几个字母后按 Tab 键自动补全;如果候选项不止一个,连按两次 Tab 会把所有匹配项列出来。
  • 翻找历史命令:按向上方向键调出上一条命令;输入 history 可以列出最近执行过的命令清单(存在 ~/.bash_history 里),或者按 Ctrl + R 输入关键字反向搜索。
  • 移动与删除:Ctrl + A 跳到行首,Ctrl + E 跳到行尾,Ctrl + U 删掉光标前整行,Ctrl + W 删掉光标前一个单词。
  • 中断当前输入:不小心少打了一半引号出现 > 续行符,或者命令卡住不退时,按 Ctrl + C 强制中断。
  • 清屏:输入 clear 或按 Ctrl + L 清屏。

环境变量与命令连接符

输入 ls 或 whoami 时,为什么不用写出它们在磁盘上的完整路径,Shell 就能找到并运行它们?这靠的是 环境变量(Environment Variables)。

环境变量是当前会话里保存的一组键值对,引用时在名字前面加 $。其中最核心的是 $PATH,里面存着一串用冒号 : 分隔的目录:

crow@opsbox:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
crow@opsbox:~$ which ls
/usr/bin/ls

输入外部命令 ls 时,Bash 会按从左到右的顺序去 $PATH 的目录里找同名程序,一旦找到 /usr/bin/ls 就直接执行。用 which 可以查某个命令的程序文件装在哪个目录,用 env 则能列出当前会话的所有环境变量(比如 $USER、$HOME、$EDITOR)。

要临时新增或修改环境变量,可以用 export MY_NOTE="shift-check"。直接 export 的变量只在当前窗口有效,关掉终端就没了;想每次登录都生效,可以把命令写进主目录的 ~/.bashrc 里。

如果想在一行里连续跑多条命令,可以用下面四种命令连接符:

  • 分号 ;:不管前一条成不成功,顺序往下跑,比如 cd /tmp ; ls;
  • 逻辑与 &&:前一条执行成功(返回状态码 0)才跑下一条,比如 mkdir backup && cd backup;
  • 逻辑或 ||:前一条执行失败(返回非零状态码)才跑下一条,比如 cat config.txt || echo "配置文件不存在";
  • 后台符 &:放在命令末尾,让耗时的程序在后台跑,立刻把终端提示符还给你。

本章阅读

阅读标记