BASH Shell实用技巧:命令补全、历史记录与文件扩展
1. 命令与文件名补全
BASH命令行具备内置的命令和文件名补全功能,通过按下Tab键就能触发自动补全。当输入不完整的命令或文件名参数时,按下Tab键,系统会尝试补全该模式。若目录名被补全,其后面会附带一个正斜杠(/)。要是有多个命令或文件具有相同的前缀,shell会发出提示音,等待再次按下Tab键,随后显示可能的补全列表,此时需输入足够的字符以选择唯一的命令或文件名。若预先知道有多种可能的补全情况,可直接按ESC键替代两次Tab键操作。
示例:
$ cat pre <tab>
$ cat preface
除了命令和文件名,自动补全功能还适用于变量名、用户名和主机名。不过,部分文本前需加上特定字符来表明名称类型:
- 文件名:以任意文本或 / 开头。
- shell变量:以 $ 开头。
- 用户名:以 ~ 开头。
- 主机名:以 @ 开头。
- 命令、别名和文件中的文本:以普通文本开头。
示例:
$ echo $HOM <tab>
$ echo $HOME
若仅输入一个字母,如 H,连续按两次Tab键可查看所有以 H 开头的可能变量:
$ echo $H <tab> <tab>
$HISTCMD $HISTFILE $HOME $HOSTTYPE HISTFILE $HISTSIZE $HISTNAME
$ echo $H
还能使用相应的命令键来指定要补全的文本类型,此时名称开头的符号并不重要。例如:
- Alt - ~:将当前文本视为用户名。
- Alt - @:将当前文本视为主机名。
- Alt - $:将当前文本视为变量。
- Alt -!:将当前文本视为命令。
若要显示可能的补全列表,可按下Ctrl - x 键和相应的补全键,如Ctrl - x - $ 列出可能的变量补全。具体命令如下表所示:
| 命令(Ctrl - r 列出可能的补全) | 描述 |
| — | — |
| Tab | 自动补全 |
| Tab Tab 或 ESC | 列出可能的补全 |
| Alt - /, Ctrl - r - / | 文件名补全,普通文本自动补全 |
| Alt - $, Ctrl - r - $ | shell变量补全,$ 开头自动补全 |
| Alt - ~, Ctrl - r - ~ | 用户名补全,~ 开头自动补全 |
| Alt - @, Ctrl - r - @ | 主机名补全,@ 开头自动补全 |
| Alt -!, Ctrl - r -! | 命令名补全,普通文本自动补全 |
2. 历史记录
BASH shell会保存之前输入命令的历史列表。通过按上箭头键,可依次在命令行上显示每个命令;按下箭头键则可向下移动列表。在命令行显示历史命令后,可对其进行修改并执行。
当错误执行命令后,按上箭头键重新显示该命令,进行修正后再次执行,无需重新输入整个命令。
历史事件由BASH shell的history实用程序记录,命令从1开始编号,默认最多记录500条命令。在命令行输入history并按Enter键,可查看最近执行的命令列表,每条命令前会显示编号。
示例:
$ history
1 cp mydata today
2 vi mydata
3 mv mydata reports
4 cd reports
5 ls
历史命令及事件引用的相关操作如下表所示:
| 历史命令 | 描述 |
| — | — |
| Ctrl - n 或下箭头 | 移动到历史列表中的下一个事件 |
| Ctrl - p 或上箭头 | 移动到历史列表中的上一个事件 |
| Alt - < | 移动到历史事件列表的开头 |
| Alt - > | 移动到历史事件列表的末尾 |
| Alt - n | 向前搜索,查找下一个匹配项 |
| Alt - p | 向后搜索,查找上一个匹配项 |
| Ctrl - s | 向前搜索历史记录,向前增量搜索 |
| Ctrl - r | 反向搜索历史记录,反向增量搜索 |
| fc event - reference | 使用标准编辑器编辑事件并执行 |
| -l 选项 | 列出最近的历史事件,与history命令相同 |
| -e editor event - reference | 调用指定编辑器编辑特定事件 |
历史事件引用方式如下:
-!event num:通过事件编号引用事件。
-!!:引用上一个命令。
-!characters:引用以指定字符开头的事件。
-!?pattern?:引用包含指定模式的事件。
-! - event num:通过与第一个事件的偏移量引用事件。
-!num - num:引用一系列事件。
示例:
$ !3
mv mydata reports
$ !mv my
mv mydata reports
$ ! - 4
vi mydata
$ !!
ls
mydata today reports
3. 文件扩展
文件扩展是BASH shell的一项重要功能,它利用特殊字符来搜索、匹配和生成文件名列表。这些特殊字符包括星号(*)、问号(?)和方括号([])。
3.1 匹配多个字符
星号(*)用于匹配文件名中以特定字符集开头或结尾的文件。将星号置于要搜索的模式之前,可搜索以该模式结尾的文件名;置于模式之后,则搜索以该模式开头的文件名。
示例:
$ ls
doc1 doc2 document docs mydoc monday tuesday
$ ls doc*
doc1 doc2 document docs
$ ls *day
monday tuesday
$ ls m*d*
monday
文件名通常包含扩展名,使用星号可轻松选择具有特定扩展名的文件。
示例:
$ ls *.c
calc.c main.c
星号还可与rm命令结合使用,一次性删除多个文件。但使用时需谨慎,因为在没有 - i 选项的rm命令中误放 * 可能会删除当前目录中的所有文件。- i 选项会先提示确认是否删除文件。
示例:
$ rm doc*
3.2 匹配单个字符
问号(?)仅匹配文件名中单个不完整的字符。与星号不同,问号将匹配限制为一个额外字符。
示例:
$ ls
doc1 docA document
$ ls doc?
doc1 docA
3.3 匹配字符范围
方括号([])可指定要搜索的有效字符集,方括号内的任何字符都会在文件名中匹配。也可使用连字符指定字符范围。
示例:
$ ls
doc1 doc2 doc3 docA docB docD document
$ ls doc[1A]
doc1 docA
$ ls doc[1 - 3]
doc1 doc2 doc3
$ ls doc[B - E]
docB docD
还可将方括号与其他文件扩展字符结合使用,形成灵活的匹配操作符。
示例:
$ ls *.[co]
main.c main.o calc.c
3.4 匹配shell符号
当文件扩展字符本身是文件名的一部分时,需在该字符前加上反斜杠(\)进行转义,或者将文件名放在双引号中。
示例:
$ ls answers\?
answers?
$ ls "answers?"
answers?
对于包含空格等空白字符的文件名或目录名,同样可使用反斜杠转义空格,或用双引号括起整个名称。
示例:
$ ls My\ Documents
My Documents
$ ls "My Documents"
My Documents
3.5 生成模式
尽管 {} 不属于文件扩展操作,但它常用于生成可用于创建或修改文件和目录的名称。花括号内的模式用逗号分隔,可根据前后模式生成名称列表。
示例:
$ echo doc{ument,final,draft}
document docfinal docdraft
$ mkdir {fall,winter,spring}report
$ ls
fallreport springreport winterreport
4. 标准输入/输出与重定向
在Linux中,输入和输出操作的数据组织形式类似于文件。键盘输入的数据被放置在一个连续字节的数据流中,命令或程序的输出数据也以连续字节的数据流形式存在。输入数据流称为标准输入,输出数据流称为标准输出,专门用于错误消息的输出数据流称为标准错误。
由于标准输入和标准输出的组织形式与文件相同,它们能与文件轻松交互。Linux具备重定向功能,可方便地将数据移入或移出文件。例如,可将标准输出重定向到文件而非显示在屏幕上,也可将标准输入从键盘重定向到文件。
当执行产生输出的Linux命令时,输出会被放置在标准输出数据流中,默认情况下,标准输出数据流的目的地是屏幕。像ls命令会生成文件名列表并输出到标准输出,随后该数据流被导向屏幕设备显示;cat命令会将文件内容复制到标准输出并显示在屏幕上。
不同的重定向操作符及其用途如下表所示:
| 命令 | 执行操作 |
| — | — |
| Enter | 执行命令行 |
| ; | 在同一命令行中分隔命令 |
| command\ | opts args 在回车前输入反斜杠,可在下一行继续输入命令 |
|
command
| 执行命令 |
| * | 匹配任意字符集 |
|? | 匹配任意单个字符 |
| [] | 匹配一类可能的字符 |
| \ | 转义后续字符,用于转义特殊字符 |
| & | 在后台执行命令 |
|! | 引用历史命令 |
| > | 将标准输出重定向到文件或设备,若文件不存在则创建,存在则覆盖 |
| >! | 强制覆盖已存在的文件 |
| < | 将标准输入从文件或设备重定向到程序 |
| >> | 将标准输出重定向到文件或设备,并追加到文件末尾 |
| 2> | 将标准错误重定向到文件或设备 |
| 2>> | 将标准错误重定向并追加到文件或设备 |
| 2>&1 | 将标准错误重定向到标准输出 |
通过合理运用这些重定向操作符,能更高效地处理数据的输入和输出,满足不同的使用需求。
BASH Shell实用技巧:命令补全、历史记录与文件扩展
5. 操作技巧总结与注意事项
在使用BASH shell的过程中,掌握一些操作技巧和注意事项能让我们更加高效和安全地使用这些功能。
5.1 命令补全技巧
- 灵活运用快捷键 :除了常规的Tab键补全,要熟练掌握Alt和Ctrl组合键来指定补全类型。例如,当你要补全用户名时,按下Alt - ~,系统会快速将当前文本作为用户名进行补全尝试。
- 多可能性处理 :当遇到多个可能的补全项时,按ESC键可以直接列出所有可能,比按两次Tab键更快捷。
5.2 历史记录使用技巧
- 快速定位命令 :使用Ctrl - r进行反向搜索历史记录,在输入搜索字符串时,系统会实时显示匹配的命令,方便快速找到之前执行过的命令。
- 避免重复输入 :善用历史事件引用,如!!引用上一个命令,!event num通过编号引用特定命令,减少重复输入的工作量。
5.3 文件扩展注意事项
-
谨慎使用星号与rm命令
:星号与rm命令结合使用时,一定要加上 - i选项,避免误删文件。例如,在执行
rm doc*之前,先使用ls doc*查看要删除的文件列表,确认无误后再执行删除操作。
$ ls doc*
doc1 doc2 document
$ rm -i doc*
rm: remove regular file 'doc1'? y
rm: remove regular file 'doc2'? y
rm: remove regular file 'document'? y
- 正确处理特殊字符 :当文件名包含文件扩展字符或空白字符时,使用反斜杠转义或双引号括起文件名,确保正确引用文件。
6. 流程图展示操作流程
下面通过mermaid流程图来展示一些常见操作的流程。
6.1 命令补全流程
graph TD;
A[输入不完整命令或文件名] --> B{按Tab键};
B -- 唯一补全 --> C[系统补全命令或文件名];
B -- 多个可能 --> D{按ESC或两次Tab};
D --> E[显示可能的补全列表];
E --> F[输入更多字符选择唯一项];
F --> C;
6.2 文件删除流程
graph TD;
A[确定要删除的文件模式] --> B[使用ls查看文件列表];
B --> C{确认是否删除};
C -- 是 --> D[使用rm -i删除文件];
C -- 否 --> E[取消操作];
7. 实际应用场景举例
7.1 批量处理文件
假设你有一个目录,里面包含多个C语言源文件和头文件,你想一次性编译所有的C文件。可以使用文件扩展功能结合命令补全来快速完成操作。
$ ls *.c
calc.c main.c
$ gcc *.c -o myprogram
在这个例子中,
*.c
匹配了所有的C文件,然后作为参数传递给gcc命令进行编译。
7.2 重复执行命令
当你需要多次执行相同的命令,只是参数稍有不同时,可以利用历史记录功能。例如,你要将多个文件复制到不同的目录。
$ cp file1 destination1
$ 按上箭头键
$ 将file1改为file2,destination1改为destination2
$ 按Enter键执行新命令
8. 总结
BASH shell提供了丰富的功能,如命令补全、历史记录、文件扩展和重定向等,这些功能可以大大提高我们在命令行操作中的效率。通过合理运用这些功能,我们可以更方便地管理文件、执行命令和处理数据。同时,在使用过程中要注意一些细节和安全问题,避免因误操作导致数据丢失或其他问题。希望通过本文的介绍,你能更好地掌握BASH shell的使用技巧,提升自己的操作能力。
BASH Shell实用技巧:补全、历史与文件扩展
超级会员免费看
8957

被折叠的 条评论
为什么被折叠?



