当前位置: 首页 > 科技观察

学会这些Shell小技巧,我就爱上Linux了

时间:2023-03-17 21:38:15 科技观察

在学习了这些shell技巧之后,我爱上了Linux。以后我会定期分享一些Linux的实用技巧。习惯之后,使用Windows的时候可能会头疼,就像我一样。..先说题外话。大家总是问能不能装双系统,Linux哪个发行版好。这里统一回答。安装双系统很简单,网上有很多教程;至于发行版本,推荐Ubuntu,不要迷恋那些看起来牛逼的小众发行版。我们的判断标准是他们是否稳定,是否有完整的社区支持,这两个Ubuntu桌面版无疑是最好的。之前遇到了蓝牙键盘适配的问题,Ubuntu社区的一个大佬直接写了个驱动,完美解决了,真是出乎意料。当然,如果你有时间爱折腾,可以随意。或者如果你有钱,你不需要担心Linux发行版。玩MacBook。它继承了Linux的优点。小而漂亮的工具,加上管道符号和重定向等漂亮的设计理念,可以使许多复杂的任务自动化。本文介绍了一些基本的Linuxshell技巧,相信可以帮助你提高工作效率!输入相似的文件名太麻烦了。花括号括起来的字符串用逗号连接,可以自动展开,非常好用。直接看例子:$echo{one,two,three}fileonefiletwofilethreefile$echo{one,two,three}{1,2,3}one1one2one3two1two2two3three1three2three3你看,花括号里面的每个字符都可以跟下面(或者之前)组合)字符串。注意花括号和里面的逗号不能用空格隔开,否则会被认为是普通的字符串处理。这项技术的实际用途是什么?最简单实用的是cp、mv、rm等命令扩展参数:$cp/very/long/path/file{,.bak}#复制一份file.bak到file$rmfile{1,3,5}.txt#删除文件1.txtfile3.txtfile5.txt$mv*.{c,cpp}src/#将所有后缀为.c和.cpp的文件移动到src文件夹中。输入路径名太麻烦了。使用cd-return只是等待目录,只看例子:$pwd/very/long/path$cd#回到home目录看看$pwd/home/labuladong$cd-#returnto刚才的目录$pwd/very/long/path特殊命令!$会被替换成最后一个命令的最后一个路径,看例子:#Noexecutablepermissionadded$/usr/bin/script.shzsh:permissiondenied:/usr/bin/script.sh$chmod+x!$chmod+x/usr/bin/script.shspecialcommand!*将替换为上一条命令中输入的所有文件路径,直接看例子:#创建了三个脚本文件$filescript1.shscript2.shscript3.sh#Addallof它们具有可选的执行权限$chmod+x!*chmod+xscript1.shscript2.shscript3.sh可以在环境变量CDPATH中添加您常用的工作目录,当cd命令在当前目录中找不到您指定的文件/目录时,它会自动在CDPATH中的目录中查找。比如我经常去home目录和/var/log目录下找日志。我可以执行下面的命令:$exportCDPATH='~:/var/log'#cd命令会展开~目录和/var/log目录搜索$pwd/home/labuladong/musics$cdmysqlcd/var/log/mysql$pwd/var/log/mysql$cdmy_picturescd/home/labuladong/my_pictures这个技巧很有用,这样你就不用经常写完整的路径名了,节省很多时间。需要注意的是,以上操作都是bash支持的。当然其他主流的shell解释器支持扩展cd命令的搜索目录,但不一定是修改CDPATH变量。具体设置方法可以自行搜索。输入重复的命令使用特殊命令太麻烦了!!,可以自动替换为上次使用的命令:$aptinstallnet-toolsE:Couldnotopenlockfile-open(13:Permissiondenied)$sudo!!sudoaptinstallnet-tools[sudo]passwordforlabuladong:some命令非常多,具体参数一时想不起来怎么办?对于bash终端,可以使用Ctrl+R快捷键反向搜索历史命令。之所以叫反向搜索,是为了搜索最后输入的命令。比如按Ctrl+R后,输入sudo,bash会搜索最后一条包含sudo的命令,回车后就可以运行命令了:(reverse-i-search)`sudo':sudoaptinstallgit但是这种方式有缺点:首先,这个功能似乎只有bash支持。我用的是zsh作为shell终端,所以不能用;其次,我只能找出一个(最近的)命令。如果我想找到以前的命令,那是没有办法的。对于这种情况,我们最常用的方法是使用带有管道符的history命令和grep命令来查找某条历史命令:#过滤掉所有包含config字段的历史命令$history|grep'config'7352./configure7434gitconfig--global--unsethttps.proxy9609ifconfig9985clip-o|sed-z's/\n/,\n/g'|clip10433cd~/.config你使用的所有shell命令都会被记录下来,前面的数字表示是哪个命令,找到要重用的命令后,无需复制和粘贴命令,只需使用!+要重用的命令编号即可运行该命令。拿上面的例子,我想重新运行gitconfig命令,可以这样:$!7434gitconfig--global--unsethttps.proxy#运行后,我觉得history加pipeline加grep还是太多了类型。在你的shell配置文件(.bashrc、.zshrc等)中写这样一个函数:his(){history|grep"$@"}这样就不用写那么多了,只需要他的'some_keyword'搜索历史订单。我一般不使用bash作为终端。推荐一个很好用的shell终端zsh,也是我自己用的shell。这个终端还可以扩展各种插件,非常好用。具体配置方法可以自行搜索。其他提示1、yes命令自动输入字符y进行确认:我们在安装一些软件的时候,可能会出现交互问题:$sudoaptinstallXXX...XXXwilluse996MBdiskspace,继续吗?[y/n]一般我们都是一路y到最后,但是如果我们要自动化安装一些软件,那就很烦人了。遇到这样的交互式问题,我们就会卡住,不得不手动处理。yes命令可以帮到我们:$yes|your_cmd会自动一路往下走,不会停下来让我们进入。如果你看过上一篇Linux进程、线程、文件描述符的底层原理,就知道原理很简单:你单独运行yes命令,发现打印了很多字符y,和管道output和your_cmd的标准输入是连接的,如果your_cmd再问一个无聊的问题,它会从标准输入中读取数据,同时还会读取一个y和一个换行符,这和你手动输入y确认的效果是一样的.2.特殊变量$?记录最后一条命令的返回值。在Linuxshell中,遵循C语言的习惯,如果返回值为0,程序正常退出,如果不为0,则异常退出。在使用命令行的时候读取上一条命令的返回值是没有用的,但是如果你想写一些shell脚本,知道返回值就非常有用了。举个实际的例子,比如我的Github仓库fucking-algorithm,我需要在里面所有markdown文件的底部加上上一篇、下一篇、目录三个页脚链接。有些文章已经有了页脚。没有一个部分。为了防止重复添加,我必须知道一个md文件的末尾是否已经添加。这时候我可以用$?变量用grep命令来做:#!/bin/bashfilename=$1#检查文件末尾是否包含关键字tail|grep'Next'$filename#grep如果找到匹配会返回0,返回a找不到则为非零值[$?-ne0]&&{addfooter;}3.特殊变量$$记录当前进程的PID。这个功能在平时使用的时候可能用处不大,但是在写shell脚本的时候也是非常有用的。比如你想在/tmp中创建一个临时文件,文件的命名一直是一件很麻烦的事情。这时,可以使用$$变量扩展当前进程的PID作为临时文件名。PID在计算机中是唯一的,永远不会重复,也不需要记住临时文件的名字。好了,今天就来分享这些技巧吧。如果你对Linux感兴趣,可以点击观看分享。如果资料不错,下次再写一些。