Linux系统管理员的Bash指南,11条Bash实践经验!

640?wx_fmt=gif


每个职业都有最常用的工具。对于许多系统管理员来说,shell可能是比较熟悉的。在大多数Linux和其他类Unix系统上,默认的shell是Bash。


Bash是一个相当古老的程序,它起源于20世纪80年代后期。但它建立在更多,更老的shell上,比如C shell(csh)。我们来看看一些基础知识。


相信你在某些时候,曾无意中以root身份运行命令并导致某种问题?这里有一些非常简单的技巧可以防止你遇到这样的问题。


使用别名


首先,为mv和rm等命令设置别名,指向mv -I和rm -I。这将确保运行rm -f/boot至少要求你确认。在红帽企业版Linux中,如果你使用root帐户,则默认设置这些别名。


如果你还要为普通用户帐户设置这些别名,只需将这两行放入主目录中名为.bashrc的文件中(这些也适用于sudo):

alias mv=’mv -i’

alias rm=’rm -i’


你的根提示符


你可以采取的另一项措施是防止意外发生,确保你在使用root帐户时知道。我通常这样做是为了让我的正常日常工作中使用的提示能够很好地突出根提示符。


如果将以下内容放入root的主目录中的.bashrc文件中,你将看到一个黑色的红色根提示符,清楚地表明你(或其他任何人)应该谨慎操作。

export PS1=”\[$(tput bold)$(tput setab 0)$(tput setaf 1)\]\u@\h:\w # \[$(tput sgr0)\]”


实际上,你应该尽可能避免以root用户身份登录,而是通过sudo运行大多数系统管理命令,但这是另一回事。


实施了一些小技巧来帮助防止使用root帐户的“无意的副作用”,让我们看看Bash可以给你你在日常工作中带来怎样的帮助?


控制history文件


你可能知道,当在Bash中按向上箭头键时,你可以查看并重复使用以前的所有命令。这是因为这些命令已保存到主目录中名为.bash_history的文件中。该历史文件附带了一组非常有用的设置和命令。


首先,你可以通过键入历史记录来查看整个最近的命令历史记录,或者你可以通过键入历史记录,或将其限制为最近30个命令。你可以更好地控制Bash保存的内容以及保存方式。


例如,如果将以下内容添加到.bashrc,则任何以空格开头的命令都不会保存到历史记录列表中:

HISTCONTROL=ignorespace


如果你需要用命令写入明文形式的密码。(是的,这太可怕了,但它仍然会发生。)


如果你不希望在历史记录中显示经常执行的命令,请使用:

HISTCONTROL=ignorespace:erasedups


这样,每次使用命令时,都会从历史记录文件中删除之前发生的所有事件,并且只将最后一次调用保存到历史记录列表中。


我特别喜欢的历史记录设置是HISTTIMEFORMAT设置。这将在历史记录文件中添加时间戳前的所有条目。例如,我使用:

HISTTIMEFORMAT=”%F %T “


当我输入五条历史记录时,我得到了很好的完整信息,如下所示:

1009 2018-06-11 22:34:38 cat /etc/hosts

1010 2018-06-11 22:34:40 echo $foo

1011 2018-06-11 22:34:42 echo $bar

1012 2018-06-11 22:34:44 ssh myhost

1013 2018-06-11 22:34:55 vim .bashrc

这使我更容易浏览我的命令历史记录,并找到我两天前用来建立到家中的SSH隧道。


最好的Bash实践


在编写Bash脚本时,我将用最好的11个用法列出来(我是这样认为的)。


11.Bash脚本可能变得复杂,添加注释没那么复杂。因为如果你在周末之后回到工作中,不得不花时间搞清楚你上周五想要做什么的话,别忘了添加注释。


10.用花括号括起所有变量名,比如$ {myvariable}。养成这个习惯可以使$ {variable} _suffix成为可能,并提高整个脚本的一致性。


9.评估表达式时不要使用反引号;请改用$()语法。可以使用:

for file in $(ls); do


反之:

for file in `ls`; do


前一个选项是可嵌套的,更易于阅读,并使一般的系统管理员感到满意。不要使用反引号。


8.一致性很好。选择一种风格并在整个脚本中坚持下去。显然,我更喜欢人们在反引号中选择$()语法,并将其变量放在在花括号中。


