Linux大棚命令百篇(上):文件和文本篇(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-28 11:58:03

点击下载

作者:吴鹏冲

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Linux大棚命令百篇(上):文件和文本篇

Linux大棚命令百篇(上):文件和文本篇试读:

内容简介

本书打破了市面上主流Linux命令书籍的写作风格,创新性地以专题文章和系列文章的形式来组织全书,文风轻松通顺、循序渐进,既适合作为系统学习的案头书,也适合在床头边、地铁上、院落中阅读。

本书是这套系列丛书的第一本,内容侧重在Shell基础和文件操作方面。为了体现知识的结构化、系统化,本书共分为三篇。

第一篇 Shell基础及工具篇

这一部分专注在Shell的通用命令和工具上,主要介绍了Linux工程师最常使用的Shell命令和工具,诸如控制变量作用范围的export命令、查看历史命令的history命令、用于读取用户输入的read命令、便于多窗口操作的tmux工具,等等。

第二篇 文件和磁盘篇

这一部分专注在文件操作和磁盘查看上,主要介绍了Linux工程师常用的命令,包括文件搜索命令find、文件元信息查看命令file、创建链接文件的命令ln、压缩命令gzip/bzip/zip,等等。

第三篇 文本处理篇

这一部分专注在文本内容的处理上。作者精心挑选出其中最为常用的文本处理类命令,并详尽介绍了它们的使用方法和技巧,诸如为文本上色的echo命令、文本搜索工具grep、流处理工具sed、文本处理利器awk、排序命令sort、内容加密系列工具,等等。

学习完本书后,相信读者朋友们可以轻松而愉快地掌握Linux基础命令、文件及磁盘操作、文本内容处理的知识和技能,并达到一线互联网公司Linux工程师的水平。

推荐序1

日月如梭,自1991年10月Linus Torvalds发布第一版Linux操作系统以来,经过25年的历程,这个基于自由和开放源代码模式的操作系统已经日益发展壮大。从嵌入式系统、智能手机和平板电脑、个人计算机、网络服务器、云计算到高性能超级计算系统,到处可以看到它的身影。据Gartner等国际机构的统计,作为操作系统的重要成员,Linux在各类操作系统中所占的比重越来越大。

人们说Linux是个类似UNIX的多用户、多任务操作系统,是说Linux继承了很多UNIX的优秀特性,具备了模块化的设计,其进程控制、文件系统、外部设备、网络功能、安全管理以及各种功能齐全和强大的工具软件,可以方便地控制计算机系统完成各种操作,具备了免费和开源特性的Linux操作系统随着互联网在各个领域的发展,得到了更加快速的普及应用。从1996年起就支持IPv6协议的Linux对推进下一代互联网的部署发挥了重要作用。

Linux操作系统得到迅猛的发展,这与Linux具有的良好特性是分不开的,包括免费和开放特性、多用户多任务处理能力、方便灵活且功能强大的的Shell命令、丰富灵活的多种网络通信命令、可靠的系统安全措施、对多种多样外部设备的支持,以及良好的可移植性。

要想使用好Linux操作系统,充分发挥它的能力,就要学习好Linux的使用方法。现有关于Linux的书籍已经出版了很多,但这本书是非常有特色的一本。作者运用十分幽默风趣的语言,从Shell命令开始,介绍了文件编辑与内容处理,文件的查找、压缩与硬盘管理,网络相关命令,进程与性能调优,Linux系统管理等各种命令的使用方法和技巧。

无论是初学者学习使用Linux,还是开发者或系统管理员作为常用工具手册,这本书都是十分值得拥有的。一本好的入门教材会让初学者快速领悟到Linux系统的基本使用方法,掌握常用的Linux操作命令。如果仅仅依靠系统自带的man命令,往往会令初学者感到云遮雾罩,不明所以。而对Linux系统管理员来讲,本书对网络命令、系统调优等命令的介绍,可以使你对这些命令及其显示结果有更深入的理解。书中还列举了很多Linux发展历史中的趣味小故事,使读者在掌握Linux使用方法的同时,也调节了心情,增加了乐趣。

正像篇首所说,日月如梭,Linux已经面世二十五年啦。本书的作者从进入我们研究室学习到毕业工作,也已经十年了。应作者的邀请,作为本书的首批读者,我怀着兴奋的心情一边浏览着各个篇章,一边回忆着这些年来互联网的发展,以及他们的成长历程。他们有多年的工程实践经验,在大型网络公司掌管着上千台Linux集群服务器的运行与维护工作,积累了丰富的Linux使用经验和技巧。我诚挚推荐读者来阅读本书,也期待着他们能为读者带来更多的新作。马严北京邮电大学网络技术研究院教授、博士生导师

推荐序2

技术,一直是驱动社会不断进步和发展的主要动力。从蒸汽时代、电力时代到今天的信息时代,技术始终是推进社会发展的第一生产力。放眼未来,互联网+正推动互联网与社会各行业深度融合,人工智能、云计算、物联网、自动驾驶技术蓬勃发展,人类正在经历着第四次全球性科技革命。而我们有幸身处其中,掌握新时代核心技术的人才已经成为这轮洪洪巨流的推动者。

Linux,自从1991年发布至今,对计算机技术,互联网行业产生了巨大的推动作用。互联网时代,Linux无处不在,占据了全球绝大部分的服务器份额。这与Linux操作系统本身的高度开放性、高可定制性、高可用性等是密不可分的。百度等众多中国互联网企业的技术体系都是基于Linux操作系统构建的,熟练掌握并精通Linux技术,是互联网技术从业者的必备技能和核心竞争力之一。

无论是在校学生还是已入职场的工程师,学习并掌握Linux系统技术,需要一个边学习边实践的过程,并在解决实际问题中融会贯通。在国内互联网技术发展的早期,Linux优质资料稀缺、应用场景匮乏,国内工程师只能借鉴国外资料,学习梯度极高,全行业严重缺少高水平的系统管理人才,与国外同业差距明显。时至今日,中国互联网的蓬勃发展领先全球,国内也逐渐培养出一批具备先进实战经验的Linux系统人才,他们或掌管着中国互联网的基础设施,或运营着大规模集群,或构建出复杂的系统架构,或已经成为行业级系统架构师等领军人物。国内完全有条件诞生一部既有Linux基础又有经典实践经验的优秀著作,帮助读者快速地汲取经验,成为专家。

鹏冲曾在百度运维部磨练七年,先后担任垂直搜索运维团队技术负责人,全百度统一监控平台产品负责人等重要岗位,在Linux系统和集群管理方面拥有着深厚的技术积累和实践经验。这套关于Linux命令进阶的丛书是他多年积累的经验输出。我有幸比广大读者更早阅读了本书,整个阅读体验顺畅,对于Linux常用命令的讲解力求深入浅出,并将实际应用中需要掌握的技术点讲解得相当透彻。对于从事或有志于从事互联网技术工作的读者,这本书将帮助大家从实用的角度学习和积累。

我推荐各位Linux技术从业者阅读和学习,相信这会是一个正确的选择。李硕百度运维部总监

自序

北邮七年学习,百度七年工作,让我经历了很多,思考了很多,也收获了很多。

知乎是我很喜欢的一个问答社区,“×××是一种怎样的体验?”“如何评价×××? ”早已成为时下最流行的提问姿势。

所以呢,我会尝试着模仿知乎的提问风格,和大家分享我的五点思考和体会:

1.这本书为什么值得读?

2.为什么建议大家写博客?

3.如何进行知识管理?

4.如何学好Linux?

5.在百度运维部工作是一种怎样的体验?【这本书为什么值得读?】

虽然有种老王卖瓜的感觉,但我还是鼓起勇气,希望能用三个足够客观的理由吸引到你。(1)聚焦专题:以专题和系列文章的形式来讲解知识,是本书的一大特点。读者可以在一段较短的时间内,聚焦在一个命令的学习上,集中精力实现进阶。(2)贴近实战:书中内容全部来自于作者长期从事大规模Linux集群运维的经验总结,确保了本书的实用性。通过阅读本书,读者的Linux命令掌握水平可以更快地达到一线互联网公司Linux工程师的水平。(3)易于阅读:作者长期在“Linux大棚”从事技术博文的写作,善于用简单的语言、清晰的文章结构来解释复杂晦涩的概念和知识,让用户可以非常顺畅地阅读和理解。【为什么建议大家写博客?】

我在2008年9月创立了Linux大棚博客,一直坚持写作至今。我和大家分享写作的四点好处:

第一,觉得懂未必懂。写作是自我反省、自我提升的一个过程。不把知识落成文字,你就不会发现你掌握着许多模棱两可和模糊不清的知识。

第二,让别人懂才是真的懂。写作正是在强迫你给别人讲懂知识。在写作过程中,你需要思考应该先讲哪些知识,后讲哪些知识,需要思考应该通过哪些场景引出哪些知识,需要思考应该如何做知识的类比。这些技巧看似容易,实则并不容易。

第三,看似浪费时间,实则节省时间。知识总会遗忘,但有实验证明阅读自己写过的知识,可以更快地重新掌握。所以,为了节省时间,请多写作。

第四,交到朋友还能出书。通过博客写作,可以吸引到不少志同道合的朋友,可以和他们一起交流一起进步。如果文章内容还不错,说不准会有出版社的编辑联系你出书哦。【如何进行知识管理?】

每个人都有自己的一套知识管理的方法,而我只是抛砖引玉。

按照知识的规模分,我将知识分成三种类型:(1)小型知识:往往是一句话或一个段落就能说清的知识,如技术牛人介绍、一个技术名词的解释、一个命令的使用技巧等。(2)中型知识:需要一篇文章,甚至一个系列的文章才能介绍清楚的知识,如一个命令的完整用法、几种数据库技术的比对和选型等。(3)大型知识:需要一本书或多本书才能讲解清楚的知识,如Linux系统、MySQL数据库技术等。

按照知识的公开度分,我把知识分成两类:(1)愿意公开的:比如一些公共知识,不含个人信息,也不含保密信息的。(2)不愿意公开的:比如一些含有保密信息的知识,一些自己的随笔等。

而基于这两种分类方法,我一般会采用不同的手段,管理不同的知识:(1)小型知识、愿意公开:微博(比如“Linux大棚”官方微博);(2)中型知识、愿意公开:博客(比如“Linux大棚”技术博客);(3)大型知识、愿意公开:书籍(比如这本书);(4)小型知识、不愿公开:云笔记;(5)中大型知识、不愿公开:本地World文档、自建私有Wiki。

你会发现大部分的知识,都可以对应到上面的分类中。

当然,知识管理和减肥是一个道理,知易行难,一定要坚持养成知识管理的习惯,长此以往,才能受益。【如何学好Linux? 】

从我的个人学习经历来看,“系统学习+实践+写作+交流分享”是学习Linux技术的一套有效的组合拳。

系统学习,即通过优秀的书籍、培训视频、培训课程等方式来系统地学习Linux系统。

实践,即真正到Linux环境中去学习、去工作,去主动解决问题。我在学习Linux之初,就在笔记本中完整安装了Fedora系统、Ubuntu系统、Debian系统和FreeBSD系统,来强迫自己在Linux环境中办公和娱乐。

写作,就是要养成写文章的习惯,把自己觉得模糊的知识点写成可发表的文章,这时候,你会发现,很多细节知识,你都要反复思考和查证,这个过程,就是进阶的过程。

交流分享,建议去结识一些Linux技术的高手和专家,他们的一些经验和体会,或许能让你事半功倍。【在百度运维部工作是一种怎样的体验?】

据我所掌握的信息来看,百度运维部应该是国内承担着超大规模Linux服务器运维任务的少数团队之一,Linux服务器规模达数十万。

由于规模效应的影响,在这里工作,即便是发生概率为0.1%%的BUG,都可能会每天发生。所以,在这里工作的运维工程师要面临的问题和挑战,将是国内同行所很少碰到的,当然,据此而积累的经验和锻炼的解决问题的能力,也是国内顶尖的。

在百度的技术体系中,运维部处于研发部和系统部之间,研发部负责百度产品的开发工作,系统部负责操作系统、服务器、网络、机房等设施,而运维部则负责操作系统及上面运行的服务,确保服务的高可用性,同时不断地提升效率,降低成本。

就拿我曾负责的百度视频产品运维来说,运维工程师首先要确保的是服务的可用性,也就是要确保全国网民都可以访问到百度视频服务;其次,要通过CDN、缓存等多种技术手段不断提升网民访问网站的速度,提升网站访问体验;再者,需要更准确地监控到线上故障,更快速地实现模块升级、更可靠地实现故障自动化处理;最后,就是要追求更少的机器成本、更低的带宽成本、更少的人力投入来实现同样质量的运维服务。

有人会说做运维工作很辛苦,其实我想说,作为七年运维人,我一直相信,运维是架构师的必备技能之一,不具备运维经验和视野的人,是很难设计出优秀的架构的。不经一番寒彻骨,怎得梅花扑鼻香。

这篇自序,包含了几个方面的信息,都是我希望和大家分享的,也相信是大家所希望了解的。好了,如果大家对其中的哪些内容感兴趣,欢迎与我联系,我们深入沟通。下面的时间,就交给大家,来好好阅读这本书吧!

Shell 基础及工具篇

在Shell及工具篇中,我们将为大家带来11篇文章,所有内容都是围绕着Shell展开的,包括了:

● 今天的主角是Shell

● 用chsh来改变Shell

● export将环境变量昭告天下

● read,倾听是一种美德

● expr,一款多功能计算器

● tmux给你带来多窗口的享受

● 用alias起个昵称吧

● history是历史的镜子

● xargs绝对的护花使者

● time,你最懂时间

● sleep,睡眠也有学问

在这里,你不仅可以了解到Shell发展历史中的趣闻、感受到tmux的便捷,还能掌握配置history的各种方法!

让我们现在就开始Shell学习之旅吧!1 今天的主角是Shell老婆问我什么是Shell

面对做会计行业的老婆,我没有信心回答好这个问题。

但是对于阅读本书的读者们来说,相信大家都有计算机知识背景,所以,我还是很有信心能够解释清楚的。

首先,我们今天所说的Shell,既不是海滩上美丽的贝壳儿,也不是荷兰那家鼎鼎大名的壳牌公司,而是用在UNIX/Linux操作系统中的一个叫作Shell的工具。

其次,众所周知,UNIX/Linux操作系统的心脏是“内核”,内核主要负责控制硬件、管理内存和调度任务,而Shell则是用户与操作系统之间的一座桥梁,用户可以利用Shell实现对UNIX/Linux操作系统及其内核的控制和操作。

最后,Shell已经发展成为一种解释型编程语言,它不仅包含了大量的命令以实现与操作系统的对话,还可以实现变量定义、条件判断、循环控制、函数调用等功能,我们完全可以利用Shell实现很多复杂的业务逻辑。

如果只用一张示意图来说明什么是Shell的话,那么下面的这张图再合适不过了。图1 什么是Shell一睹Shell的芳容

当我们打开一台安装有UNIX/Linux操作系统的电脑,输入用户名、密码登录成功后,系统便会启动一个Shell,它是一个交互式的界面,会等待我们输入指令,就像这样:[roc@roclinux ~]$

当我们输入了一条命令之后,Shell会经过一系列的处理环节,然后执行,并为我们返回执行结果,就像下面这样:[roc@roclinux ~]$ uname -a Linux roclinux 2.6.32-220.4.1.el6.x86_64 #1 SMP Tue Jan 24 02:13:44 GMT 2012 x86_64 x86_64 x86_64 GNU/Linux

大家可以看到,我们输入的命令是“uname -a”,这是一个显示操作系统基本信息的Shell命令,像这样的命令,在Shell中有上千个,比如ls、alias、cat、chgrp、awk、ulimit、rm,等等。

下面来一起看一下ls命令的运行效果,如图2所示。图2 ls命令的运行效果

对于Shell高手来说,交互式Shell不能完全满足他们的日常需要,他们更善于把工作和任务通过自动化方式来完成,所以,Shell脚本应运而生。

当把多个Shell命令按照一定的逻辑写到一个文件中时,这个文件就可以被叫作“Shell脚本文件”。而执行这样的脚本,就可以实现一部分工作的自动化了。世界上第一款Shell

开门见山,世界上第一款Shell,叫作Thompson Shell,于1971年诞生,1975年开始广泛传播。那时很多阅读这本书的同学或许还没有出生吧。

至于为什么叫作Thompson Shell,故事要从1965年说起。

那一年,贝尔实验室参与到了一个意义重大的项目中,那就是和美国通用电气、麻省理工学院共同开发一个多用户、多进程的操作系统,产品代号为“Multics”。一年后,故事的主人公,年仅23岁的有志青年Thompson加入贝尔实验室,参与到了Multics项目的开发中来。

不幸的是,由于进度缓慢,Multics项目在1969年搁浅了。而Thompson却在这个项目中积累了大量的操作系统设计经验,并在次年开始了一款全新操作系统的开发工作,这就是后来赫赫有名的UNIX。1970年,也因此被称为UNIX元年!

很快,就在1971年,UNIX在实验室范围内发布了它的V1版本,而Thompson Shell也随之诞生。1975年,UNIX的第六个版本面向公众发布,Thompson Shell也随之得到了广泛地传播。

所以Thompson Shell也被叫作V6 Shell。那些年,我们一起追的Shell

2011年,九把刀导演的《那些年,我们一起追的女孩》上映,人们都在回忆自己曾经追过的女孩。而作为Linux爱好者,有没有你曾经追过的Shell呢?

在Linux的历史长河中,曾经出现过很多种类的Shell,它们之间有的是传承关系,有的是竞争关系,有的已经不为人所知,有的则家喻户晓。

大浪淘沙过后,最终流传下来的Shell,才是值得我们了解和学习的Shell,如表1所示。表1 值得了解和学习的Shell名称全称诞生于流行于shBourne Shell1977UNIX(t)cshC Shell1978UNIXkshKorn Shell1983UNIXBourne Again Shellbash1989LinuxZhong Shao Shell(非官方说zsh1990Linux法)Debian Almquist Shelldash2002Linux

其实还有一些偏小众的Shell,大家有兴趣也可以去了解和关注一下,如pdksh、scsh、psh、mksh,等等。zsh是中国人开发的么

我猜一定会有人问,zsh的全称是Zhong Shao Shell,难道zsh是中国人开发的么?

非也,非也。zsh的作者是美国普林斯敦大学的一位学生,他的名字叫作Paul Falstad。当时有一位名叫Zhong Shao的助教,他登录Linux Shell时使用的ID是zsh, Paul非常喜欢这个名字,恰好z的美式英语的发音和csh的c又非常像,于是就选择了zsh作为自己编写的Shell的名字了。

是不是很有趣呢,我们再来讲一个有关csh的故事。

回到遥远的1978年,那时的Bill Joy(BSD操作系统作者、TCP/IP设计者、vi作者、NFS作者、SUN公司创立者之一)年仅24岁,正在加州大学伯克利分校攻读硕士学位。那一年,他为BSD开发了一款Shell,起名叫作C Shell,简称csh。之所以叫C Shell,是因为它的语法和C语言非常相似。

而在1978年到1983年间,又有多位计算机专家在csh的基础上增加了丰富的功能,包括拼写校验、历史记录、作业控制、命令行编辑器等。在为这个增强版csh取名时,专家们借鉴了历史上一种具有“命令补全”功能的操作系统TENEX的灵感,最终将它取名为tcsh,即TENEX csh。让Shell飞入寻常百姓家

唐代诗人刘禹锡,在《乌衣巷》中的一句“旧时王谢堂前燕,飞入寻常百姓家”,流传至今。

而我们希望曾经闻名遐迩的各种Shell,也能“飞入”我们的电脑,让我们能更近距离地感受它们的设计思想和功能。

以CentOS发行版为例,如果想查看当前系统都安装了哪些Shell,可以这样:[root@roclinux ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin

可以看到,/etc/shells文件中记录了“当前系统中安装了哪些种类的Shell”:

● /bin/sh:这是Bourne Shell。

● /bin/bash:这是Bourne Again Shell。

● /bin/nologin:这并不是一个Shell,而是指“无法登录”。

那么系统当前使用的到底是什么Shell呢,我们可以这样来查看:[root@roclinux ~]# echo $SHELL /bin/bash

可见,我们当前所使用的是Bourne Again Shell。

如果想尝试一下zsh,应该怎么安装呢?非常简单:[root@roclinux ~]# yum install zsh

就这样一条语句,就可以让zsh“飞”入你家。

安装完成后,是不是已经迫不及待地想体验一下zsh了!这也不难:#首先定位到zsh的绝对路径 [root@roclinux ~]# which zsh /bin/zsh #使用-s选项更改登录Shell的类型 [root@roclinux ~]$ chsh -s /bin/zsh Changing shell for root. Shell changed.

只需上面两步,我们就已经把root账户的登录Shell更改为zsh了,接下来,只要退出当前Shell,再以root账户重新登录进来,就可以享受zsh啦!

如果想让其他的Shell也“飞”进你家,如法炮制就好。可以评价下这些Shell么

我们不会把每种Shell的优缺点都列在这里,因为曾经追的很多Shell,现如今已不是主流,有被新Shell替代的,也有因功能欠缺被淘汰的。所以,为了节省时间,这里只简单聊聊bash和zsh这两种Shell,原因是,前者主流,后者强大。

bash当属使用最广泛的Shell了,它融合了csh和ksh的长处,规避了两者的短处,是目前Shell中的首选。许多Linux系统、MAC OS系统都将bash作为了系统的默认Shell,所以大家也会看到,非常多的书籍、示例、项目都是面向bash的,本书也不例外,毕竟,我们应该将有限的时间用在收益最大的事情上,对不对。

zsh,被有些人称为“终极Shell”。这并不算夸张,zsh真的算是Shell中的集大成者,它融合了tcsh、ksh和bash的优秀之处,而且还完全兼容bash,对于用惯了bash的同学来说,几乎可以无缝迁移。而zsh在历史记录提示、命令补全、别名、语法高亮等方面都有着超出预期的用户体验。

好了,本书的第一篇文章就到这里了。本文中用到的chsh命令,我们会在下一篇中进行重点讲解,来,一起进入下一篇!2 用chsh来改变Shell我想知道我机器安装了哪些Shell

chsh命令本身并不复杂,它的功能比较单一,就是负责展示和修改我们系统的登录Shell。

想修改登录Shell,首先要知道我们的系统安装了哪些Shell。这里有两种方法可以查看。方法一:[roc@roclinux ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/zsh方法二:[roc@roclinux ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/zsh

其实chsh -l命令本质上也是去查看/etc/shells文件。查看当前正在使用的Shell

只使用一个环境变量,就可以查看到当前正在使用的Shell啦:[roc@roclinux ~]$ echo $SHELL /bin/bash注意:SHELL一定要大写。可以看到,我们目前使用的Shell是bash。

听说zsh不错,于是我们就通过在命令行执行zsh命令切换到了zsh环境。可是,为什么查看当前Shell类型仍然是/bin/bash呢?[roc@roclinux ~]$ zsh [roc@roclinux]~% echo $SHELL /bin/bash [roc@roclinux]~%

请注意,我们虽然执行了zsh,但是所谓“当前的Shell”是一个大环境的概念,是针对一个已登录的用户而言的。而我们执行zsh只是启动了一个zsh的解释器程序而已,并没有改变大环境。如果想改变“当前的Shell”,那么还是要求助于chsh才可以。将Shell环境真正切换到zsh[roc@roclinux ~]$ chsh -s /bin/zsh Changing shell for roc. Password: Shell changed.

使用chsh命令的-s选项就可以修改登录的Shell了。

如果我们这时候满怀欣喜地执行echo $SHELL,就会发现然输出的仍是/bin/bash。这是因为chsh改变的是我们登录Shell的配置,我们必须退出再重新登录Shell,才可以完全投入到zsh的怀抱。

真是一波三折,退出并重新登录后,终于看到了我们想要的/bin/zsh了:[roc@roclinux]~% echo $SHELL /bin/zshchsh -s到底修改了哪里

到了揭开迷底的时刻啦!

chsh -s其实修改的就是/etc/passwd文件中和我们所登录的用户名相对应的那一行。现在我们来查看一下:[roc@roclinux]~% cat /etc/passwd|grep ^roc roc:x:1001:1001::/home/roc:/bin/zsh

可以发现,输出内容的最后部分已经变成了/bin/zsh了。重启系统的时候,Linux就会读取这一命令来启动新的Shell。

好了,我们要恢复正常的工作环境,把Shell修改回我们熟悉的/bin/bash了:[roc@roclinux]~% chsh -s /bin/bash Changing Shell for roc. Password: Shell changed.3 export将环境变量昭告天下export可以展示Shell环境变量

我们直接进入正题,先来看看执行export会输出什么内容:[roc@roclinux ~]$ export declare -x CVS_RSH="ssh" declare -x GEM_HOME="/usr/local/rvm/gems/ruby-2.2.3" declare -x GEM_PATH="/usr/local/rvm/gems/ruby-2.2.3:/usr/local/rvm/gems/ruby-2.2 .3@global" declare -x GOROOT="/home/roc/program/go" declare -x G_BROKEN_FILENAMES="1" declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/home/roc" declare -x HOSTNAME="roclinux" declare -x IRBRC="/usr/local/rvm/rubies/ruby-2.2.3/.irbrc" declare -x JAVA_HOME="/usr/lib/jvm/jre-1.7.0-openjdk.x86_64" declare -x LANG="zh_CN.gb2312" declare -x LC_ALL="zh_CN.gb2312" declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s" declare -x LOGNAME="roc" declare -x LS_COLORS="rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so= 38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232; 38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16: ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21 ;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arj=38;5;9:*.taz=38;5 ;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.zip=38;5;9: *.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lz=38;5;9:*.xz=38;5;9 :*.bz2=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.bz=38;5;9:*.tz=38;5;9:*.de b=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.rar=38;5;9:*.ace=38;5;9:*.zoo=38 ;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.jpg=38;5;13:*.jpeg=38;5; 13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5 ;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38 ;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx= 38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mk v=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*. vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*. rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:* .flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*. yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:* .ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45: *.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;4 5:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;4 5:*.spx=38;5;45:*.xspf=38;5;45:" declare -x MAIL="/var/spool/mail/roc" declare -x MY_RUBY_HOME="/usr/local/rvm/rubies/ruby-2.2.3" declare -x OLDPWD="/home/roc/test/20160403" declare -x PATH="/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin:/home/roc/program/yii /framework/:/home/roc/program/php/bin:/home/roc/bin:/home/roc/program /thrift/bin:/home/roc/program/go/bin:/home/roc/program/vim/bin:/home/ roc/program/git/bin:/home/roc/bin:/usr/lib/jvm/jre-1.7.0-openjdk.x86_ 64/bin:/home/roc/program/yii/framework/:/home/roc/program/php/bin:/ho me/roc/bin:/home/roc/program/thrift/bin:/home/roc/program/go/bin:/hom e/roc/program/vim/bin:/home/roc/program/git/bin:/usr/local/rvm/gems/r uby-2.2.3/bin:/usr/local/rvm/gems/ruby-2.2.3@global/bin:/usr/local/rv m/rubies/ruby-2.2.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin: /usr/sbin:/sbin:/www/wdlinux/mysql/bin:/usr/local/rvm/bin:/home/roc/b in:/www/wdlinux/mysql/bin:/home/roc/bin" declare -x PWD="/home/roc" declare -x RUBY_VERSION="ruby-2.2.3" declare -x SHELL="/bin/bash" declare -x SHLVL="2" declare -x SSH_CLIENT="111.193.210.134 52932 22000" declare -x SSH_CONNECTION="123.123.56.192 11887 116.255.245.206 22000" declare -x SSH_TTY="/dev/pts/1" declare -x TERM="screen-256color" declare -x TMUX="/tmp/tmux-1001/default,35631,0" declare -x TMUX_PANE="%25" declare -x USER="roc" declare -x _system_arch="x86_64" declare -x _system_name="CentOS" declare -x _system_type="Linux" declare -x _system_version="6" declare -x rvm_alias_expanded declare -x rvm_bin_flag declare -x rvm_bin_path="/usr/local/rvm/bin" declare -x rvm_delete_flag declare -x rvm_docs_type declare -x rvm_file_name declare -x rvm_gemstone_package_file declare -x rvm_gemstone_url declare -x rvm_hook declare -x rvm_niceness declare -x rvm_nightly_flag declare -x rvm_only_path_flag declare -x rvm_path="/usr/local/rvm" declare -x rvm_prefix="/usr/local" declare -x rvm_proxy declare -x rvm_quiet_flag declare -x rvm_ruby_alias declare -x rvm_ruby_bits declare -x rvm_ruby_configure declare -x rvm_ruby_file declare -x rvm_ruby_global_gems_path declare -x rvm_ruby_make declare -x rvm_ruby_make_install declare -x rvm_ruby_mode declare -x rvm_ruby_string declare -x rvm_ruby_url declare -x rvm_script_name declare -x rvm_sdk declare -x rvm_silent_flag declare -x rvm_sticky_flag declare -x rvm_system_flag declare -x rvm_use_flag declare -x rvm_user_flag declare -x rvm_version="1.26.11 (master)" declare -x rvm_wrapper_name

export输出的内容就是bash的所有环境变量了,满满的两页看来还真是不少呀。env/set/export/declare的区别

在Linux系统中,除了export之外,env、set和declare这三个命令也可以显示Shell中的变量。那这四个命令有什么区别呢?

这个问题,我们需要从Shell变量说起。Shell的变量,可以分为“环境变量”和“自定义变量”两种类型,两者的区别在于作用范围不同。环境变量可以在其进程的子进程中继续有效,而自定义变量的势力范围则无法延伸到其进程的子进程中。

好了,知道了环境变量和自定义变量的区别,我们正式开始介绍export/env/set/declare的区别:

● env:显示当前用户的环境变量,但不会显示其自定义变量。

● export:功能同env一样,也是显示当前用户的环境变量,只不过该命令的输出是按变量名进行排序的。

● declare:显示当前Shell中定义的所有变量,包括用户的环境变量和自定义变量,该命令的输出按变量名进行排序。

● set:功能同declare一样,显示当前Shell中定义的所有变量,包括用户的环境变量和自定义变量。

根据上面的说明,我们可以得出下面的结论:

● env和export显示的是环境变量。

● set和declare显示的是环境变量和自定义变量。

我们以set和declare为例,来看一下是否真的是这样:[roc@roclinux ~]$ set > set.txt [roc@roclinux ~]$ declare > declare.txt [roc@roclinux ~]$ diff set.txt declare.txt 54c54 < _=clear --- > _=set

看到了吧,set和declare的输出几乎是一样的。

唯一的区别就在于这个“下划线变量”。下划线变量(_)表示用户上一次输入的命令的最后一个参数。上面两条命令之所以出现不同,是因为在执行set前执行了clear命令,而在执行declare之前,执行了set命令。设置Shell环境变量

$PATH环境变量是Linux系统中最常用的变量之一,我们先来看一下这个变量的内容:[root@roclinux ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

相信细心的同学已经观察到了,$PATH变量的值是由多个路径所组成的,并且用冒号进行了分隔。那么,问题来了,这些路径的作用是什么呢?

当用户在Linux系统中直接输入一个命令(如date命令),而没有指定其绝对路径时,Linux就会求助于$PATH啦,Linux会依次进入到$PATH变量所指定的各个路径中,去寻找是否存在此命令(date命令),如果找到了,就执行该命令;如果没有找到,就直接退出,并提示用户未找到该命令。

在运维工作中,用好$PATH变量是可以大大提升工作效率的。假如/home/roc/operation_tools文件夹下存放着我们自制的各种运维小工具,每次使用这些小工具时又不想总指定其绝对路径,那么,我们应该怎么办呢?没错,我们应该把这个路径追加到$PATH变量中去,具体的做法是这样:export PATH=$PATH:/home/roc/operation_tools

上述命令执行成功后,我们的运维小工具就可以直接被Linux系统找到了。从此以后,当我们想使用这些运维小工具时,就再也不用指定绝对路径啦。让你真正体会export的威力

不知道你是否注意到上面例子中的一个细节,那就是我们在设置$PATH环境变量时,使用了export命令。如果没有使用export,会有什么问题吗?

这个问题问得很好,这正好引出export的作用,那就是,使用export设置的变量就成为了环境变量,而没有使用export设置的则是自定义变量。

下面我们通过一个示例来看一下:#我们在当前Shell进程中指定了var1变量 [roc@roclinux ~]$ var1="hello" [roc@roclinux ~]$ echo $var1 hello #我们在当前Shell进程中又指定了var2变量 [roc@roclinux ~]$ var2="world" [roc@roclinux ~]$ echo $var2 world #我们通过export发布var1 [roc@roclinux ~]$ export var1 #我们进入到一个bash子进程中 [roc@roclinux ~]$ bash #var1变量仍然有效,而var2变量已经无效了 [roc@roclinux ~]$ echo $var1 # 输出变量的值 hello [roc@roclinux ~]$ echo $var2 # 什么也没有输出

通过上面的示例,我们可以清楚地看到:环境变量可以在其进程的子进程中继续有效,而自定义变量则无效。误操作惹的祸“哎呀,不好了,我的Linux系统出问题了,我竟然连cat命令都没办法运行了,执行时总是提示我找不到命令,这是怎么回事?我只是按照上面的示例执行了一下命令,就成这个样子了,我该怎么办啊?”“同学,让我看看你到底执行的是什么命令?”“我执行的命令,很简单,就是这个:”$ export PATH=/home/to/operation_tools“额,问题找到了,你的命令输错啦,来看正确的用法吧。$ export PATH=$PATH:/home/to/operation_tools

再对比一下你的命令,你的命令中缺少了$PATH,这样会清空原来$PATH的内容,$PATH中没有了系统指定的路径Linux就无法找到要执行的命令。这是一个多么可怕的误操作啊!

大家一定要记住这个教训呀,在设置PATH环境变量时要格外小心哦。4 read,倾听是一种美德人生第一次编程

不知道你是否还记得你的第一次计算机编程。

我对“第一次”记忆犹新,那是一个很神奇的时刻。当我把有生以来编写的第一个C程序交给计算机执行时,黑色的屏幕上显示出了一行字“please input your name:”。

我怀着无比激动的心情写下我的名字“roc”,然后按下回车。美妙的时刻就此凝固了,计算机毫无差错地显示出:welcome ! ! ! roc.

如果现在让你用Shell来实现同样效果的程序,不知道你是不是能很快就写出来呢?

本文就来帮你实现这个程序,在实现该程序之前,我们还是先来学习一下Linux系统中最擅长倾听的命令——read吧。倾听键盘的声音

read命令用来倾听标准输入或文件输入,并把信息存放到变量中。

从read命令的定义可以看出,倾听键盘是read的主要职责之一。

现在,我们用Shell来模拟一下上面的C程序吧:#! /bin/bash echo -n "please input your name:" read name echo "welcome ! ! ! $name" exit 0

就这么简单,使用read命令来倾听用户的输入,并把用户的输入内容自动保存到指定的name变量中,最后使用echo实现输入内容的显示。

上面的Shell脚本是不是已经是最精简的了?当然不是,还可以继续精简,我们可以直接使用read自带的显示提示语功能,省略程序中的echo语句:#! /bin/bash read -p "please input your name:" name echo "welcome ! ! ! $name" exit 0

上面脚本中的read的-p选项就是用来显示提示语的。

在这个例子中,我们只是让read来接收name变量的值,那么read可以同时接收两个甚至更多的变量吗?答案是可以的。#! /bin/bash read -p "please input your name and place:" name place echo "welcome $name to $place" exit 0

看到了吗?read后面可以指定两个变量name和place,当用户输入完成时,read会以空格来分割用户的输入内容,并把输入的内容分别存放到后面的变量中。

按照这个规律,read完全可以指定3个、4个……N个变量。需要注意的是,当用户的实际输入和程序期望输入的变量个数不等时,又会出现什么情况呢?

这是一个好问题,比如上面的脚本期望用户输入name和place两个变量的值,而我们却故意输入一个数据或三个数据,这时来看看脚本的执行情况:只输入一个数据示例一:[roc@roclinux ~]$ ./test.sh please input your name and place: roc welcome roc to输入多个数据示例二:[roc@roclinux ~]$ ./test.sh please input your name and place:roc beijing shanghai tianjin welcome roc to beijing shanghai tianjin

通过上面脚本的执行,我们可以得出以下的结论:

1.如果输入的数据数量少于变量的个数,那么多余的变量不会获取到数据,即变量值为空。

2.如果输入的数据数量多于变量的个数,那么超出的数据将都赋值给最后一个变量。

还有一个非常特殊的情况,就是在编写脚本时,如果read命令后面没有写任何变量,脚本执行时,我们输入数据,那输入的数据会存放到哪里呢?

对于这种极端情况,Shell的设计者早就预料到了:用户的数据会存放到一个叫作$REPLY的环境变量中去。#! /bin/bash ## read -p "please input your name and place:" echo "welcome $REPLY" exit 0 [roc@roclinux ~]$ bash test.sh please input your name and place:roc beijing welcome roc beijing倾听也可以有时间限制

read,非常乐于倾听用户的声音,但有的时候,用户长时间不输入,那read也可以有自己的后手。

read命令提供了-t选项,可以用来设置一个倾听的时限。如果超过所设置的时限的话,那么read的耐心也就到此为止喽。#! /bin/bash if read -t 5 -p "please input your name within 5s:" name then echo "welcome ! ! ! $name" else echo "sorry, too slow" fi exit 0

上面的脚本就使用了-t选项,用来指定等待输入的时长(秒)。

上述脚本表示read会等待用户的输入,但丑话说在前,如果5秒内用户没有响应,那么read就会自动结束,并显示“sorry, too slow”来抱怨一下用户。可见,read命令也可以有自己的态度的。密码输入场景

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载