终端操作(SHELL)技巧

终端操作(SHELL)技巧

Posted November 29, 2018

本篇是一些小但是有用的终端操作技巧和一些快捷方式,可以让你在 linux 命令行有出奇的效率。一方面这些技巧可以让你的效率有所提高, 但有时候也会有隐患, 所以终端操作一定要注意高风险的行为, 每一步也都要小心的执行。

当然我相信你也有祖传的小技巧, 自己偷偷的使用, 希望你也能通过留言评论, 分享给大家。

0.使用 Tab 键补齐.

如果一个命令, 或者命令参数很长, 并且命令支持补全操作, 那么通过 Tab 键可以很方便的自动补全后面的参数。 当你在命令行键入内容的时候,可以按 Tab 键来显示可能的后面需要补齐的选项, 你可以根据这些选项来进一步操作。

一般执行一个命令, 命令可以补齐, 参数也可以补齐,一个命令操作一般连续按下多次 Tab 键才能完成输入, 最后确保没有问题的时候回车执行。

这个技巧可以让我们不需要死记硬背所有的命令和参数, 你只需要知道命令大概的名字和作用即可。

Bash

$ cd m[按下Tab]
my-test-directory-00001    my-test-directory-00002    my-test-directory-00003
my-test-directory-00004    main.py

$ cd my[按下Tab]
$ cd my-test-direction-0000[按下Tab]
my-test-directory-00001    my-test-directory-00002    my-test-directory-00003
my-test-directory-00004

1.回到上一个工作目录

假设你要在一个目录中工作, 但是你需要到其他的目录处理一个小的问题, 处理完后你可以快速的回到工作目录中. 这是一个非常常用的技巧.

Bash

$ pwd
/Users/jackeygao/Coding
$ cd ~/Downloads
$ pwd
/Users/jackeygao/Downloads
$ cd -
~/Coding
$ pwd
/Users/jackeygao/Coding

2.回到主目录

无论你在任何位置, 你可以通过下面命令快速回到用户目录.

Bash

cd ~

or

Bash

cd

3.一行执行多个命令

多个语句可以通过';'分割

Bash

$ echo Hello; echo World; echo '.';
Hello
World
.

4.一行执行多个命令 (只有上一句执行成功才执行)

比较类似于链式操作, 但需要保证上一句的结果. SHELL 语言没有好的异常停止机制, 所以你必须显式的控制语句. 和上面有区别的是, 可以通过&&串联多个语句, 来保证所有语句必须在上一次执行成功才能这执行. 下面例子中如果 python-devel 已经安装, echo no不会执行.

Bash

$ rpm -qa | grep python-devel &> /dev/null && echo "ok" || echo "no"
ok

在 shell 中, 执行成功或者成功的完成了某个命令(比如grep的匹配)返回码用0表示, 失败或者没有完成某个命令的逻辑则用非0表示.

  • && 表示上一句返回码0才会执行
  • || 表示上一句返回码非0才会执行
  • ; 无论如何都执行

关于返回码, 你可以需要进一步的了解https://www.shellscript.sh/exitcodes.html.

5.搜索并执行历史命令

通过搜索历史命令, 可以很轻松的对历史命令进行复用。 一般很多 SHELL 程序都支持历史命令搜索.

Bash

Ctrl + R   然后 键入关键字

Bash

$ docker run --rm -i -p 8001:8001 -t nova python manage.py runserver 0.0.0.0:8001
bck-i-search: docker run       < 在这个提示符输入关键字(通过 Ctrl + R快捷键调出)

6.解锁你的终端

如果你不小心按到了 Ctrl + S , 那么你会得到一个『冻僵』(只是暂停(Stop)了)的终端 , 好像和死了一样。 而 Ctrl + S 是一般保存文档的快捷键, 这在和 vim 命令编辑文件的时候经常遇到的事情, 不要慌可以通过Ctrl + Q快捷键解冻.

7. 移动到行首或行尾

如下图, 如果我输入一个长的命令, 输入到最后在执行前我发现了问题, 需要在行首增加 sudo 。 这时我可以使用 Ctrl + A移动光标到行首.