7.使用适当的shebang作为Bash脚本。因为我正在编写Bash脚本,只打算用Bash执行它们,所以我经常使用#!/ usr / bin / bash作为我的shebang。不要使用#!/ bin / sh或#!/ usr / bin / sh。你的脚本将执行,但它将以兼容模式运行。可能会产生许多意外的副作用。(当然,除非你想要兼容模式。)


6.比较字符串时,在if语句中引用变量是个好主意,因为如果你的变量是空的,Bash会为这样的行抛出一个错误:

if [ ${myvar} == “foo” ]; then

echo “bar”

fi


对于这样的行,将评估为false:

if [ “${myvar}” == “foo” ]; then

echo “bar”

fi


此外,如果你不确定变量的内容(例如,在解析用户输入时),请引用变量以防止解释某些特殊字符,并确保该变量被视为单个词,即使它包含空格。


5.我想这是一个品味问题,但我更喜欢使用双等号(==),即使比较Bash中的字符串。这是一致性的问题,尽管,对于字符串比较,只有一个等号会起作用,我的考虑立即变为“单个等于是一个赋值运算符!”


4.使用适当的退出代码。确保如果你的脚本无法执行某些操作,则会向用户显示已写入的失败消息(最好通过解决问题的方法)并发送非零退出代码:

# we have failed

echo “Process has failed to complete, you need to manually restart the whatchamacallit”

exit 1


这样可以更容易地以编程方式从另一个脚本调用脚本并验证其成功完成。


3.使用Bash的内置机制为变量提供合理的默认值,或者如果未定义你希望定义的变量,则抛出错误:

# this sets the value of $myvar to redhat, and prints ‘redhat’

echo ${myvar:=redhat}

# this throws an error reading ‘The variable myvar is undefined, dear reader’ if $myvar is undefined

${myvar:?The variable myvar is undefined, dear reader}


2.特别是如果你正在编写大型脚本,特别是如果你与其他脚本一起处理该大型脚本,请考虑在函数内部定义变量时使用local关键字。local关键字将创建一个局部变量,该变量只在该函数中可见。这限制了冲突变量的可能性。


1.每个系统管理员有时必须这样做:在控制台上调试一些东西,可以是数据中心的真实服务器,也可以是虚拟化平台的虚拟服务器。如果你必须以这种方式调试脚本,你会感谢你自己记住这个:不要让你的脚本中的行太长!


在许多系统上,控制台的默认宽度仍为80个字符。如果你需要在控制台上调试脚本并且该脚本有很长的行,那么将是一个悲剧。此外,具有较短行的脚本,默认值仍为80个字符,在普通编辑器中也更容易阅读和理解!


来源:代码湾

http://codebay.cn/post/9699.html

版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。


数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg

长按扫码关注

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

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

相关文章

Asp Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step(三)

翻译自 Mohamad Lawand 2021年1月25日的文章 《Refresh JWT with Refresh Tokens in Asp Net Core 5 Rest API Step by Step》 [1]在本文中,我将向您演示如何在 Asp.Net Core REST API 中将 Refresh Token 添加到 JWT 身份验证。我们将覆盖的一些主题包含&#xff1…

国外的程序猿可以工作到退休而国内的为什么这么短命(思维认知)

首先我想说明的是国外的程序猿也存在加班,他们也要赶项目,所以加班不算什么原因。真正的原因是我们国内的很大一部分程序猿只是工具的使用者,不会去思考工具的产生和原理,用惯了一个高效的工具就被这个工具套牢成为奴隶&#xff0…

使用 docker 部署 mdnice

使用 docker 部署 mdniceIntro最近 mdnice 的在线版使用开始需要登录才能访问,一方面我觉得我的文章会被保存的他们的服务器上,使用他们的平台就能轻松拿到很多文章的数据,他们甚至是可以直接拿到 markdown 原始内容去别的平台分享转发&#…

细数近年来机器学习研究的几大怪现状

人工智能领域的发展离不开学者们的贡献,然而随着研究的进步,越来越多的论文出现了「标题党」、「占坑」、「注水」等现象,暴增的顶会论文接收数量似乎并没有带来更多技术突破。最近,来自卡耐基梅隆大学的助理教授 Zachary C. Lipt…

50K求聘.NET,我们是认真的!

今年的节奏特别快,不知道你有没有同感?春节刚过,跳槽季仓促开始,打了个疫苗,过了个清明,一转头4月过半,金三银四就快尾声了,真是时光飞逝。当然,手速快的已经offer拿到手…

linux编译redis打包,linux下下载redis,并且编译

