Shell 命令奇淫技巧,就是有点短
1、在任意目录之间快速移动
你发现自己要在两个或更多目录之间频繁移动,一会切换到这里,一会切换到那里,来回跳转。这些目录之间隔得还挺远,反复输入冗长的路径让人疲惫不堪。
使用内建命令 pushd 和 popd 来管理目录栈,轻松地在目录之间切换。下面是一个简单的示例:
$ cd /tmp/tank
$ pwd
/tmp/tank$ pushd /var/log/cups
/var/log/cups /tmp/tank$ pwd
/var/log/cups$ ls
access_log error_log page_log$ popd
/tmp/tank$ ls
empty full$ pushd /var/log/cups
/var/log/cups /tmp/tank$ pushd
/tmp/tank /var/log/cups$ pushd
/var/log/cups /tmp/tank$ pushd
/tmp/tank /var/log/cups$ dirs
/tmp/tank /var/log/cups
复制代码 栈是一种后进先出的结构,这两个命令也正是这么做的。如果对一个新目录使用 pushd,那么它会将前一个目录压入栈中。当使用 popd时,它会弹出栈顶保存的当前位置,切换到新的栈顶目录。使用这些命令更改位置时,会从左到右输出目录栈中的值,对应于栈中自顶向下的顺序。
如果使用 pushd 时没有指定目录,那么它会交换栈顶的两个目录的位置,这样就可以重复使用 pushd 命令来实现两者之间的切换。cd命令也能够达到相同效果。
如果不记得目录栈中都有哪些目录,可以使用内建命令 dirs 按照从左到右的顺序显示。加上 -v 选项后,显示形式更形象。
$ dirs -v0 /opt/yongheng1 /opt/yongheng/Shell
$
复制代码 数字可用来调整栈内目录的位置。pushd +1 会将编号为 1 的目录置为栈顶(并切换到该目录)并将其他目录下压。
$ pushd +1
/opt/yongheng/Shell /opt/yongheng$ dirs -v
0 /opt/yongheng/Shell
1 /opt/yongheng
复制代码 要想看到类似于栈的目录列表,但又不希望出现编号,可以使用 -p选项。
# dirs -p /opt/yongheng/Shell /opt/yongheng复制代码 2、重复上一个命令
你刚刚输入了一个又长又麻烦的命令,其中包含了冗长的路径名和一堆复杂的参数。现在需要重新执行该命令。难道还得再输入一次?
这个问题有两种解决方法。第一种方法只需要在提示符下输入两个惊叹号,然后 bash 就会显示并重复执行上一个命令。例如:
$ cd /opt/ $ !! cd /opt/复制代码 另一种(更现代的)方法是使用箭头键。按上箭头键会回滚到执行过的上一个命令。如果找到了需要的命令,按下 Enter 键就可以(再次)执行该命令。
3、参数重用
重用上一个命令很简单,使用 !! 就行了,但你需要的未必总是整个命令。如何只重用最后一个参数呢?
用 !$ 指明上一个命令中的最后一个参数。!:1 表示第一个参数,!:2 表示第二个参数,以此类推。
多个命令使用相同的文件名为参数是司空见惯的事情。最常见的场景之一就是程序员编辑源代码文件,然后编译、再编辑,再编译……有了 !$,事情就方便多了。如下:
$ vi /some/long/path/name/you/only/type/once
...
$ gcc !$
gcc /some/long/path/name/you/only/type/once
...
$ vi !$
vi /some/long/path/name/you/only/type/once
...
$ gcc !$
gcc /some/long/path/name/you/only/type/once
...
$
复制代码 明白其中的意思了吗?这不仅省去了大量的键盘输入,还避免了错误。如果编译时输错文件名,那编译的可就不是刚刚编辑好的源代码文件了。有了 !$,就可以始终得到刚刚用过的文件名。要是想重用的参数位于命令行内部,可以使用带编号的 !: 命令来获取。
4、安全第一,命令测试
一不小心就会输错字符。 (不信你瞧!)即便是简单的 bash 命令,由此带来的后果也非常严重:你会移动错或删错文件。如果再加上模式匹配,结果更让人心跳,因为模式中的输入错误会导致南辕北辙的结果。小心谨慎的用户会怎么做?
可以使用命令历史特性和键盘便捷方式来重复参数,无须从头输入,因此能够减少输入错误。如果要用到棘手的模式来匹配文件,先用echo 测试一下模式能否正常匹配,然后再用 !$ 进行实际操作。例如:
$ ls
ab1.txt ac1.txt jb1.txt wc3.txt$ echo *1.txt
ab1.txt ac1.txt jb1.txt$ echo [aj]?1.txt
ab1.txt ac1.txt jb1.txt$ echo ?b1.txt
ab1.txt jb1.txt$ rm !$
rm ?b1.txt
$
复制代码 echo 是检查模式匹配结果的一种方法。一旦确信结果符合预期,就可以将模式用于实际命令。这里我们要删除有特定名称的文件,没人愿意在这种事上犯错。
往期优秀:
Apache Druid数据查询套件详解计数、排名和分位数计算(送JSON-over-HTTP和SQL两种查询详解)
如果你还没玩过Docker Stack管理服务,你已经out了,(送Portainer集群管理教程)
怎样才能快速成为一名架构师?
如何从Java工程师成长为架构师?
六种常用事务解决方案,你方唱罢,我登场(没有最好只有更好)
超详细教程,一文入门Istio架构原理及实战应用
【图解源码】Zookeeper3.7源码剖析,Session的管理机制,Leader选举投票规则,集群数据同步流程
【图解源码】Zookeeper3.7源码分析,包含服务启动流程源、网络通信、RequestProcessor处理请求
【知其然,知其所以然】配置中心 Apollo源码剖析
【推荐】我认为这是最完整的Apollo教程从入门到精通
探针技术-JavaAgent 和字节码增强技术-Byte Buddy
100003字,带你解密 双11、618电商大促场景下的系统架构体系
【开悟篇】Java多线程之JUC从入门到精通
12437字,带你深入探究RPC通讯原理
JVM调优实战演练,妈妈再也不同担心我的性能优化了
13651个字,给你解释清楚 JVM对象销毁
搞不懂JVM的类加载机制,JVM性能优化从何谈起?
4859字,609行,一次讲清楚JVM运行数据区
让实习生搭个Redis集群,差点把我”搭“进去~~~
我用Redis分布式锁,抢了瓶茅台,然后GG了~~
新来的,你说下Redis的持久化机制,哪一种能解决我们遇到的这个业务问题?
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