8. 删除一个单词

默认通过 退格键 可以删除一个字符, 但如果我的命令很长, 删除操作就会很慢。 可以通过 Esc + 退格键(Backspace) 来删除一个单词(以空格, 符号分割区分).

9. 使用上个命令的最后参数

这个是很常见的场景, 比如我们创建一个目录, 一般紧接着就进到这个空目录操作了. 虽然可以补全操作, 但有一种更简单的方法,你也应该知道, 这会让你显得很酷。 就是组合快捷键[ESC + .], .号就是英文状态下的句号. 也可以通过!$.

Bash

$ mkdir my-test-directory-00001
mkdir: test: File exists
$ cd [按下EST + .] my-test-directory-00001

方法二:

$ cd !$
$ cd  my-test-directory-00001

10. 使用上一个命令

和上面不同的是, 这个操作是直接使用上一个命令, 而不是最后一个参数.

假如我需要安装一个包, 执行完毕后发现需要 root用户才可以安装, 这时我需要在前面加sudo。 请谨慎使用这个.

Bash

$ yum -y install nginx
permission denied

$ sudo !!
sudo yum -y install nginx
Loaded plugins: fastestmirror
....

11.xargs

这是一个魔法命令, 希望你去研究并学会它.

main xargs

12.使用 Python 替代你的 Shell.

前面已经说到, SHELL 没有严谨的异常处理. 如果有自动脚本, 这让服务器运维增加风险属性。 小的脚本还好, 一旦脚本迭代了几个需求,臃肿复杂而且维护性极差, 甚至会非常不安全。 我推荐你使用高级语言来替代 SHELL。 推荐 Python, Ruby 等解释性语言. 大多数系统都自带了 Python, 这对我们对脚本打包提供便利.

以上 : )

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

WCF客户端运行时架构体系详解[下篇]

当基于某个终结点创建的ChannelFactory<TChannel>被开启的之后,位于服务模型层的客户端运行时框架被成功构建。站在编程的角度看ChannelF...

1786
来自专栏你不就像风一样

深入理解Spring Boot数据源与连接池原理

在使用Spring Boot数据源之前,我们一般会导入相关依赖。其中数据源核心依赖就是spring‐boot‐starter‐jdbc 如下

1.5K3
来自专栏JavaEdge

大道缓存1 缓存特征2 缓存介质3 缓存分类和应用场景缓存实战

用户请求从界面(浏览器/App)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。

1161
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第三十三天 MongoDB初级学习

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

2312
来自专栏点滴积累

Jupyter(Python)中无法使用Cache原理分析

前言 最近需要在Jupyter中写一个类库,其中有一个文件实现从数据库中读取空间数据并加载为Feature对象,Feature对象是cartopy封装的geom...

3446
来自专栏有趣的Python

9- vue django restful framework 打造生鲜超市 -用户登录和手机注册(上)

Vue+Django REST framework实战 搭建一个前后端分离的生鲜超市网站 Django rtf 完成 手机注册和用户登录(上) drf的...

81712
来自专栏程序员互动联盟

【答疑释惑】菜鸟怎么调试简单程序?

首先公布昨天留的课后作业答案的宏定义函数的答案 #define f(a, b, x) a*x+b printf("%d, %dn", f(3,2,1), ...

3445
来自专栏Android先生

Android中极简的js与java的交互库-SimpleJavaJsBridge

最近接触android中js与java交互的东西很多,当然它们之间的交互方式有几种,但是我觉得这几种交互方式都存在一定的不足,这是我决定编写SimpleJava...

1353
来自专栏owent

可执行文件压缩

最近看Rust相关东西的时候看到一篇关于压缩可执行文件的文章。压缩可执行文件对嵌入式开发特别有用,但是延伸一下用来减少我们游戏行业里预编译的工具二进制包大小和A...

4571
来自专栏Kevin-ZhangCG

[ Java面试题 ]JavaWeb篇

3458

扫码关注云+社区

领取腾讯云代金券