1:下载、解压、编译$ wget http://download.redis.io/releases/redis-3.0.6.tar.gz$ tar xzf redis-3.0.6.tar.gz$ cd redis-3.0.6$ make2:结果显示很多error,127,1,2之类的,然后我参考了这个网站https://w…

github star破13k,Dapr 能否引领云原生中间件的未来?

Dapr(Distributed Application Runtime ,分布式应用运行时)是微软新推出的,一种可移植的、serverless 的、事件驱动的运行时,它使开发人员可以轻松构建弹性,无状态和有状态微服务,这些服务运行在…

现在的便签本都这么社会了!?重复写万次还能云端保存

不知模友们有没有感觉到每天脑子要记的事情越来越多不说事情杂七杂八重点是精力有限刚说完的事转眼就忘了想过在电脑贴满便利贴想过本子记录好每天要做什么But ......每天忙的天昏地黑啥都不记得了又懒的随身带着本子太重不好携带真想能有一个神器让这一切不再纠结一款神奇又黑…

C#类类型“.NET技术”

类类型是由字段数据(成员变量)和操作字段数据的成员(属性、方法、构造函数、事件等)所构成的自定义类型。其中字段数据表示类实例(对象)的状态。 在C#中,类使用class关键字定义,例如…

linux ext4 格式化工具,ext4格式化软件 mkfs.ext4 快速格式化

如何在 Windows 下访问 ext4 格式的硬盘你好,介绍两个能在 Windows 下读取ext4分区的软件。第一个是 Ext2Read。它能查看 ext2/3/4 分区并从中拷贝文件和目录,支持 LVM2 和 EXT4 extent ,以及递归拷贝整个目录。第二个是本站之前介绍过的 Ext…

信心满满的去面算法工程师,竟然凉了...

我是小A,一个没能当成算法工程师的菜鸡Java工程师,内心却等着上AI这趟车。去年正是人工智能火热的时候,看着各种高薪招聘,我沉寂很久的内心也火热起来了。但是想归想,我内心还是有很多纠结的。自己已经很多年没有碰过高…

使用 Redis Stream 实现消息队列

使用 Redis Stream 实现消息队列IntroRedis 5.0 中增加了 Stream 的支持,利用 Stream 我们可以实现可靠的消息队列,并且支持一个消息被多个消费者所消费,可以很好的实现消息队列Simple Usage首先我们来看一个简单版本的 Stream 使用&#xff…

用linux命令通常做什么,如何知道你在 Linux 里最常使用的几个命令?

不知道大家自接触 Linux 以来,都使用过哪些命令,其中最常用的命令是什么?我最常用的命令之一是 sudo ,因为我每天都在使用它在 Linux 上安装、更新、删除软件包以及其它各种需要超级用户权限的操作。那么你知道你自己最经常使用的…

资料分享 | python机器学习教程分享来袭

小天从大学开始,便开启资料收集功能。近几年以AlphaGo为契机,人工智能进入新的发展阶段,再加上日常的深入研究,小天收集整理了丰富的机器学习资料,内容涵盖“机器学习视频”,“机器学习教程”等。截止到今天…

Autofac框架初识与应用

一、前言这上一篇中,主要讲述了什么是IoC容器,以及了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置IoC容器,以及它的实例注册方式和相应的生命周…

聊一聊数据导出那些事

前言 数据导出,这可以说是一个随处可见的需求,大部分管理平台,报表系统都会有这个需求。对于这个需求,不少系统会做限制,只能从系统导出几千或几万的数据,再多的话就要提申请,经过层层审批&…

如何黑掉一台根本不联网的电脑

一直以来,拿到一台电脑上的密钥,方法无非有以下三种:1、直接拿到这台电脑,然后输入木马病毒进行盗取。(此种略微LowB的方法风险在于:如果被电脑主人“捉奸在床”,愤而报警,则需要黑客…

通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

首先感谢张队geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根。 书接上回通过Dapr实现一个简单的基于.net的微服务电商系统,今天来分享一下这套电商demo的通讯部分到底是如何工作的…

windows下整合tomcat和nginx

tomcat自带的apache服务器对于并发请求的处理能力比较差,并且耗费资源很大,而nginx这方便却很强悍,以下是在windows下整合tomcat和nginx的过程。 1.准备工作 下载tomcat(http://tomcat.apache.org/download-70.cgi),下…

从飞机上看下雨是这样子,太震撼了!

不同的角度,不一样的世界!来源:环球顶尖摄影版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。数据与算法之美用数据解决不可能长按扫码关注