1
sivacohan 2012-11-04 12:47:18 +08:00
恩,据unix编程艺术说,unix系统设计的对象就是程序员,众所周知,这个群体对复杂度的容忍是出奇的高。。。
|
2
SErHo 2012-11-04 13:16:43 +08:00
不是程序员也用不了那么多的命令和参数,就算是程序员,也不见得必须用多少命令和参数。
|
3
thedevil7 2012-11-04 14:16:40 +08:00 1
1. 不是每个命令都需要所有参数.
2. 很多 man page 底部都有 example. 3. 通常需要的功能可以通过 google 得出对应的命令参数. 4. 多看, 多利用 man page 的搜索功能查找自己需要的信息. 很喜欢 shell 下面的操作感, 因为一切需求都可以通过命令解决. 推荐 1. 跟着鸟哥学 linux, 这本书讲得很基础. 2. 用最小安装盘装一遍 Gentoo(Arch 也可以). 对于刚开始用 linux的同学, 其中可以学到很多东西. |
4
binux 2012-11-04 14:31:32 +08:00
其实你仔细想一想,参数是最简单的解决方案
一个程序如果需要添加功能,参数是最快的,如果是图形化,还得设计相应的UI、UE,最终也会变得非常复杂。如果不添加功能,那就需要为新功能重写一个程序,而这个程序很多功能是相似的,参数虽然简单了,但是你不得不面对一大堆程序。 |
5
zenomac OP |
7
Narcissu5 2012-11-04 15:06:04 +08:00
据说windows server 2012 带了2000多个cmdlet——什么东西搞深了都不简单啊
按照微软的吐糟,bash所以复杂是因为它都是面向字符设计的,没有利用这个时代OOP的特性。说到底linux确实应该有longhorn式的跨越了。 |
8
lwjefSub 2012-11-04 15:44:40 +08:00 1
|
9
banxi1988 2012-11-04 16:38:32 +08:00
@lwjefSub 看了,不错,感觉中文的bash方面的资料不够多啊,我在ubuntu软件源里有找到 bash高级教程呢。
|
10
kakaryan 2012-11-04 17:27:48 +08:00 1
bash不是重点吧...
重点应该是grep,sed,awk等等一系列牛逼工具的使用,而且要在实际应用中去活学活用,用得多了,这些工具就像水一样自然的从你手里流出来了. shell编程真的是其次的东西. 推荐你去cu的shell版多泡泡... http://bbs.chinaunix.net/forum-24-1.html |
11
ssword 2012-11-04 17:43:29 +08:00
当需要某个功能但没有那个参数什么的才是真·坑爹无双(
|
12
SAGAN 2012-11-04 17:44:07 +08:00
用多了就熟悉了. 完整的工具链和命令行环境是Linux最好的地方之一. 对比起来Windows的那个PowerShell就跟屎一样.
|
13
iwege 2012-11-04 18:01:41 +08:00
论体验论友好,你完全忽视了shell这玩意都是纯文本,搜索、共享、更改都很方便。比起动不动就要看配图,没有配图你都不知道对方在说什么的UI工具而言,这不是已经非常了得了么。
新手根本就不需要知道其他七七八八的东西,拿来命令行,run。一切都解决了,如果他要学习,自己可以分析这个脚本的设计思路,做代码分析等等等等。如果他想将这个脚本部分加入到自己的脚本上来说,也是ok的。 UI 层的确是给某些UI向的新手很大的便利,但是在能改动的层面上,文本才是王道,尤其是UI层无法穷举shell 无尽的组合。但是如果只是普通的 game launcher 这种简单配置,UI层来做是没问题的。 |
14
skydark 2012-11-04 18:10:35 +08:00
参数多是为了方便各种人的需求的,对特定人来说一般需要的部分会少很多,用多了自然就能记住自己最常用的那几个了。剩下的记不住就记不住吧。
|
15
kodango 2012-11-04 18:35:47 +08:00 1
@lwjefSub 哈哈 感谢推荐
@zenomac 我个人认为,学习shell有几个条件: 1)你要经常与Linux打交道,最好是命令行。 2)你要对学习有兴趣,你掌握一个命令会很开心,你遇到一个问题会思考着去解决(即使不懂)。 3)你要有主动性,遇到问题不要在论坛上丢下然后就等着,这样永远也解决不了问题。毕竟技术论坛的人气向来不高,回答的滞后性很大。你要学者自己去google搜索,或者像国外的stackoverflow/superuser等纯技术问答社区去找答案。 至于man手册很长,枯燥不易懂,没关系,我看没几个人会去通读整篇手册把。手册是遇到问题查阅用的,本身就不是一篇教程让人学习通读的。 还有命令行参数多的问题,我觉得把功能强的参数肯定多,因为功能多少和参数个数其实是成正比的,但是你可能用到全部参数吗?肯定不会的,你只会用其中的几个(3、4、5个左右),所以不要试图全部掌握,一步一步来,用到得时候再说。 就那grep做例子把,参数也挺多,但是可能你一个参数都不需要,等你哪一天用grep的时候有了忽略大小写的需求是,你在去查grep的help,这是你会发现有一个-i的参数,你也用得到;又到一天,你突然发现你grep的时候想显示在文件的哪一行,这时候你又发现了-n参数。。 等你用久了,你会发现grep比较有用的参数,就有个积累了。 ls命令也一样,最长用的就几个,比如-l/-h/-a,其他的用到时候再说哈哈。 当然也有那种参数很少的,这种命令往往是功能单一比较小巧的命定,比如一些内置命令、head/tail等等。 |
16
kodango 2012-11-04 18:51:22 +08:00
补充一句,chinaunix是个好论坛,虽然人不多(?我个人感觉),但是资料很丰富,老一辈们沉淀下来的技术文档很赞。
|
17
chenge 2012-11-04 19:04:02 +08:00
其实没那么难。命令参数虽多,常用的就不多,就十多条。请参考我写的短文:linux的六个管理。
http://chenge.diandian.com/post/2012-10-19/40039721456 没有捷径,就是日积月累。shell的基本使用目前看还是必须学的。 |
18
hyq 2012-11-04 19:06:29 +08:00
@kodango +1
一般情况下,只要记得几个简单的就够了,然后学会怎么查阅文档。 我觉得学习shell最重要的还是得弄清楚shell的管道和shell的内置命令,如for,[,$((expr)),至于grep,awk,sed等,了解其主要功能特点,重点掌握最常用的功能就行了 像grep的参数,我只记得-v,find的参数,我只记得-name 和-exec。 学精通了当然可以极大地提高效率,但是一般来说,学得差不多就行了。除非你是网管。 |
19
Kymair 2012-11-04 19:30:22 +08:00
Unix基于纯文本的管道说实话已经有点过时了… 当然对于一直浸淫在其下的人也许觉得这不是问题
基于JSON或者edn(https://github.com/edn-format/edn)之类的格式应该会好很多 OS X下的services是挺好的IPC, 不像Windows下就只有剪贴板 |
20
cabbala 2012-11-04 21:11:50 +08:00
老的MANPAGE最大的问题是EXAMPLE不详细
EXAMPLE是必须的啊必须的,好在现在大家写MANPAGE就写EXAMPLE了 |
21
cabbala 2012-11-04 21:14:18 +08:00
@Kymair 不如想想基于json的话下面这条命令怎么实现
cat hostlist | xargs -i ssh {} "ls -al /home/work/abc/abc.log | awk '{print \$5}'" | awk '{sum+=$1}END{print "avg=",sum/NR}' |
22
cabbala 2012-11-04 21:16:26 +08:00
@Kymair 刚刚用的一个log大小统计的命令,我想不出来有什么格式能够比纯文本还要方便。json首先你要定义好各种数据结构,学习成本和复杂度蹭蹭就上去了
|
23
Kymair 2012-11-04 21:32:35 +08:00
@cabbala 同学,我虽然年纪不大,但也是5年的SA了,每一天都在终端下泡著,也是Vi和Emacs用户。
Unix哲学确实很经典,所以才能几十年经久不衰,但是如同任何事物一样,并不是完美的。就拿你自己提供的这条命令来说,只要一看到$5, $1这种东西,就知道牵扯到了太多预设。比如你得知道ls的长输出每个column分别代表什么。对于浸淫在其中很多年的人来说,这些自然不是问题。在你考虑学习成本和复杂度的时候,也需要考虑额外的心智负担,回到楼主的迷茫,你就能够看到,其实对于入门者来说,是很困难的。 也许你会说,Unix是设计给专家和hacker来使用的,但是这并不是理由。Lisp, Emacs也是hacker才会用的东西,但是同Unix的IPC“所有的数据流都是无结构字符串,让我们来写parser吧!”不同,我觉得“所有的东西都是list”要更普适强大一些。 |
24
cabbala 2012-11-04 21:48:21 +08:00
@Kymair OP握手。
对的,纯文本的特点就是无法标记各个域,一旦ls的输出格式变了,我敢说这个世界上就上万个脚本会失败。。 但是用其他的格式取代纯文本,说倒是很容易了,但做起来却不一样。这个大家都在说,如果拿不出一个可用的demo,那还是算了。。。 |
25
cabbala 2012-11-04 21:51:36 +08:00
|
26
iwege 2012-11-04 22:10:11 +08:00
不管是什么样的操作系统,纯文本的parser都是基石吧?
unix的这套一旦学通了,感觉上迁移性很强,至少其他的系统上能跑。如果全部是list的话,不是还要学习list的特殊语法么?这个其实和parser纯文本没太大区别吧?(感觉就是在纯文本parser上面增加了一层而已)早期大家不支持json格式的时候,还不是自己写了一套parser来做这个事情...使用上还不是要知道各种key代表的什么意思?不然{a:1,b:2,c:3}这种谁知道是什么。 |
27
lch21 2012-11-04 23:50:48 +08:00
干什么都得付出点代价
|
28
dcoder 2012-11-05 00:26:38 +08:00 1
json之类的高级list或者dictionary比字节流文本更流行肯定是必然趋势,字节流文本本来就是为了方便子算计下层抽象(文件存储,进程通信,网络通信)统一而制定的,它本身是“反人类”的。字节流文本的输入和输出都需要做人肉parser,有没有json之类的格式,区别就是如果是json类输入输出,你做的人肉parser就更简单,如果没有json类输入输出,你做的人肉parser就复杂 -- 冗长的manual就是给你做人肉parser的格式指导,并且这个指导只是“注释“级别的,比json类格式更加的容易变,容易不靠谱,特别是考虑到*nix不同distribution, 不同shell之间的不兼容,你看的这些冗长的manual信息,随时可能失效!
所以,我想说的是,不要给新人过度吹捧shell.这东西迟早是要被代替的。就肯有没有牛人,或者牛人组织来做这个事情。用shell,只需要理解基本的东西就行了:cd/cp/mv/ssh/ls/find/chmod 等等之类的。当然如果你要做admin,或者定制*nix系统,你得看很多shell,那是另外一回事。 楼主问有Python之类的方案吗?你可以看这本书: <Python for Unix and Linux System Administration> http://www.amazon.com/Python-Unix-Linux-System-Administration/dp/0596515820/ref=sr_1_1?ie=UTF8&qid=1352046371&sr=8-1&keywords=python+in+admin |
29
dcoder 2012-11-05 00:30:45 +08:00
‘计算机’3个字打错了,不知道怎么编辑,改在下面:
字节流文本本来就是为了方便 计算机 下层抽象(文件存储,进程通信,网络通信)统一而制定的,它本身是“反人类”的。 |
30
cabbala 2012-11-05 10:00:23 +08:00 1
@dcoder 早在80年代就有人对Unix的文本流管道感到不爽了,要求用其他的格式来替代。
Unix编程艺术这本书更是将其作为Unix最大的缺点之一。 但是30年过去了,还是原来的样子。这里套用Linus的一句话: Talk is cheap, show me the code. 不要寄希望于所谓的大牛,如果谁来鼓吹有更好的方法可以替代Unix的管道,那么请拿出code或者demo来,否则免谈。。不过就是镜花水月 |
31
xtrs 2012-11-05 10:18:44 +08:00
就是一个熟练过程,使用频率高的自然就记住了,不常用的也没必要记,百年不遇需要时临时man一下也就OK了,久而久之就适应了,无他。
|
33
c0878 2012-11-05 11:20:09 +08:00
just fucking google it
|
34
dcoder 2012-11-05 11:28:40 +08:00
@cabbala
我说shell编程会被逐步代替的,不是字节流本身这个抽象(字节流应该被隐藏在底层)。 从来没统一过的各种shell + *nix各版本没统一过的环境变量 + 各种没有统一过的cmd工具 == 非常丑陋的古董程序. 我是建议lz如果不是做admin或者*nix系统定制,就别去折磨自己了,会基本的shell+cmd就行。 至于字节流本身,裸用当然是不如高级数据结构(list,dic,map)舒服了,这个是肯定的。像json之类的 {"name":value} 如果写的好,本身就是“注释”和"代码"合一的。但是字节流是传送/存储这种高级数据结构的基础,是会一直存在的。只是上层的数据结构规范统一了以后,程序猿没事是不用自己做人肉parser的。如果有高级数据结构(不恰当的例子,如大家都知道的C++STL里的map之类),当然不用用裸体的字节流了。所以,如果有时试着用Python之类的新脚本语言来做些简单的系统管理任务的话,就避免了用shell+cmd来parse各种复杂输入输出字节流的情况。 不需要等待牛人,lz自己就可以这样灵活地处理。 |
35
anyforever 2012-11-05 12:17:49 +08:00
@xtrs 9494,没有必要全记住,你的脑子又不是电脑。知道怎么查,怎么用就行了,现用现查都来得及。
|
36
cabbala 2012-11-05 13:30:05 +08:00
@dcoder 恩,用Python或者Ruby来取代shell是不错的选择。
但是Python去做事情有的时候有点隔靴搔痒的感觉,只能说小部分取代,根本上是没办法的。顶多用Python去调shell下的程序,还不是要记那些参数。。。 |
37
dcoder 2012-11-05 14:03:34 +08:00
|
38
skydark 2012-11-05 15:11:11 +08:00
Python 本来不就是打算设计成一个系统(名字忘了,Am开头的)的 shell 么XD
|
40
ADIVILOrz 2012-11-05 23:12:39 +08:00
@xupefei 他言重了,引用re,看看这个PS怎么处理?
cat hostlist | xargs -i ssh {} "ls -al /home/work/abc/abc.log | awk '{print \$5}'" | awk '{sum+=$1}END{print "avg=",sum/NR}' |
41
heshang446 2012-11-06 06:21:29 +08:00
我觉得linux多用用有了经验就好了
|
42
laneovcc 2012-11-06 19:33:18 +08:00
$ man builtin
|
43
bengle 2012-11-06 19:37:38 +08:00
用习惯就好了,你会发现命令行的吸引力不必ui界面差
|