别出心裁的Linux命令学习法

别出心裁的Linux命令学习法

操作系统操作系统为你完成所有“硬件相关、应用无关”的工作,以给你方便、效率、安全。操作系统的功能我总结为两点:管家婆服务生

  • 管家婆:通过进程虚拟内存文件三个重要抽象管理计算机的CPU、内存、I/O设备。
  • 服务生:为用户提供shell,为程序员提供系统调用

大家都比较熟悉Windows操作系统,Linux也是一种操作系统。Linux的架构如下图:

Linux 架构

如果使用GUI,Linux系统和Windows操作系统的使用没有什么大的区别,用鼠标可以解决大部分问题。

Linux学习应用的一个特点是通过命令行进行使用。学习使用Linux,实验楼推荐的学习路径如下:

Linux学习路径

命令行的好处主要是可以批处理并自动化,还有些功能GUI无法完成,大家可以慢慢学习体会。

那么多命令先学什么,后学什么是一个大问题,本文期望找一种方式,通过解决“Where”的问题,通过几个核心命令的学习,让你可以举一反三通过实践学习其他命令,从而解决Linux命令的“what”问题。

我们使用的Linux发行版是Ubuntu,使用Ubuntu有几个快捷键要掌握一下,可以提高使用命令行的效率:

  • CTRL+ALT+T:打开终端,天天使用终端,用鼠标打开太低效了;
  • CTRL+SHIFT+T:新建标签页,编程时有重要应用;
  • ALT+数字N:终端中切换到第N个标签页,编程时有重要应用;
  • Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成;
  • 上下键盘:切换命令历史,刚输入一个很长的命令,按键就可以恢复;
  • CTRL+C:中断程序运行。

1 Linux命令

登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着选项(options)或参数(arguments)。即Linux中命令格式为:

command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数

其中选项(option)是调整命令执行行为的开关,选项不同决定了命令的显示结果不同,参数(arugment)是指命令的作用对象。

如ls命令,lsls .是两条等价的命令,显示是当前目录的内容,这里“.”就是参数,表示当前目录,这个参数缺省可以省略。我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录。其中“-a” 就是选项,改变了显示的方式,如下图所示:

Linux Command Example

以上简要说明了Linux命令以及选项和参数的区别,但具体Linux中哪条命令有哪些选项及参数,以及如何使用,需要我们靠经验积累或者查看Linux的帮助文档了。

2 man命令

不论学习编程还是Linux命令,掌握帮助文档的使用都是很重要的,是举一反三的重要途径。

man是manual的缩写,我们可以通过man man来查看man的帮助,如下图:

man man

man

帮助文档包含:

    1 Executable programs or shell commands(用户命令帮助) 
    2 System calls (系统调用帮助)  
    3 Library calls (库函数调用帮助)  
    4 Special files (usually found in /dev)  
    5 File formats and conventions eg /etc/passwd(配置文件帮助)  
    6 Games  
    7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)  
    8 System administration commands (usually only for root)  
    9 Kernel routines [Non standard]  

解释一下:

1是普通的Linux命令  
2是系统调用,操作系统的提供的服务接口 
3是库函数,  C语言中的函数
5是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义  
6是给游戏留的,由各个游戏自己定义  
7是附件还有一些变量,比如向environ这种全局变量在这里就有说明  
8是系统管理用的命令,这些命令只能由root使用,如ifconfig 

其中1,2,3是初学时学习的重点,区别大家练习一下就知道了,比如printf是C语言的库函数,也是一个Linux命令,大家尝试一下man printf,man 1 printf,man 3 printf,体会一下区别。

知道printf 命令也好,printf函数也好,查找帮助文档都很容易。man有一个-k 选项用起来非常好,这个选项让你学习命令,编程时有了一个搜索引擎,可以举一反三。

我们通过一个例子来说明,比如数据结构中学过排序(sort),我不知道C语言中有没有完成这个功能的函数,可以通过“man -k sort”来搜索,因为是找C库函数,我们关注带3的,qsort好像是个好选项,如下图:

结合后面学习的grep 命令和管道,可以多关键字查找:

man -k key1 | grep key2 | grep key3 | ...

例如使用man -k sort | grep 3,可以更好的找到qsort,你可以试试。

man -k 有个等价的命令apropos,大家可以学习一下。

使用man -k找到命令后,可以用man -f cmd查看命令的基本功能。man -f等价于whatis.

3 cheat 命令

man 虽然很重要,但有些命令看了帮助还不会用,初学者需要例子,cheat就是这个身边的小抄。
cheat 命令不是Linux自带的,大家参考这篇文章英文版)安装,实验楼课程实验系统中已经安装了。Ubuntu中已经默认安装好了python,cheat安装过程如下:

sudo apt-get install python-pip git
sudo pip install docopt pygments
git clone https://github.com/chrisallenlane/cheat.git
cd cheat
sudo python setup.py install

cheat是作弊,小抄的意思。

cheat命令是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。比如强大的find命令,初学者看完帮助文档后可能还是一头雾水,那么我们cheat find一下:


\*To find files by case-insensitive extension (ex: .jpg, .JPG, .jpG):

find . -iname "*.jpg"

\# To find directories:

find . -type d

\# To find files:

find . -type f

\# To find files by octal permission:

find . -type f -perm 777

\# To find files with setuid bit set:

