如何学习(记住)linux命令(常用选项)

作者:林果皞
链接:https://www.zhihu.com/question/21690166/answer/66721478
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

Unix & Linux 命令行特别之处在于,一些选项的设计是遵循传统的, 只需认识一个就能在其它命令使用相似的功能。选项通常都是相关功能的英文缩写,并非毫无意义的英文字。

1. -h 通常意指 'h' + uman, 也就是 human-readable,能让人类方便读的格式输出, 比如 1.3 GB 格式, 而不是 1300000000 bytes, 代表者有: ls -lth, sort -h

2. -v (小写) 通常意指 'v' erbose, 代表者有: curl -v, ssh -v, python -v

  • 2.1 -V (大写) 通常意指 ‘V’ ersion,与 --version 相比之下比较冷门,代表者有: gedit -V, firefox -V, openvt -V
  • 2.2 --version (小写 v) 也是意指 ‘V’ ersion,代表者是九成的命令: python --version, konsole --version, gnome-shell --version, firefox --version, chromium-browser --version, bash --version, curl --version, tree --version, ls --version, journalctl --version, gedit --version, unp --version。 除了 java 和 javac 使用非 GNU 标准的 -version (少了一个 '-')
  • 2.3 --help, 同上, 九成的命令都有。不推荐 -h, 很多命令没有 -h, 亦或已经用来代表 'h'uman-readable。

