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
command not found:Bash 在$PATH的所有目录里都没找到这个命令。通常是命令名拼错了(比如敲成了pwdd),或者软件包还没装。No such file or directory:cat已经运行起来了,但在指定路径下没找到目标文件。检查一下文件名拼写、大小写(Linux 严格区分大小写)和当前所在目录。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 "配置文件不存在"; - 后台符
&:放在命令末尾,让耗时的程序在后台跑,立刻把终端提示符还给你。