热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

作者:林果皞链接:https:www.zhihu.comquestion21690166answer66721478来源:知乎著作权归作者

作者:林果皞
链接: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&#61;70000000 &#xff08; HISTSIZE&#61;<设空> 曾在旧的 gdb 造成有趣的 bug&#xff0c; 参考 linux - GDB up arrow doesnt work&#xff09;。HISTSIZE 和 HISTFILESIZE 两个都需要设置&#xff0c;切记&#xff01;

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

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

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

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


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


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

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

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

"\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&#43;左右键&#xff0c; 可以以每个完整英文字的空格间隔来快速浏览&#43;编辑一条命令行。"\e[1;5D" 和 "vi-prev-word" (空格间隔), "backward-word" (空格 ?&#61;./ 间隔) 此类的关键字可以通过 bind -P 或 bind -p 取得。

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

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

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

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

 

 

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

 

&#xff08;p/s: 没看过 typea 命令&#xff1f; 当然&#xff0c; typea 也是我写的小工具&#xff0c; 是进阶版的 type -a&#xff0c;github 代码)

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

 

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

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

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

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

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

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

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

 

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

$ superman -i gcc wall

 

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

 

跳跃至 mplayer 的 scale:

 

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

function superinfo () {if [[ "$1" &#61;&#61; "-I" || "$1" &#61;&#61; "-i" ]]; theninfo "$2" | less -I -p "^ *‘*&#39;*\"*-*\** *$3’*( |&#61;|,|$|\[|:|&#39;|\&#43;|\")"elseinfo "$1" | less -p "^ *‘*&#39;*\"*-*\** *$2’*( |&#61;|,|$|\[|:|&#39;|\&#43;|\")"fi
}

使用方式和 &#96;superman&#96; 一样:

$ superinfo -i gcc werror

9. 有少许命令是 shell built-in&#xff0c; 不能直接 man:

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

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

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

直接跳跃至 &#96;man bash&#96; 的 &#96;cd&#96; 部分 (当然&#xff0c;&#96; superman bash cd&#96; 也可以)&#xff1a;

 

编辑于 2019-07-07

 

 


推荐阅读
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • Workbench 流固耦合分析:选择经典APDL还是现代Workbench?一文帮你做出明智决策
    随着ACT插件的推出,经典版APDL的大部分高级功能已成功迁移至现代Workbench平台。本文将深入探讨Workbench在流固耦合分析中的应用,帮助读者在经典APDL与现代Workbench之间做出明智的选择。通过对比两者的功能、易用性和扩展性,我们将为用户提供全面的参考信息,助力其在工程仿真领域取得更好的成果。 ... [详细]
  • 数据库多表联合查询:内连接与外连接详解
    在数据库的多表查询中,内连接和外连接是两种常用的技术手段。内连接用于检索多个表中相互匹配的记录,即只有当两个表中的记录满足特定的连接条件时,这些记录才会被包含在查询结果中。相比之下,外连接则不仅返回匹配的记录,还可以选择性地返回不匹配的记录,具体取决于左外连接、右外连接或全外连接的选择。本文将详细解析这两种连接方式的使用场景及其语法结构,帮助读者更好地理解和应用多表查询技术。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • Linux Shell变量初探:初始值解析与使用指南
    本文探讨了Linux Shell中变量的基本概念及其在BASH中的应用。变量是用于存储可变数据的标识符,能够代表不同的值。文章详细介绍了BASH shell的主要优势,包括强大的命令编辑能力、自动补全功能、命令别名设置、作业控制以及前后台任务管理。此外,还涵盖了编程脚本编写和通配符的使用方法,为初学者提供了全面的指导。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • Linux入门教程第七课:基础命令与操作详解
    在本课程中,我们将深入探讨 Linux 系统中的基础命令与操作,重点讲解网络配置的相关知识。首先,我们会介绍 IP 地址的概念及其在网络协议中的作用,特别是 IPv4(Internet Protocol Version 4)的具体应用和配置方法。通过实际操作和示例,帮助初学者更好地理解和掌握这些基本技能。 ... [详细]
author-avatar
幻灵风
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有