当我认识Perl时,是否值得学习BASH?
我所有的脚本都是用Perl完成的,我可以在命令行执行一行,而Perl正则expression式似乎更容易。 有什么我可以在BASH中做我不能在Perl中做的?
我只是觉得自己不是一个真正的黑客,除非我花时间去研究BASH并开始使用Sed和Awk。
这是值得的,还是我只是要求痛苦和挫折?
如果你在Perl中很舒服,那么继续使用Perl。
Bash很方便地知道你是否要编辑现有的脚本(例如/etc/init.d中的东西),如果你知道Perl,你可能会发现你可以很容易地阅读它。
如果你是喜欢学习新语言的人,可以坚持到bash,awk,sed等等。如果你担心痛苦和挫折,坚持你所知道的。
如果你想感觉像黑客,学习Lisp。
Bash集中体现了UNIX的精神 – 结合多个简单的工具来解决更复杂的问题,通常使用pipe道将一个命令的输出引导到下一个命令的input。 这是一种编程风格,我认为值得了解; 太多人写了一个完整的程序来实现一些可以通过在命令行上结合一些现有工具来完成的事情。
所以是的,学习bash。 即使你自己并没有最终使用它,你也可以阅读许多bash脚本,它们是大多数UNIX / Linux系统的关键部分。
你需要学习阅读。
你不需要学习写它。
但是当你为cron作业编写perl封装的时候,你的系统pipe理员朋友会看你有趣。
我发现自己最经常使用bash的东西是这样的:
for serv in `cat server_names.txt`; do ssh $serv 'some command'; done;
当然,我可以用Perl来做…但是这似乎有点矫枉过正。
学习bash。 一个好的程序员有一些string,他们的弓和shell脚本是任何优秀的UNIX开发人员的基础。
当然你可以在Perl中做很多我喜欢的事情,但是UNIX命令已经为你做了一半的工作。 pipe道中的UNIX命令的组合是shell黑客的真正秘密。 你必须做很多代码才能像这样:
find | grep -l | xargs perl -e "xxx"
至less要学习如何使用while
, case
和test
命令,以及$ {var:xxx}构造中的variables运算符。
不,如果你知道如何在Perl / Python / Ruby中编写代码,不要麻烦学习bash。
请学习如何使用UNIX命令行 – 即pipe道,redirect和有用的命令。
你不应该因为其他人使用它而感到需要学习东西。 自1988年以来我一直在使用unix,可能写了不到1000行的shell脚本。
所有我使用bash(ksh)作为shell – 脚本方面是没有用的 – 简单的东西是用awk和pipe道完成的,而复杂的东西需要c。但大多是awk。
我想不出一个令人信服的理由来学习如何编写bash脚本 – 超越基础。
unix的美丽和力量在于,我们可以使用任何我们感到舒服的东西,并获得相同的结果。
如果你觉得适合Perl的需要,那么你应该只使用Perl。 因此,您可以将您的大脑记忆从一些严重的碎片中解救出来,并保留冗余信
说得直白:使用sed,awk和朋友是好的,但是你会发现你可以用更简洁的方式在Perl中完成同样的工作,这与你已经知道的更加一致。 BASH和Unix工具链有时比Perl更快速的开发友好,但另一方面,它充满了奇怪的或至less不常见的原创性。 学习和保持它们是相当耗时的,恕我直言,如果你已经拥有了一个类似Perl的强大工具,甚至可以被看作是inheritance者,那么它是不值得的。
像bash
和awk
这样的东西仍然代表着小语言的Unix精神:
-
bash
是一个用于执行和连接程序的语言,非常适合于此 -
awk
是一种仅用于处理数据logging的语言,非常适合这种情况
虽然perl
很大程度上借鉴了这两者,但它被devise成通用语言。 当然,你可以在perl
完成这些任务,而且你可能更喜欢这个,因为你熟悉它的语法。
但是一旦你熟悉了bash
(这并不难),这个语言比perl
小得多 – 使用更具体的工具会变得更容易,也更经济。
我学习了perl
的Web开发,我曾经使用它几乎所有的东西。 现在,我发现大多数工作要么简单到bash
和awk
,要么难以certificate编译语言的合理性。
当然,因为它是大多数Linux发行版的默认shell。
但还有一个原因:如果Perl不可用,该怎么办? 不久之前,我已经转向了新的工作,尽pipe我知道一些Python和Ruby以及一些Perl,但是他们不在现场系统上,我不得不分析日志文件,创build备份和抓取数据。 我必须学习Bash(和awk),他们值得。
我使用Perl作为主要的脚本语言已经很多年了,最终开始selectbash,sed和awk,我认为它们都值得了解。 基本上,你可以在Perl中做任何事情,你可以在sed,awk或者bash中做,而且有足够的花哨的代码,反过来也可能是真的。 也就是说,有很多场合sed或awk或bash提供了一个更加优雅的解决scheme。 Perl显然是从这些语言中大量借用的,而且function非常全面,但是这些工具仍然存在,因为它们在许多情况下仍然简单而有用。
我对UNIX命令行非常熟悉,并且提供了所有的实用程序(sed,awk,grep,find ..)。 我的一般经验法则是,如果它是一个单线程,或for循环捕获一堆文件,只做一些操作,我使用bash / tcsh / zsh,否则我使用Python。 我发现awk使用起来很麻烦,而且任何时候都需要比最基本的awk用法更多的东西,或者类似脚本的东西,使用真正的语言就更简单了。
我用了很长时间的Perl,并且专门用于Python。 如果你知道Perl,使用它。 这就是这样做的。
我知道Perl和Bash。 我在工作和家中都使用它们。
是的,你一定要学习Bash。 然后,您将能够使用最好的工具来完成这项工作。 是的,你可以用Bash做的所有事情都可以用Perl完成,但这并不意味着你应该这样做。
bash和Perl以不同的方式做同样的工作。 Perl更通用一些,function更强大。 如果您使用Perl比使用Perl更合适,那么请继续使用它。
我的一个警告是:想想那些将不得不维护你的代码的人。 他会像Perl一样stream利吗?
就我个人而言,我讨厌他们。 ;-P
不要学习'bash',学习sh / ksh / pdksh,它是bash的基础,知道它的基础知识,而不是所有的坏习惯(bashisms)学习bash会教你,会让你使用任何unix / posix系统用ksh或sh(或bash)。 即使Microsoft的Unix服务也带有一个korn shell。
不要担心bash,但担心自己知道sh,并了解他们之间的差异。 (例如,理解bash脚本中什么是无效的,即“bashisms”)
考虑以下:
test x“$ SHELL”= x / bin / perl && RESULT = no; echo“$ {RESULT-yes}”
如果你充分理解了上面的内容,那么你可能已经足够了解了。 如果你不了解上述情况,请执行命令; 如果打印“是”,那么你需要学习更多的嘘。 (英文解释:如果你使用perl作为你的loginshell,那么你可能不需要学习就可以获得,否则你就可以)。
具体回答你的问题; 不,在bash中你可能无法做任何你不能在perl中做的事情,但是如果你使用bash作为你的shell,那么一直以来都是愚蠢的。 如果bash是你的shell,那么这是一个你正在使用很多的工具。 因此,你应该知道如何使用它。
几点:
- 了解bash可以帮助您真正学习Unix / Linux命令工具集的细节,因此它对于系统pipe理员来说是非常宝贵的。
- Bash在任何地方都可以使用,从初始化脚本到企业应用程序粘合(绝大多数情况下都可以使用netbackup工具链)。
- 如果您需要排除其他人(或其他产品的bash脚本)的故障,那么您会很高兴知道bash。
- 如果perl不可用,你会很高兴你知道bash。
- 最后,有时候bash对于我需要5分钟的快速和肮脏的工作来说更快。 您可以立即敲出一条命令和一个简单的循环。
这并不是说你不应该学习perl,ruby和python。 Bash绝对是一个“和”技能。 你应该学习bash 和其他东西(或多个东西elses)。
你的问题没有正确和明确的答案。 这取决于你要做什么。 如果是维护某种代码,那么学习bash,awk和sed是有道理的。 如果只是为了个人的喜悦,也是可以接受的。
然而,如果要维护一个无人可以维护的脚本,因为没有人知道bash,awk和sed,那么学习这些语言是没有意义的,如果你可以用适当的testing重写脚本并且没有bug地重现脚本,那么学习新的语言没有意义,关于你的时间尺度。
除了脚本语言之外,知道的并不多,因为在大多数情况下,人们不太熟悉Perl,在这种情况下,他们很可能知道至less是bash。 另外,如果你是一个大多数人都知道bash,awk,sed的团队,那么学习这些语言是有道理的。
我相信学习一些可以在日常生活中作为开发者使用的新东西,不仅可以增加你的技能组合的价值,还有助于保持头脑清醒
确实有很多“是”和“不”。
我想说,这是因为学习一些基本的 bash / zsh / tcsh / whatever(pipe道,循环,streamredirect…)是有用的。
但是我只会学习任何shell语言的细节,以防有必要这样做(这应该是非常罕见的)。 在很多情况下,使用Shell语言是非常痛苦的,Perl或Python可以很容易地解决这些问题,这可以说是更强大(更less的行和更简单的代码)。
有一本叫做“Minimal Perl”的非常好的书,里面有很多关于bash的技巧。 我真的很喜欢使用两者,因为我无法处理sed和awk。 所以,如果我的任何脚本变得混乱,我知道我必须使用Perl或Python。 另外,我发现Perl在处理文件时要快得多。 但是使用Perl通过SSH发送一些文件或者做一些ifs和fors,是一个矫枉过正的事情。
OTOH,Bash(或者任何其他的Unix Shell)都会使用简单/复杂的math,而且很难debugging。 bash -s foo.sh是不够的!
正如很多人之前所说,你不需要学习Bash,但是你想了解基础知识。 但是shell的基本(sh主要是因为在所有系统中都是非常小的)。 所以我将学习如何做一个循环,$()是什么在bash和它的新魔法,如何捕捉命令行的参数($ 0,$ 1等),如何引用在Bash(和其余的shell http://www.grymoire.com/Unix/Quote.html )。 但至less我的build议是,如果你不需要它,不花很多时间学习 Bash,但读了它,知道在什么时候你需要答案。 而且不仅Bash而且还有Cshell或类似的,至less要知道如何为你的configuration文件设置variables,条件语句,别名和循环。 任何更复杂的事情,你可以用Perl来做,但不是因为它更好(或不是),而是因为你已经知道它,通常你不会注意到它们之间的区别(除非你的perl-lib真的很庞大,次)。
另外作为一名Perl程序员,我花了一些时间学习如何高效地完成Perl一行,在shell中pipe理它们,以及如何用unix命令代替它。 我会推荐这本书: http : //minimalperl.com/
一个可能愚蠢的回答是实际上有Perl shell。 我已经为Zoidberg (一个Perl shell)写了一个补丁,并希望很快再次让这个项目可行(我已经和原作者联系过了)。
总的想法是,如果zoid
将该命令识别为Perl,则将其解释为该命令,而不是将其视为命令。 强大的shell使用权力是包装在一起。
我会说一眼“bash -c帮助”。 如果你在* nix世界工作,这肯定有助于阅读的东西,偶尔写一些快速的东西。 这可能比用Perl写更快,从nix的angular度来说更聪明。
这篇文章对Perl进行了一些游说: http : //lindesk.com/2008/05/shell-script-language-use-perl-not-bash/
对于习惯于体面语言的人来说,这些shell语言看起来笨重 – 甚至是邪恶的。 但是由于大多数shell脚本都很小,大多数人并不介意这种折磨。 在bash中,控制stream命令似乎是作为一种思想而被抛出,而不是内置在语言中的东西。 如果你不相信我,比较bash和Perl的'if'循环。
[…]
解决方法很简单 – 不要使用shell语言编写shell脚本 – 使用像Perl这样的高级脚本语言。 或者Python,Ruby,PHP,Tcl甚至JavaScript。 我仍然使用bash编写shell脚本 – 但是如果shell脚本具有if条件(而不是简单的参数检查),我使用更高级的语言 – 通常是Perl。