find . -xdev \( -perm -4000 \) -type f -print0 | xargs -0 ls -l

\# To find files with extension '.txt' and remove them:

find ./path/ -name '*.txt' -exec rm '{}' \;

\# To find files with extension '.txt' and look for a string into them:

find ./path/ -name '*.txt' | xargs grep 'string'

\# To find files with size bigger than 5 Mb and sort them by size:

find . -size +5M -type f -print0 | xargs -0 ls -Ssh | sort -z

\# To find files bigger thank 2 MB and list them:

find . -type f -size +20000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

\# To find files modified more than 7 days ago and list file information

find . -type f -mtime +7d -ls

\# To find symlinks owned by a user and list file information

find . -type l --user=username -ls

\# To search for and delete empty directories

find . -type d -empty -exec rmdir {} \;

\# To search for directories named build at a max depth of 2 directories

find . -maxdepth 2 -name build -type d

\# To search all files who are not in .git directory

find . ! -iwholename '*.git*' -type f

\# Find all files that have the same node (hard link) as MY_FILE_HERE

find . -type f -samefile MY_FILE_HERE 2>/dev/null

通过实践结合man命令把上面的例子理解了,find基本上就用的很不错了。

使用cheat命令作弊是可以的。:)

4 其他核心命令

和查找相关的核心命令还有find,locate,grep,whereis,which等,其中:

  • find查找一个文件在系统中的什么位置,locate是神速版本的find(Windows下有个神器Everything和locate功能类似)。可以通过cheat find学习find命令。

  • grep 可以对文件全文检索,比如你接手一个C语言项目,里面有上百个C源文件,想找找main函数在那个文件中,你可以通过grep -n main *.c,快速找到main在哪个C文件中并指出在第几行。grep支持正则表达式正则表达式也是一个重要的元知识。可以通过cheat grep学习grep命令。上面还提到,

  • whereis,which告诉你使用的命令工具装在什么地方。Linxu初学者会不习惯Linux的文件系统,C盘呢?D盘呢?用apt-get install安装程序好象也不用我们选择安装位置,程序装在哪了?比如:我们在Linux下上网使用firefox浏览器,大家可以使用whereis firefox或更精确的使用which firefox来看看结果。

  • apt-cache可以在使用apt-get install安装一个程序时先找找软件源的库里有没有这个程序,有才可以安装。比如老师推荐了一个调试工具ddd,你可以用apt-cache search ddd查查有没有这个程序。

5 终端“每日提示”学习

主动学习是学习方法中非常重要的一点,我们可以“问题驱动”,遇到问题用"man -k key"搜索相关Linux命令,然后用"man cmd" 查看帮助文档结合“chea cmd”来学习,开始学习时我们也可以每次打开终端就学习一个Linux命令,这样日积月累,就能更好的掌握Linux命令了。

我们可以让终端自动给我们个每日提示,让我们的学习自动化:

更娱乐化一点,我们先安装cowsay。在Ubuntu下安装cowsay:

sudo apt-get install cowsay

安装cowsay后,在.bashrc中增加下面一行:

cowsay -f $(ls /usr/share/cowsay/cows | shuf -n 1 | cut -d. -f1) $(whatis $(ls /bin) 2> /dev/null | shuf -n 1)

每次打开终端,就会出现类似的界面,你就可以了解一个Linux命令了:

6 小结

上面的命令包括man -k有一个共同特点就是基于“搜索”解决了学习方法问题,这些命令学好用熟后可以举一反三,大家重点学习,掌握了他们,其他命令就可以自学了。特别是man(man -k)和cheat对Linux命令学习非常重要。

我们课程涉及到的Linux命令在下面列出了,使用上面的搜索命令通过实践学习吧:

ac,apt-get,apt-cache
bzip2,
cat,cd,chgrp,chmod,chown,clear,compress,cp,
dd,ddd,df,diff,du,dump,
env,
find,finger,free,
gcc,gdb,grep,gzip,
head,
kill,
less,ln,locate,l,ls,
make,man,mkdir,more,mount,mt,mv,
netstat,nslookup,
od,objdump
passwd,patch,ps,pstop,pwd,
rm,rmdir
shell,sort,ssh,stty,
tail,tar,telnet,touch,tree,
umask,uname,unzip,
vi,vim,
whereis,which,who,write
...

命令行的艺术(The Art of Command Line) 给出了一个由浅入深的学习路径。

学习Linux命令,Linux命令大全是个很好参考,集合了man和cheat的功能,查阅起来很方便。

更多Linux命令的学习也可以参考这里(英文)还有这里(中文),以及O'Reilly LinuxThe Linux CookbookLinuxCommand

除了这些文档,当遇到不懂的命令时,也可以到Explain Shell,让它给解释一下。

如果自己没有Linux环境,结合上面讲的搜索命令,可以去实验楼学习《Linux 基础入门(新版)》课程实践练习。

参考资料

  1. Linux命令速查手册 (电子版,Linux Phrasebook)

  2. Unix/Linux编程实践教程

  3. 操作系统教程

  4. Linux系统架构
  5. 打造高效的工作环境 – Shell 篇
  6. 自学Linux命令的四种方法


欢迎关注“rocedu”微信公众号(手机上长按二维码)

做中教,做中学,实践中共同进步!

rocedu



如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文


posted @ 2015-10-22 18:46 娄老师 阅读(...) 评论(...) 编辑 收藏