我们经常听到很多人说想学Linux或者被告知应该学Linux,那么学Linux需要学什么呢?为什么要学Linux在回答学什么之前,我们先来看看为什么要学。首先,我们需要认识到很多服务器使用的是Linux系统。作为服务器应用开发者或维护者,如果不了解Linux的基本使用,应该如何开发或维护呢?当然,也有可能你听说Linux更高级,或者说Linux对开发者更友好(Windows用户放下刀),都是题外话。在我看来,学习Linux的主要原因有两个:使用标准的C/C++编写运行在Linux上的应用程序;编写部署在Linux上的应用程序,如Python、Javaweb服务程序,一探究竟。众所周知,Linux是开源的,而windows则不然。至于Python,它有Python解释器,Java有Java虚拟机。事实上,他们对Linux的需求没有C/C++那么高。即便如此,对于Python/Java开发者来说,Linux还是值得学习的。Linux学习方向那么总的来说,学习Linux需要学习什么?方向不同,要学习的内容也不同,大致可以分为几个方向:运维,Linux服务器应用开发维护,Linux应用底层开发开发我是做Linux应用开发的,所以不太了解运维方向和底层方向。这里我简单说一下。Linux运维主要需要学习服务器的基本部署、监控、配置、管理等。你可以认为这些机器都在你的掌控之中,保证7*24小时正常提供服务(千万不要删库跑路。),所以7月24日,请善待运维的朋友。也欢迎运维朋友留言指正或补充我的说法。底层开发需要了解uboot、文件系统、内核等底层相关内容。主要工作可能涉及文件系统裁剪、驱动开发、内核模块定制(如内存管理、进程调度)等。一般来说,底层开发要求比较高。应用开发自然要学习如何开发运行在Linux上的应用,如何定位Linux应用问题等等。Linux应用开发要学什么Linux的学习大多是靠命令来进行的,初学者会觉得枯燥甚至一头雾水。为什么非要敲那么多点几下鼠标就能搞定的事情呢?这里有两个原因,欢迎大家补充:出于资源的考虑,大多数Linux服务器都没有图形界面命令行方便自动化。将一系列操作写成脚本,可以代替人工操作。我把它的学习分为几个阶段:基础使用、开发和调试系统认知的三个阶段对知识积累的要求不同,但总的来说并没有严格的先后顺序。和windows类似,你在学windows的时候学到了什么?打开和关闭?安装和卸载软件?比如安装视频播放器,音乐播放器(为什么要安装这个东西?)。怎么打开安装好的软件?比如打开浏览器上网,打开编辑器写文档,自己的素材怎么存储?如何移动、创建、删除等。如何使用office办公软件……你以为你没有刻意去学习吗?然后就跟学习linux差不多,就是学习最常用的,怎么开机关机,怎么上网,怎么打开命令行,怎么用命令行安装和卸载软件,怎么用编辑文本,如何创建、移动和删除文件,如何查看文件内容,解压文件……这个阶段最难的部分是从图形界面到命令行的转换。然后在第二阶段,你需要学习:如何编写Linux应用程序,如何编译或构建你的程序,如何运行你的程序,如何定位程序错误,第三阶段是一个漫长的学习过程,但它是一切为开发服务,包括:理解和实现ELF文件,Linux主要的可执行文件格式,以及Linux各种机制的基本原理,如进程调度、内存管理、虚拟内存、文件系统等。既然你想写Li??nux应用程序,怎么能不了解其平台的主要机制?问题越难,需要的基础知识就越多。如何学习?来到了大家最关心的问题。同样,每个人的情况都不一样。在这里我只给出我个人的建议。关于第一阶段,你可以先设定一个小目标,比如在一段时间内学会在Linux下进行你的日常活动(只是玩游戏),比如写文档,看视频等等。同时建议:选择主流发行版,如ubuntu、centos等,遇到问题更容易解决问题。在window下装个虚拟机,Linux环境随你折腾。yuminstalloruninstallsoftware使用tar、unzip、zip、gz等解压软件安装包了解运行环境,在这里学习如何执行命令,可以在线搜索资料(视频教程或博客文章)或购买相关书籍进行学习实践。如果你不想安装虚拟机或者docker,你可以用一些在线的Linux试试。第二阶段也是主要阶段。这个阶段要学的东西很多,其中大部分是命令学习。也可以参考《鸟哥的Linux私房菜-基础篇》这里。但是,在初级阶段,还是建议带着一个目的来学习,那就是如何在Linux中编写一个完整的程序。为了实现这个目标,你需要学习cdtouchcpmvrmls,在vi/vim中查找、切换目录、创建、复制、移动、删除、查看、查找和编写代码。这里有一个在线练习网站gcc编译代码。后面可能需要学习makefile、cmake等构建工具版本管理。Git也是目前必备的工具。学习资料推荐progitgdb调试。可以参考《GDB调试指南》问题定位。除了观察最基本的打印外,还需要了解如何查看进程信息(ps)、如何查看网络连接信息(ss、netstat)、如何强制停止进程(kill-9)查看进程文件打开状态(lsof)、如何以各种姿势(cat、tail、more、less)查看文本文件等等。脚本学习,学习linux,就得学shell脚本,很多时候它可以帮你无怨无悔的做事,只要你能调优。《Linux命令行与shell脚本编程大全》也是培训课程之一。这个过程中还涉及到一些《必备的shell知识》命令,但是不建议一个一个去认真学习。首先你只需要知道有这么一条命令,然后你需要的时候就可以快速的找到用法。请记住,你的目标是能够流畅地进行开发和调试,而在实现这一目标的过程中,你会逐渐接触到更多。但需要说明的是,开发Linux应用并不一定要在Linux下写代码。你可以选择使用samba等工具在windows和linux下共享文件,然后在windows下使用你熟悉的工具或者你认为更强大的合适的工具编写代码,在Linux下编译调试。当然你也可以选择Linux下的IDE,或者调整vim。第三阶段的要求比较高。这时候你应该已经学习了操作系统的相关课程,然后你可以通过《深入理解计算机系统》、《Linux内核设计与实现》、《深入Linux内核架构》、《深入理解Linux内核》等书籍学习相关概念。深入学习通过阅读源代码。最后还需要了解堆与栈、内存管理、进程调度、虚拟内存、文件系统等相关知识。当然,学习相关的命令也是必不可少的,比如readelf、nm、ipcs、iostat、objdump、free、chrt、pmap、uptime、top、pidstat等,以上就是三者中Linux相关的学习内容和建议阶段。其实跟C/C++相关的同步学习也很重要,包括相关数据结构和算法的学习,系统编程,网络编程等等,不然看到很多命令的结果。还是发呆吧。最后,建议实践和实践。我找到了一个可以在线使用的Linux。如果你不想装虚拟机,这里有几个可以在线玩Linux的网站。他们不需要是注册用户,可以直接使用。UnixTerminal在线地址:https://www.tutorialspoint.com/unix_terminal_online.php这个网站也支持代码编译运行,速度还不错。JS/UIX-终端地址:https://www.masswerk.at/jsuix/index.htm进入后点击openterminal。它提供了非常简单的终端环境,并没有自带gcc等编译包,但还是可以练习基本的命令和shell脚本。整体使用还是比较流畅的。cb.vu地址:http://cb.vu它使用的是FreeBSD,整体也很流畅,但也不支持代码编译运行。Copy.sh地址:https://copy.sh/v86/?profile=linux2可以全屏体验,感觉像在玩真Linux,还支持多发行版。如果你想体验不同的系统,你可以试试。jsLinux地址:https://bellard.org/jslinux/提供了多种系统选项,你也可以在上面编译运行代码。但是整体感觉不是很流畅。BashShell地址:https://www.jdoodle.com/test-bash-shell-script-online/这个可以用来练习shell编程paiza地址:https://paiza.io/en/projects/new?language=bash同上,可以用来学习shell脚本。ShellCheck地址:https://www.shellcheck.net/就像它的名字一样,用来检查你的脚本是否存在可能的问题。编写的脚本没有按预期运行?shellcheck怎么样?