3. -a 通常意指 'a'll, 全部文件的意思(因为开头 "." 命名的文件是默认隐藏的如 vim 的 .swp 恢复文件, 历史原因和后果请看此 https://plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp), 代表者有: ls -a, tree -a

4. -r 通常意指:

  • [a]. 'r' + everse, 上下颠倒的意思,代表者有: ls -lthr, sort -r
  • - 本人的 l alias 是 `ls -larthiF --context --color', 其中 t+r 排列最新更改日期的文件在最下方,毕竟大多数情况下,我只关心最近的文件。
  • [b]. 'r' + ecursive, 递归的意思,普遍用于遍历目录的子目录,代表者有: grep -r, rm -r
  • [c]. 'R' 也可能意指 'R' ecursive , 代表者有:
  • [c.1] ls -R, chmod -R
  • [c.2] grep -R (--dereference- 'R' ecursive)
  • [d]. rm 和 cp 的 -r 和 -R 同样是 recursive。切记有些平台只有 -r, 有些平台只有 -R, 有些平台两者都有。

5. --exclude-dir 排除某个目录,代表: cloc . --exclude-dir=xxx, grep -rniI --exclude-dir=xxx abc ./* 。

  • 5.1 "exclude" 是排除的意思,对立的就是 "include"。"dir" 是 "directory" 的缩写,表示 "目录"。Unix 传统不使用 "folder" 这个英文表示目录。

建议:
0. 学习命令选项不需要英文很好,manual 的英文简单,而且重复频率很高, 如 invoke, locale,compatible, configure, ... etc 不像英文小说每一段都有新词囧。

1. 不仅仅是 man,当不确定的时候,可以用 --help 快速一览选项。切记 --help 不等同于 man, 有时需要两个命令互补。也别忘了 info。要切记的是 man 本身有 section 分类 ,如图所示, `man 1 ls` 和 `man 1posix ls` 可以浏览两个不同的 manual, 用 `apropos -e` 或 `whatis` 可以显示 section 代号:

 

p/s: 有些 manual 要特地安装后才有。如 `sudo apt-get install glibc-doc manpages-dev glibc-doc-reference`, `sudo apt-get install manpages-posix manpages-posix-dev` (`man 1posix ls` 就是这儿来的)

2. 如果 php 是世界上最好的语言,那么 "你使用过的命令行历史记录" 就是世界上最好的笔记。善用 history | grep 'xxx' 搜索之前用过的命令/选项,如:

p/s: h 是 history 的 alias, g 则是 `grep -n` 的 alias。| 是 pipeline, 这里把 history 输出给下一个命令 grep, 过滤成只有 ' -u ' 的历史记录。

2.1 history 潜力无限,比如搜索 curl 命令历史,可以知道使用过的 url, 方便再度使用:

我的历史命令分成有时间和没时间输出两种。`h` 是没时间的,方便快速看(时间占位子)。而 `histime` 是有时间的。 切记别更改 history (比如 alias history='xxx'),因为这会影响其它命令使用 history 。这是我的 ~/.bash_aliases 有关 history 的部分:

HISTTIMEFORMAT="%Y/%m/%d %T " 
alias histime='history'
alias hisdefault='(HISTTIMEFORMAT=""; history;)'
alias h=hisdefault
HISTFILESIZE= 
HISTSIZE= 
HISTCONTROL=ignoreboth
function hisunique()
{hisdefault | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | cat -v | column -c3 -s " " -t | sort -nr | nl |  head -n100000
}

2.2 别忘了提升 history 记录上限。如 HISTSIZE=70000000 ( HISTSIZE=<设空> 曾在旧的 gdb 造成有趣的 bug, 参考 linux - GDB up arrow doesnt work)。HISTSIZE 和 HISTFILESIZE 两个都需要设置,切记!

[提醒] 如果你像我一样把 HISTSIZE 和 HISTFILESIZE 放在 bash_aliases,那么别忘了把 /root/.bahsrc 和 /home/<用户名>/.bashrc 的预设 `HISTSIZE=1000` 和 `HISTFILESIZE=2000` 删除,否则你会奇怪干嘛最多储存 2000 行记录。

[提醒二] 尝试 HISTSIZE 和 HISTFILESIZE 设置的时候请先备份 ~/.bash_history , 因为如果你设置 HISTSIZE 和 HISTFILESIZE=1 , 那么你 ~/.bash_history 以前的记录就只剩下一个了。又或者 >~/.bash_aliases 的危险实验会造成 ~/.bash_history 失去大量的记录。

[提醒三] 该历史记录设置只有 tab 正常关闭才会写入 ~/.bash_history, 所以 /bin/bash 崩溃时也会损失当前历史记录的,为了避免此状况发生,如果你觉得已经输入很多重要的记录, 就应该关闭 tab (Ctrl+D) 重启新的 tab (Ctrl+Shift+T)。

2.3 我也写了一个小工具,用不同高亮颜色,排列不同时间段的历史记录。如图所示,假设两个命令间隔超过 60 秒为新的时间段颜色,可以一眼看出同一时间段所使用的命令组。我之所以有这个构思是源自于我需要重复使用某个时间段的命令,却难以在 history 下找出该命令组的范围(因为邻近命令很相似, 只路径稍微不一样)。github 代码。


2.4 这里必须安利 konsole 终端程序, 下图左 konsole 右 gnome-terminal, 只有 konsole 才有同时高亮的功能 (支持 regex)。这也是我仍然坚持用 konsole 的唯一原因, 而不是能显示缩略图的 terminology 终端:


3. 善用自动完成,比如 ls --s<敲 Tab 键>, Tab 键不仅仅可以查找命令, 找选项,还可以找文件名。

3.1 新手会觉得 Tab 键很强大, 但是同等强大的 Page Up/Down 被一般的教程所忽略了。输入 ls 再按 Page Up/Down 可以自动完成且浏览之前的命令历史。 不需要完整的命令。如输入 fi 再按 Page Up,就会自动完成 `file /etc/gdm3/Xsession`, 再按 Page Up,就会自动完成 `find . -iname pool.jpg`,以上都是我输入过的 fi 开头的历史记录, 加上 Page Down 就可以上下浏览。购买键盘时请确保 Page Up/Down/Home/End 拥有独立的键,而不是需要 Fn。Home/End 键的好处是快速切换去命令行的前方和后方。

p/s: 如果没有 Page Up/Down 功能,请新建文件 ~/.inputrc , 确保有以下内容:

"\e[5~": history-search-backward
"\e[6~": history-search-forward
"\e[1;5D": vi-prev-word
"\e[1;5C": vi-next-word

前两者是启动 Page Up/Down 自动完成历史记录功能。后两者是启动 Ctrl+左右键, 可以以每个完整英文字的空格间隔来快速浏览+编辑一条命令行。"\e[1;5D" 和 "vi-prev-word" (空格间隔), "backward-word" (空格 ?=./ 间隔) 此类的关键字可以通过 bind -P 或 bind -p 取得。

3.2 基本的上下键则适用于浏览当前 session 最近的历史记录。

3.3 Ctrl+Alt+] 再输入 -a 可以把光标移动去当前命令的 -a 选项 (不限于选项,任何字都行)。缺点是只能输入一个字, 多字可以使用 Ctrl+R 解决。输入 Ctrl+R 再输入选项 -a 可以出现之前的 -a 选项历史纪录, 然后敲左右键能停留且编辑。连续的 Ctrl+R 可以浏览更前的命令。

4. 善于在 ~/.bashrc 或 ~/.bash_aliases 上制作 alias 或 function, 好处是:
[a]. 省却记忆量。
[b]. 提升使用命令速度。
[c]. 可以在命令旁加入 #comment (或 <<"COMMENT" 开端, COMMENT 结尾), 随时打开 ~/.bash_aliases 复习。也可以用 `type -a 命令` 快速复习。我通常也会记录命令的相关讨论链接和心得撰写在 note 文件,有需要就 grep 或 vi 里头搜索即可。告诉你一个小技巧,把笔记后缀命名为相应的编程语言, 如 note.sh, note.c, note.java,打开时就可以直接获得美美的高亮。

4.1 写一些有用的小工具。小工具本身就集成了很多选项的实践,往后若要编写相似功能的小工具,只需参考先前的选项是怎么用的。比如本人写了recursive+高亮的 recurcat :

 

 

代码包含了 find 的选项用法 (github 代码):

 

(p/s: 没看过 typea 命令? 当然, typea 也是我写的小工具, 是进阶版的 type -a,github 代码)

5. 善用英文搜索 stackexchange( 也就是 Unix Linux Stack Exchange), stackoverflow,bash(大多数的命令问题都与 bash tag 相关) 关键字。有一点很重要,搜索 stackexchange 可以找到包括 stackoverflow 的结果:

 

p/s: 搜索选项时别放减号, 如上图,输入 ff 而不是 -ff。因为减号在搜索引擎是排除的意思。

5.1 在 stackexchange 或类似网站帮助别人。你不需要本来就很了解答案,但是在强答的过程中,你为了保证答案的准确性,权威性,你会参考不同的资源,反复研究命令,这个过程可以学习到很多,特别是别人的问题很多都是 real-world problem,与工作环境息息相关的实践,有助你未来的编程工作。而且这也是一种笔记, 当你忘了某个命令课题, google 搜的答案就是你自己的回答,囧。

6. 常备份 ~/.bashrc, ~/.bash_aliases, ~/.bash_history 以及 note。安装新的 os 时也可以直接迁移。说个题外话,其它如 ~/.vimrc 的备份也很重要。limkokhole/hisblock 最下方会教导你如何让 gdrive 关机时自动备份 ~/.bash_history。

7. 善用懒人包命令,比如 unp 足以应付大多数解压需求。懒人包带来的是好处(不用记忆)还是坏处(用 Linux 十年也不懂 xvfz)有待斟酌。顺便安利我最近写的 limkokhole/unx 取代无法自动新建 (1),(2) 目录的 unp。

8. 打开 man 时要找选项是一件头疼的事,用 /<空格>-Wall 搜索, 敲 -i 切换大小写敏感性,这个 一般的 regex 其实无法囊括所有的选项的情况 (不信 ? 请现在 `man mplayer` 之下 /<空一格> scale 进行搜索),要不然就是大海捞针。

我编写了 superman 函数 (github 代码):

function superman () {if [[ "$1" == "-I" || "$1" == "-i" ]]; thenman "$2" | less -I -p "^[ ]+\"*-*$3( |=|,|$|\[|\+|\")"elseman "$1" | less -p "^[ ]+\"*-*$2( |=|,|$|\[|\+|\")"fi
}

 

使用方式 (-i 表示 case insensitive) (本人 alias superman 去 sman 更方便):

$ superman -i gcc wall

 

能够直接跳跃至 Wall 选项 (通常都是有几个结果,可以用 n 和 Shift+n 快速上下跳跃):

 

跳跃至 mplayer 的 scale:

 

我也写了 info 版本的 superinfo 函数:

function superinfo () {if [[ "$1" == "-I" || "$1" == "-i" ]]; theninfo "$2" | less -I -p "^ *‘*'*\"*-*\** *$3’*( |=|,|$|\[|:|'|\+|\")"elseinfo "$1" | less -p "^ *‘*'*\"*-*\** *$2’*( |=|,|$|\[|:|'|\+|\")"fi
}

使用方式和 `superman` 一样:

$ superinfo -i gcc werror

9. 有少许命令是 shell built-in, 不能直接 man:

$ man cd
No manual entry for cd
$ type -a cd
cd is a shell builtin

你需要使用 `man bash`(假设你是使用 bash shell) ,然后在里头搜索,或者用这个自制的 bashman 函数:

$ type -a bashman
bashman is a function
bashman () 
{ man bash | less -p "^       $1 "
}
$ bashman cd

直接跳跃至 `man bash` 的 `cd` 部分 (当然,` superman bash cd` 也可以):

 

编辑于 2019-07-07

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

增效工具_【危中寻机】降本增效生存之道 运用IE基础工具提升制造效率

效率提升的利器工业工程IE作为一门学科诞生于美国&#xff0c;却首先在日本得到了最大程度的践行与推广&#xff0c;成为了丰田生产方式TPS及精益制造LP的核心现场IE中的4大核心(工程分析、动作分析、时间分析、布局分析)仍是所有IE的入门工具&#xff0c;被笔者称为“基础IE”…

as将安卓应用打包_Android Studio打包生成apk的方法(超级简单哦)

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;打包文件是需要生成APK文件&#xff0c;其他人可以通过APK安装和使用&#xff0c;一般来说&#xff0c;包是指APK生成的发布版本&#xff0c;下文技术狗小编还介绍了Android Studio 超级简单的打包生成apk的方法&a…

Linux中常用的命令都是哪些单词的缩写

作者&#xff1a;蓬岸 Dr.Quest 链接&#xff1a;https://www.zhihu.com/question/49073893/answer/114986798 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 417个命令缩写&#xff1a;https://www.abbreviations.co…

ubuntu mysql 防火墙_mysql、ubuntu系统防火墙常规操作

mysql、ubuntu系统防火墙常规操作编辑&#xff1a;006 时间&#xff1a;2020-02-11mysql&#xff1a;数据库操作连接数据库&#xff1a;mysql -u username -p创建数据库&#xff1a;create database databasename;删除数据库&#xff1a;drop database databasename;指定数…

如何轻松记忆Linux文件系统层次结构

Linux对于新手来说非常难学。打好基础对于后面深层次的学习非常重要。 对文件系统层次结构要基本的概念。怎么才能理解并且记忆层级结构呢&#xff1f; 方法/步骤 为了帮助记忆&#xff0c;我做了一个比较清晰的图表来协助层次的记忆。 很多目录文件夹的名字长得非常抽象&…

fmc是fpga直接引出来的吗_家长速看!你还在用“不要和陌生人说话”糊弄孩子的安全教育吗?...

在许多幼儿安全教育案例中&#xff0c;我们都会看到这样一个试验&#xff1a;记者假扮人贩子&#xff0c;利用棒棒糖、零食去诱惑幼儿园的孩子。在其中一次试验中&#xff0c;21个孩子有20个中招&#xff0c;直接跟着陌生人走了。这个试验最终引出来的结论就是要教育孩子不要和…

CentOS 7文件系统与日志分析详解

Linux 文件系统 在处理 Linux 系统出现的各种故障时&#xff0c;故障的症状是最易发现的&#xff0c;而导致这一故障的原因才是最终排除故障的关键。熟悉 Linux 系统中常见的日志文件&#xff0c;了解一般故障的分析与解决办法&#xff0c;将有助于管理员快速定位故障点、“对…

oracle同一个示例两个用户的数据同步_分享两个shell脚本--一键统计Oracle数据库用户信息...

概述今天主要分享一下两个shell脚本&#xff0c;主要是为了查看所有数据库用户及其表空间&#xff0c;统计某个指定用户的明细&#xff0c;下面一起来看看吧~数据库连接脚本use script settdb.sh for DB login details registry#!/bin/bashtmp_username$SH_USERNAMEtmp_passwor…

plsql视图添加表字段_教你不到两分钟,快速创建数据透视图

如果说数据透视表给我们提供了灵活、快捷的数据计算工具, 那么数据透视图就是更直观、动态地展现大批量数据的变化规律和趋势。数据透视图作为数据透视表中的重点内容&#xff0c;高阶的内容包括数据透视图的编辑、美化成高大上的数据分析图表。与万能切片器结合使用实现多表甚…

c datatable导入mysql_《项目经验》–简单三层使用DataTable向数据库表批量导入数据—向SqlServer一张表中导入数据 | 学步园...

向数据库的一张表中添加数据&#xff0c;可以采用单个添加&#xff0c;即一条数据、一条数据的添加&#xff1b;也可以采用批量导入&#xff0c;依次将好些条数据写入数据库的一张表中。文本借助实例《添加系列信息》讲解一种向数据库批量导入数据的方法。1.界面设计观看一下添…

项目架构开发:数据访问层之Cache

数据访问层简单介绍 数据访问层&#xff0c;提供整个项目的数据访问与持久化功能。在分层系统中所有有关数据访问、检索、持久化的任务&#xff0c;最终都将在这一层完成。 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 1、有缓存、日志、异常处理、数据CRUD、…

jquery mysql实现加入购物车_jQuery实现加入购物车飞入动画效果

HTML首先载入jQuery库文件和jquery.fly.min.js插件。接着&#xff0c;将商品信息html结构布置好&#xff0c;本例中&#xff0c;我们用四个商品并排布置&#xff0c;每个商品box中包括有商品图片、价格、名称以及加入购物车按钮等信息。&#xffe5;3499.00LG 49LF5400-CA 49寸…

结合vue、react、angular谈谈MVC、MVP、MVVM框架

首先&#xff0c;在谈这个话题之前&#xff0c; 我们有必要了解一下库和框架的区别。 我们先来看react官网以及vue官网对他们的定位&#xff1a; react: vue: react我们不说了&#xff0c;官网上明明白白说了&#xff0c;人家是一个library&#xff0c;用于构建用户界面。 v…

先进的ASP.NET开源工作流快速开发框架 - RoadFlow

.net可视化工作流引擎RoadFlow - 设计概述 RoadFlow是天知软件旗下基于.NET的工作流快速开发平台&#xff0c;由从事六年以上OA及工作流开发与实施的团队设计开发&#xff0c;该工作流平台已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角…

view [bootstrap-4] not found如何解决_Dubbo如何处理业务异常,这个一定要知道哦

前言我们在开发应用系统时&#xff0c;不可避免的要使用到我们自己定义的异常&#xff0c;所以我们一般通常会用到自定义的业务异常类BusinessException&#xff0c;这个异常会继承extends RuntimeException&#xff0c;当发生业务限制的时候&#xff0c;会throw出来。问题在Sp…

android 加载网络bitmap图片 oom 简书_Android常见问题--ImageView加载图片OOM

开发中给ImageView加载一个高质量图片时&#xff0c;APP抛出了“Canvas: trying to draw too large(840253440bytes) bitmap.”的异常。猜测是图片占用内存太大&#xff0c;超出APP被分配的内存(我用的mate9&#xff0c;APP被分的内存差不多200m)&#xff0c;造成了OOM。解决方…

matlab连接mysql教程视频_Matlab建立到Oracle数据库的连接

Linux下的配置过程和Windows一样&#xff0c;如下&#xff1a;1、将Oracle JDBC的JAR包拷贝到Matlab的相关目录(..\matlab\java\jar\toolbox\)下。一、Matlab通过ODBC建立到Oracle数据库的连接1、在Windows下“开始”→“控制面板”→“性能和维护”→“管理工具”&#xff0c;…

C# App.config学习

进入公司一年多来&#xff0c;对配置文件添加了不少参数&#xff0c;但是从未想过这些参数是如何被读取出来的&#xff0c;今天把读取参数的处理看了一下&#xff0c;收获不少。假定有App.config如下 <?xml version"1.0" encoding"utf-8" ?> <…

大数据-----软件开发模型(详细讲解)

大数据学习免费学习资料&#xff08;免费教程&#xff09; 软件工程中&#xff0c;常用的开了模型有四种&#xff1a;瀑布模型、原型模型、增量模型和螺旋模型。 ⒈瀑布模型包括计划&#xff0c;需求分析、设计、编码、测试、运行维护六个阶段&#xff0c;阶段自上而下&#x…

C#中struct和class的区别详解

本文详细分析了C#中struct和class的区别&#xff0c;对于C#初学者来说是有必要加以了解并掌握的。 简单来说&#xff0c;struct是值类型&#xff0c;创建一个struct类型的实例被分配在栈上。class是引用类型&#xff0c;创建一个class类型实例被分配在托管堆上。但struct和cla…