帮帮忙,写一个unix或linux程序,linux下运行java程序并输出process id

& & & &在Linux/Unix系统中。每一个进程都有一个非负整型表示的唯一进程ID。尽管是唯一的。可是进程的ID能够重用。当一个进程终止后,其进程ID就能够再次使用了。大多数Linux/Unix系统採用延迟重用的算法,使得赋予新建进程ID不同于近期终止进程所使用的ID,这主要是为了防止将新进程误觉得是使用同一ID的某个已终止的先前进程。本文讨论了Linux/Unix分配进程ID的方法以及源代码实现。
分配进程ID的方法
& & & 在大多数Linux/Unix系统中,生成一个进程ID方法是:从0開始依次连续分配,一直到能够分配的最大的进程ID(不同的系统。这个最大值是不一样的,比方有些Linux系统是65536)。一旦到达最大值,又一次从某个值(不同的系统,这个值也是不一样的,比方在Mac OS X和HP-UX系统中,这个值是100)開始依次连续查找那些还没有被使用的ID。这里分配进程ID的方法,存在潜在的安全问题。由于能够从系统获取信息或者提取进程间通信的内容。考虑到安全问题。部分系统可能用其它方法来分配进程ID,比方随机分配一个进程ID。不管用什么方法分配进程ID。系统都须要保证每一个进程ID是独一无二的。
Linux系统上分配进程ID的源代码实现
& & & 在Linux系统中,内核分配PID的范围是(RESERVED_PIDS, PID_MAX_DEFAULT)。在每一个namespace中。PID是依次连续分配的(在不同的namespace的task能够有同样的ID)。一旦ID达到分配到达上限(在pseudo-file /proc/sys/kernel/pid_max中能够查看能够分配的最大进程ID),从头開始查找分配PID。下面是相关的源码:
struct pid *alloc_pid(struct pid_namespace *ns)
/*省略了一些代码*/
for (i = ns-& i &= 0; i--) {
nr = alloc_pidmap(tmp);
if (nr & 0)
pid-&numbers[i].nr =
pid-&numbers[i].ns =
tmp = tmp-&
/*省略了一些代码*/
static int alloc_pidmap(struct pid_namespace *pid_ns)
int i, offset, max_scan, pid, last = pid_ns-&last_
struct pidmap *
pid = last + 1;
if (pid &= pid_max)
pid = RESERVED_PIDS;
/* and later on... */
pid_ns-&last_pid =
& & & &注意在Linux内核中,进程PID实现并不不过一个int标识符号(当然返回给应用程序,PID不过int类型的数值)。相关实现的结构体在/include/linux/pid.h中能够找到。除了ID外。它还包含跟这个ID相关的task列表、引用计数器和一个能够方便查找的hashed list。
进程ID分配须要注意的事项
& & & &1、僵尸进程的PID是临时不能用的。须要其父进程收集器全部的终止状态才干使用,也就是说须要调用类似wait()函数后,才干使用。
& & & &2、详细实现时,系统能够随机分配进程PID(当然是保证没有被其它进程使用),因此在应用程序中,不要依赖于进程PID的分配方式。
& & & &3、在用户空间(user space)可能看到分配的进程ID并不连续,这是由于在应用程序两个fork之间,内核调度程序(scheduling)可能创建了一个进程。其实。这样的情况是常常发生的。
《UNIX环境高级编程》(第二版)
/questions/135007/how-are-pids-generated
/questions/3446727/how-does-linux-determine-the-next-pid
http://en.wikipedia.org/wiki/Process_identifier
阅读(...) 评论()&p&既然你是在校学生,而且编程语言和数据结构的基础还不错,我认为应该在《操作系统》和《计算机体系结构》这两门课上下功夫,然后才去读编程方面的 APUE、UNP 等书。&/p&&br&&p&下面简单谈谈我对学习这两门课的看法和建议,都是&b&站在服务端程序员的角度,从实用主义(&/b&pragmatic&b&)的立场出发&/b&而言的。&/p&&br&&p&&b&学习操作系统的目的&/b&,不是让你去发明自己操作系统内核,打败 Linux;也不是成为内核开发人员;而是理解操作系统为用户态进程提供了怎样的运行环境,作为程序员应该如何才能充分利用好这个环境,哪些做法是有益的,哪些是做无用功,哪些则是帮倒忙。&/p&&br&&p&&b&学习计算机体系结构的目的&/b&,不是让你去设计自己的 CPU(新的 ISA 或微架构),打败 Intel 和 ARM;也不是参与到 CPU 设计团队,改进现有的微架构;而是明白现代的处理器的能力与特性(例如流水线、多发射、分支预测、乱序执行等等指令级并行手段,内存局部性与 cache,多处理器的内存模型、能见度、重排序等等),在编程的时候通过适当组织代码和数据来发挥 CPU 的效能,避免 pitfalls。&a href=&///?target=http%3A///papers/modernmicroprocessors/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Modern Microprocessors&i class=&icon-external&&&/i&&/a&&/p&&br&&b&这两门课程该如何学?看哪些书?&/b&这里我告诉你一个通用的办法,去美国计算机系排名靠前的大学的课程主页,找到这两门课最近几年的课程大纲、讲义、参考书目、阅读材料、随堂练习、课后作业、编程实验、期末项目等,然后你就心里有数了。&br&&br&&p&&b&学习任何一门课程都要善于抓住主要矛盾、分清主次、突出重点&/b&,关键是掌握知识框架,学会以后真正有用的知识和技能,而不要把精力平均分配在一些琐事上。&/p&&br&&p&请允许我再次引用孟岩的观点:&a href=&///?target=http%3A//blog.csdn.net/myan/article/details/5877305& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&blog.csdn.net/myan/arti&/span&&span class=&invisible&&cle/details/5877305&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&blockquote&&p&我(孟岩)主张,在具备基础之后,学习任何新东西,都要抓住主线,突出重点。对于关键理论的学习,要集中精力,速战速决。而旁枝末节和非本质性的知识内容,完全可以留给实践去零敲碎打。&/p&&br&&p&原因是这样的,任何一个高级的知识内容,其中都只有一小部分是有思想创新、有重大影响的,而其它很多东西都是琐碎的、非本质的。因此,集中学习时必须把握住真正重要那部分,把其它东西留给实践。对于重点知识,只有集中学习其理论,才能确保体系性、连贯性、正确性,而对于那些旁枝末节,只有边干边学能够让你了解它们的真实价值是大是小,才能让你留下更生动的印象。如果你把精力用错了地方,比如用集中大块的时间来学习那些本来只需要查查手册就可以明白的小技巧,而对于真正重要的、思想性东西放在平时零敲碎打,那么肯定是事倍功半,甚至适得其反。&/p&&br&&p&因此我对于市面上绝大部分开发类图书都不满——它们基本上都是面向知识体系本身的,而不是面向读者的。总是把相关的所有知识细节都放在一堆,然后一堆一堆攒起来变成一本书。反映在内容上,就是毫无重点地平铺直叙,不分轻重地陈述细节,往往在第三章以前就用无聊的细节谋杀了读者的热情。&/p&&/blockquote&&br&&p&比如说操作系统,应该把精力主要放在进程管理与调度、内存管理、并发编程与同步、高效的IO等等,而不要过于投入到初始化(从 BIOS 加载引导扇区、设置 GDT、进入保护模式)这种一次性任务上。我发现国内讲 Linux 内核的书往往把初始化的细节放在前几章,而国外的书通常放附录,你可以体会一下。初始化对操作系统本身而言当然是重要的,但是对于在用户态写服务程序的人来说,弄清楚为什么要打开 PC 上的 A20 地址线真的有用处吗?(这不过是个历史包袱罢了。)&/p&&br&&p&再比方说《计算机网络》,关键之一是理解如何在底层有丢包、重包、乱序的条件下设计出可靠的网络协议,这不算难。难一点的是这个可靠协议能达到“既能充分利用带宽,又能做到足够公平(并发连接大致平均分享带宽)”。而不是学会手算 CRC32,这更适合放到信息论或别的课程里去讲。&/p&&br&&b&注意分清知识的层次&/b&。就好比造汽车与开汽车的区别,我认为一个司机的技能主要体现在各种道路条件和天气状况下都能安全驾驶(城市道路、高速公路、乡间公路 X 晴、雨、雪、雾),平安到达目的地。作为一名司机,了解汽车运行的基本原理当然是好事,可以有助于更好地驾驶和排除一些常见故障。但不宜喧宾夺主,只要你不真正从事汽车设计工作,你再怎么研究发动机、传动、转向,也不可能比汽车厂的工程师强,毕竟这是人家的全职工作。而且钻研汽车构造超过一定程度之后,对开好车就没多大影响了,成了个人兴趣爱好。“有的人学着学着成了语言专家,反而忘了自己原本是要解决问题来的。”(语出孟岩 &a href=&///?target=http%3A//blog.csdn.net/myan/article/details/3144661& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&快速掌握一个语言最常用的50%&i class=&icon-external&&&/i&&/a&)&br&&br&对于并发编程来说,掌握 mutex、condition variable 的正确用法,避免误用(例如防止 busy-waiting 和 data race)、避免性能 pitfalls,是一般服务端程序员应该掌握的知识。而如何实现高效的 mutex 则是 libc 和 kernel 开发者应该关心的事,随着硬件的发展(CPU 与内存之间互联方式的改变、核数的增加),最优做法也随之改变。如果你不能持续跟进这一领域的发展,那么你深入钻研之后掌握的知识到了几年之后可能反而成为累赘,当年针对当时硬件的最优特殊做法(好比说定制了自己的 mutex 或 lock-free 数据结构)在几年后有可能反而会拖低性能。还不如按最清晰的方式写代码,利用好语言和库的现成同步设施,让编译器和 libc 的作者去操心“与时俱进”的事。&br&&br&&b&注意识别过时的知识。&/b&比方说&b&《操作系统》&/b&讲磁盘IO调度往往会讲电梯算法,但是现在的磁盘普遍内置了这一功能(NCQ),无需操作系统操心了。如果你在一个比较好的学校,操作系统课程的老师应该能指出这些知识点,避免学生浪费精力;如果你全靠自学,我也没什么好办法,尽量用新版的书吧。类似的例子还有&b&《计算机体系结构》&/b&中可能会讲 RISC CPU 流水线中的 delay slot,现在似乎也都废弃了。&b&《计算机网络》&/b&中类似的情况也不少,首先是 OSI 七层模型已经被证明是扯淡的,现在国外流行的教材基本都按五层模型来讲(&a href=&///?target=http%3A//en.wikipedia.org/wiki/Internet_protocol_suite%23Layer_names_and_number_of_layers_in_the_literature& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Internet protocol suite&i class=&icon-external&&&/i&&/a&),如果你的教材还郑重其事地讲 OSI (还描绘成未来的希望),扔了换一本吧。其次,局域网层面,以太网一家独大(几乎成了局域网的代名词),FDDI/Token ring/ATM 基本没啥公司在用了。就说以太网,现在也用不到 CSMA/CD 机制(因为 10M 的同轴电缆、10M/100M 的 hub 都过时了,交换机也早就普及了),因此碰撞检测算法要求“以太网的最小帧长大于最大传播延迟的二倍”这种知识点了解一下就行了。&br&&br&另外一点是 low level 优化的知识非常容易过时,编码时要避免过度拟合(overfitting)。比方说目前国内一些教科书(特别是大一第一门编程语言的教程)还在传授“乘除法比加减法慢、浮点数运算比整数运算慢、位运算最快”这种过时的知识。现代通用 CPU 上的实际情况是整数的加减法和乘法运算几乎一样快,整数除法慢很多;浮点数的加减法和乘法运算几乎和整数一样快,浮点数除法慢很多。因此用加减法代替乘法(或用位运算代替算术运算)不见得能提速,反而让代码难懂。而且现代编译器可以把除数为小整数的整数除法转变为乘法来做,无需程序员操心。(目前用浮点数乘法代替浮点数除法似乎还是值得一做的,例如除以10改为乘以0.1,因为浮点运算的特殊性(不满足结合律和分配率),阻止了编译器优化。)&br&&br&类似的 low level 优化过时的例子是早年用汇编语言写了某流行图像格式的编解码器,但随着 CPU 微架构的发展,其并不比现代 C 语言(可能用上 SIMD)的版本更快,反而因为使用了 32-bit 汇编语言,导致往 64-bit 移植时出现麻烦。如果不能派人持续维护更新这个私有库,还不如用第三方的库呢。现在能用汇编语言写出比 C 语言更快的代码几乎只有一种可能:使用 CPU 的面向特定算法的新指令,例如 Intel 的新 CPU (将会)内置了 AES、CRC32、SHA1、SHA256 等算法的指令。不过主流的第三方库(例如 OpenSSL)肯定会用上这些手段,及时跟进即可,基本无需自己操刀。(再举一个例子,假如公司早先用汇编语言写了一个非常高效的大整数运算库,一直运转良好,原来写这个库的高人也升职或另谋高就了。Intel 在 2013 年发布了新微架构 Haswell,新增了 MULX 指令,可以进一步提高大整数乘法的效率 &a href=&///?target=https%3A//gmplib.org/list-archives/gmp-devel/2013-August/003353.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GMP on Intel Haswell&i class=&icon-external&&&/i&&/a& ,那么贵公司是否有人持续跟进这些 CPU 的进化,并及时更新这个大整数运算库呢?或者直接用开源的 GMP 库,让 GMP 的作者去操心这些事情?)&br&&br&&b&如果你要记住结论,一定要同时记住前提和适用条件。&/b&在错误的场合使用原本正确的结论的搞笑例子举不胜举。&br&&ol&&li&《Linux内核源码情景分析》上分析内核使用 GDT/LDT 表项的状况,得出进程数不超过 4090 的结论。如果你打算记住这个结论,一定要记住这是在 Linux 2.4.0 内核,32-bit Intel x86 平台上成立,新版的内核和其他硬件平台很可能不成立。看完书后千万不要张口就来“书上说 Linux 的最大进程数是 4090”。&br&&/li&&li&一个 Linux 进程最多创建 300 余个线程,这个结论成立的条件是 3GB 用户空间,线程栈为 10M 或 8M。在 64-bit 下不成立。&/li&&li&Reactor 模式只能支持不超过 64 个 handle,这个结论成立的条件是 Windows 下使用 WaitForMultipleObjects 函数实现的 WFMO_Reactor,对于 Linux 下使用 poll/epoll 实现的 Reactor 则无此限制。&/li&&li&C++ STL 的 vector 容器在 clear() 之后不会释放内存,需要 swap(empty vector),这是有意为之(C++11 里增加了 shrink_to_fit() 函数)。不要记成了所有 STL 容器都需要 swap(empty one) 来释放内存,事实上其他容器(map/set/list/deque)都只需要 clear() 就能释放内存。只有含 reserve()/capacity() 成员函数的容器才需要用 swap 来释放空间,而 C++ 里只有 vector 和 string 这两个符合条件。&br&&/li&&/ol&&br&最后一点小建议,服务端开发这几年已经普及 64-bit 多核硬件平台,因此在学习操作系统的时候,可以不必太关心单核上特有的做法(在单核时代,内核代码进入临界区的办法之一是关中断,但到了多核时代,这个做法就行不通了),也不必太花精力在 32-bit 平台上。特别是 32-bit x86 为了能支持大内存,不得已有很多 work around 的做法(困难在于 32-bit 地址空间不够将全部物理内存映射入内核),带来了额外的复杂性,这些做法当时有其积极意义,但现在去深入学似乎不太值得。&br&&br&关于项目,&b&我出两个练手题目&/b&:&br&&p&&b&一、多机数据处理&/b&。有 10 台机器,每台机器上保存着 10 亿个 64-bit 整数(不一定刚好 10 亿个,可能有上下几千万的浮动),一共约 100 亿个整数(其实一共也就 80GB 数据,不算大,选这个量级是考虑了 VPS 虚拟机的容量,便于实验)。编程求出:&/p&&p&1. 这些数的平均数。&/p&&p&2. 这些数的中位数。&/p&&p&3. 出现次数最多的 100 万个数。&/p&&p&*4. (附加题)对这 100 亿个整数排序,结果顺序存放到这 10 台机器上。&/p&&p&*5. (附加健壮性要求)你的程序应该能正确应对输入数据的各种分布(均匀、正态、Zipf)。&/p&&p&*6. (附加伸缩性要求)你的程序应该能平滑扩展到更多的机器,支持更大的数据量。比如 20 台机器、一共 200 亿个整数,或者 50 台机器、一共 500 亿个整数。&/p&&br&&p&&b&二、N-皇后问题的多机并行求解&/b&。利用多台机器求出 N-皇后问题有多少个解。(注意目前的世界纪录是 N = 26,&a href=&///?target=http%3A//oeis.org/A000170& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&A000170 - OEIS&i class=&icon-external&&&/i&&/a& )&/p&&p&1. 8 皇后问题在单机上的运算时间是毫秒级,有 92 个解,编程实现之。&/p&&p&2. 研究 N-皇后问题的并行算法,写一个单机多线程程序,争取达到线性加速比(以 CPU 核数计)。再设法将算法扩展到多机并行。&/p&&p&3. 用 10 台 8 核的机器(一共 80 个 CPU cores),求解 19-皇后和 20-皇后问题,看看分别需要多少运行时间。你的方案能否平滑扩展到更多的机器?&/p&&p&*4. (附加题)如果这 10 台机器的型号不一,有 8 核也有 16 核,有旧 CPU 也有更快的新 CPU,你该采用何种负载均衡策略,以求缩短求解问题的时间(至少比 plain round-robin 算法要好)?&br&&/p&&br&&p&你可以用 Amazon EC2 或 Google GCE 来验证你的程序的正确性和性能,这两家的虚拟机都是按小时(甚至更短)收费,开 10 台虚拟机做一个下午的实验也花不了多少钱。&/p&
既然你是在校学生,而且编程语言和数据结构的基础还不错,我认为应该在《操作系统》和《计算机体系结构》这两门课上下功夫,然后才去读编程方面的 APUE、UNP 等书。 下面简单谈谈我对学习这两门课的看法和建议,都是站在服务端程序员的角度,从实用主义(pr…
简单点说,比如你发现一个进程总是占用 100% CPU,通过层层检查,发现是显卡驱动中的一个 针对特别硬件的新 bug。&br&&br&然后你决定修改驱动,同时顺便优化了一下 kernel 相关代码,一夜之后,当黎明的曙光照在显示屏上时,你决定将修改部分提交到社区。&br&&br&三天后, Linus 群发邮件,说这将是下一个 kernel 版本的一个重要特性,并感谢你的贡献。&br&&br&当然,你并没有及时看到邮件,因为你正一边搂着女友,一边跟她讲多年前看过的《暗店街》。
简单点说,比如你发现一个进程总是占用 100% CPU,通过层层检查,发现是显卡驱动中的一个 针对特别硬件的新 bug。 然后你决定修改驱动,同时顺便优化了一下 kernel 相关代码,一夜之后,当黎明的曙光照在显示屏上时,你决定将修改部分提交到社区。 三天后,…
首先,要学Linux编程,你得会用Linux,也就是得在命令行环境下生存下来。什么叫生存下来呢?就是我现在给你一台主机,键盘,显示器啥的,然后给你一个服务器版的Linux系统的光盘或者其他什么安装盘,你去把这台主机用起来。什么叫用起来呢?你平常用Windows电脑干啥,你现在还用这台电脑干啥。新建文件啊,查看文件,编辑文件,保存文件,复制,移动,删除,打包,解压,联网,下载个什么东西啊等等基本操作你得会。还有软件怎么安装,不仅要熟悉apt-get和yum,还有给你源码的软件怎么安装你得会,另外要熟悉Linux下的文件系统,每个目录是干啥的,目录下的文件是干嘛的,插入一个U盘,如何挂载这个U盘,操作U盘下的文件你得会啊。这个看一本书就行了,《鸟哥的Linux私房菜-基础篇》,记得是基础篇,记得安装Linux系统自己操作一遍,还有一本是服务器篇,你既然是要学Linux编程开发,那就不用看服务器架设篇了。做完这一步,你可以开发了。&br&&br&Linux下开发,两种基本语言,C和C++咯,至于其他人要说Python,Java,Ruby啥的不讨论,因为就讨论Linux下的开发,什么是Linux开发呢?就是利用Linux的API进行开发咯,首先你得会C语言或者C++语言啊,这个去看丹尼斯的《C程序设计语言》,注意是丹尼斯的,C++的就去看《Essential C++》或者《C++ Primer》,然后在Linux下的程序开发,Linux的API是遵循POSIX标准的,自行谷歌什么叫POSIX。Linux下程序开发几大块,文件操作,这个很重要,你要知道Linux下的一个思想叫一切皆文件,可见文件读写多重要了。I/O模型,五大I/O模型,阻塞,非阻塞,复用,信号驱动和异步I/O,环环相扣丝丝相连,概念和操作都要仔细琢磨,最重要的当属复用,就是select,poll和epoll,面试笔试就问这个东西,要知道他们的适用范围和优缺点。进程和线程,包括进程和线程的概念和区别,进程和线程的建立,同步,通信,互斥等等。网络编程,就是socket编程,Linux编程,这个学不好等于啥都没学,这个估计还得了解一下TCP/IP协议,编程方面主要是那几步,申请socket,bind,listen,accept几步,要熟悉种常见的服务器模型,进程池线程池方式的,多进程方式的,复用方式的,最重要的是复用方式的,这部分可以先只写服务器,测试直接用Telnet就好了,加快速度么。其余的就是数据库,这个东西不属于Linux,但是还得会,要不然啥都做不了,看那本《MySQL必知必会》,当然深入的话还得找本专业的书细细看。这个时候就可以真刀真枪的去干点有意思的事了,比如写个终端下的类似于QQ的软件啊,包括服务器和客户端啊,慢慢的增加并发数,比如可以同时支持五千人在线啊,文件传输啊等等。然后学学Qt,熟悉一下图形界面,可以把你的终端下的QQ完全改成图形界面下的。估计到这个时候,你差不多在Linux下进行像样的开发了吧。在这个过程的学习中,相信你已经学会Makefile的编写啊,编译啊,链接啊等等一些细枝末节的东西了,还得反思一下把零散的东西串一串,要系统化。&br&&br&接下来就是继续深入了,Linux为什么这么多人用,好处在哪里,你得去稍微的看看内核源码啊,内核的进线程调度啊,我告诉你,Linux内核的一个链表都够你研究好几节课的。哦,这个时候,数据结构啥的又得翻出来加强一下了不是,计算机网络啥的也得看看,操作系统原理啥的也得看看呢不是,把这些东西放在这里是合适的,前面让你知其然,知道怎么编程怎么做,现在要知其所以然了不是。&br&&br&在学习的过程中,要不断积累和了解最新的东西,最起码要知道个概念,比如分布式,大数据,云计算,机器学习,计算机视觉,JIT等等,形成知识链,这样不会导致你最后不知道学啥。有个建议,一定要学一下Python,一定要学一下Python,一定要学一下Python,重要的事情说三遍。它能极大的提高你的工作效率,也能和C/C++结合在一起用,很nice的语言。&br&&br&最后推荐几本书(前面的包含在内):&br&《鸟哥的Linux私房菜 基础篇》&br&&br&《C程序设计语言》 丹尼斯写的&br&《Linux C编程一站式学习》 宋劲杉写的&br&《Eensstial C++》&br&《C++ Primer》&br&《Effective C++》&br&&br&《Linux网络编程》 宋劲彬写的&br&《Unix环境高级编程》&br&《Unix网络编程》 两部&br&《Linux高级程序设计》 华清远见的&br&&br&《MySQL必知必会》&br&《数据库系统概念》&br&&br&《大话数据结构》&br&《算法导论》&br&&br&《Linux内核情景分析》&br&《深入理解Linux内核》&br&&br&《深入理解计算机系统》&br&《现代操作系统》&br&《深入理解计算机网络》&br&《TCP/IP》的三卷经典书&br&&br&廖雪峰的Python学习网站&br&另外各大论坛,stackoverflow, 博客园,CSDN等等,多逛逛,当然还有知乎也要多逛逛。差不多就这么多了吧,前文列举的东西,只要完成一半,估计就不用我教你学了,你自己应该知道自己该学啥了……有时间在更,估计是没时间了……&br&&br&1月20日更:&br&之前有一点忘记写了,一定要学习一款版本管理工具,首先要了解一下什么是版本管理。然后选择一款版本管理工具,这个很重要。目前常用的是git和svn,就用git就好了,当然你要去用svn那也行。还是建议用git,看廖雪峰的git教程就好。
首先,要学Linux编程,你得会用Linux,也就是得在命令行环境下生存下来。什么叫生存下来呢?就是我现在给你一台主机,键盘,显示器啥的,然后给你一个服务器版的Linux系统的光盘或者其他什么安装盘,你去把这台主机用起来。什么叫用起来呢?你平常用Windows…
很多人似乎还是没搞清楚 shell、console、terminal 这些概念。&br&&br&Shell&br&&br&「壳」,即人与电脑的接口,实际上是个命令解释程序,从标准输入读取你的命令,把命令结果输出到标准输出和标准错误等设备。Linux 下的 Bash、Zsh,Windows 下的 cmd、PowerShell,这些都是 shell,这个应该很容易理解。&br&&br&Console&br&&br&「控制台」,即在 Linux 下按 Ctrl-Alt-F? 看到的那个命令界面。事实上,在远古的 Unix 大型机时代,console 应该是指物理连接在主机上的输入输出设备,而 terminal 是指与 console 进行远程通信的串行设备。而如今的 Linux 控制台实际上是内核模拟的 /dev/ttyn 终端,/dev/console 一般就是 /dev/tty0,只有 root 用户才能写入。&br&&br&TTY&br&&br&远程连接到控制台的串行设备,现在来说通常也就是 /dev/ttyn 这些设备啦。&br&&br&PTY&br&&br&Psuedo Terminal 「伪终端」,是成对的逻辑设备,/dev/ptmx 和 /dev/pts/&number&。实际上 X 的终端以及 telnet 和 ssh 等服务都是通过伪终端来进行的。远程终端绑定到 /dev/pts/&number& 端口上,服务器实际对 /dev/ptmx 进行读写,但结果都会反映在 /dev/pts/&number&,远程终端会认为自己在读写一个串行终端,服务器也会认为自己在从一个串行终端进行读写,中间则由 telnet ssh X11 等协议进行连接。&br&&br&Windows 的情况&br&&br&严格来说 Windows(具体来说是 Win32 子系统)上并不存在 Linux 上所谓的「控制台」、「终端」和「伪终端」。Windows 程序可以被编译到 GUI 子系统和控制台子系统,系统通过程序的入口函数可以判断程序是个 GUI 程序还是控制台程序。对于 GUI 程序来说,stdin stdout stderr 这些设备都是不存在的。而 Windows 那个黑黑的命令行窗口被称为「Windows 控制台」,实际上它里面模拟了标准输入、标准输出等设备。默认情况下从 explorer 中双击打开命令行程序时,系统会动态创建一个新的 console,用 start /b 命令可以让程序在当前 console 中运行,不加 /b 则在新的 console 中运行,而这两个 console 的 stdin stdout 等设备又都完全不相干了。&br&&br&普通程序可以通过 ReadConsoleInput ReadConsoleOutput WriteConsoleInput WriteConsoleOutput 等 API 与一个控制台窗口进行交互,另外有 AttachConsole 和 FreeConsole 这样的 API 使程序可以随意绑定到某个 console 窗口。当然这些 API 也可以某种程度上被认为是一种「终端协议」,但它与 Linux 上的 tty 是完全不同的。tty 实际上是一种字符串流协议。而 Win32 以 API 形式的「终端」协议,一般就很难进行远程通信了。&br&&br&像 ConEmu 这样的程序其实还是通过上面说的那些 API 来跟背后隐藏的一个控制台窗口进行交互,缺点也很明显,它只能完全复制控制台窗口上的内容,受限于 Win32 控制台窗口本身的实现。Win32 控制台不支持 256 色,它也没法支持。Win32 控制台增大宽度后运行一个命令输出了很长的字符串,再把窗口缩小,这缩小的那部分字符就丢失了,微软直到 Windows 10 才让控制台窗口支持了随意改变大小和折行。此外每隔一定时间用 ReadConsoleOutput 等来拉取控制台窗口内容,这种方法对于实现远程通讯等也是不可靠的。&br&&br&Win32 Console API 在 Win 7 之前都是在 csrss 里的,到了 Win 7 多了一个 conhost,它取代了过去 csrss 中处理 console 的那部分,接管 console window 并与 csrss 进行交互。这个 conhost 某种程度上可以被认为是一个 pty。理论上我们可以写个自己的 conhost 取代系统的,从而实现一个更好的终端程序,甚至实现 ssh server 等。可惜 csrss 的 API 是不公开的或者说 undocumented,没有容易的方法得到 conhost 与 csrss 间的协议。Cygwin 的 pty 只支持 Cygwin 的程序,并不能把普通 Win32 程序的 console 调用转换成 Unix 终端的字节流。Cygwin 只是在内部处理了 Unix 的终端字节流然后转换成 Windows 控制台的 API 调用。所以假如你用 Cygwin 做 ssh server,远程运行非 Cygwin 的 Win32 console 程序,有时会出现各种奇葩问题。当然其实还有一神器叫做 winpty,它可以开一个隐藏的 console 窗口,并把它转换成 Unix 终端字符流并导入 Cygwin 或 Msys 的伪终端设备。但它也有跟 ConEmu 一样的缺点。&br&&br&&br&以上这些我也是粗浅认识,并没有深入研究,如有错误请指出,谢谢!&br&&br&=========================================&br&&br&第一次回答过百赞,感谢大家支持!☆*:.?. o(≧▽≦)o .?.:*☆
很多人似乎还是没搞清楚 shell、console、terminal 这些概念。 Shell 「壳」,即人与电脑的接口,实际上是个命令解释程序,从标准输入读取你的命令,把命令结果输出到标准输出和标准错误等设备。Linux 下的 Bash、Zsh,Windows 下的 cmd、PowerShell,这些…
好吧,我来回答我制造的话题。&br&&br&&b&首先,我先表达一下开源软件的伟大,并向开源的人们致于我最真诚的敬意。但,即使这样,我们也要很客观的承认大多数开源软件是存在大量问题的&/b&。就像我这个人主观上并不喜欢微软和IBM,但是我必需要承认,没有微软和IBM,计算机这个行业不会有今天这样的爆炸。(插曲:我94年上大学选的专业是计算机科学,当时很多人都觉得计算机专业是一个ZB的专业,因为几乎没有哪个企业在用电脑,但我幸运的是95年的时候微软出了Win95,Sun出了Java,然后互联网极度膨胀,才导致我选的专业最终变得很火)不可否认,IBM和微软里有相当NB让人五体投地的人。&br&&br&至于我说的这两句话,我知道是有争议的,&b&尤其是我用了“抄”,在此请原谅我用词不当,像从事开源的朋友道歉。这个“抄”其实是“模仿”的意思&/b&。&br&&br&要是没有开源,我们中国人的软件公司能做出云平台吗?能做出手机吗?能大数据吗?真心感谢开源!呵呵。&br&&br&&b&&u&简单地说一下开源的历史&/u&&/b&&br&&br&简单的回顾一下历史,而开源源自Unix最初的发展史,然后,就被商业化了,于是N多的Unix变种就出来了,那些Unix老牌黑客们一下就被成了像罗宾汉一样的成了丛林草莽,以至于Microsoft用次等的技术占领了市场,而RMS也开始了他的GNU项目,但是GNU并没有获得那些Unix老牌黑客的青睐,因为他们觉得RMS就像当年马克思满世界鼓吹共产主义一样鼓吹他人的GNU,最终Linus出来把这些Unix老牌黑客召集了起来,让Unix的开源精神重生。这段历史起源于Ken/Dennis,再次向他们致敬!详细的历史大家可以看看我7年前写的:&a class=& wrap external& href=&///?target=http%3A///articles/2322.html& target=&_blank& rel=&nofollow noreferrer&&Unix传奇(上篇)&i class=&icon-external&&&/i&&/a&、&a class=& wrap external& href=&///?target=http%3A///articles/2324.html& target=&_blank& rel=&nofollow noreferrer&&Unix传奇(下篇)&i class=&icon-external&&&/i&&/a&&br&&br&我个人以为开源软件自Unix以来,最杀手级的组合是LAMP,今天,Apache 基金会,Linux基金会……让开源的力量越来越大,很多商业公司都参与开源,比如IBM、Yahoo、SUN、Intel、Google……,开源的确成为了不可忽视的一股力量。&br&&br&但是,我们可以看出,&b&商业公司支持开源其中有一个很主要的原因是为了阻击竞争对手,理由很简单——用众包这种不花钱不花人的模式来牵制竞争对手实在是一个“低投入,大收益”的事。&/b&比如IBM支持Linux和Java,目的主要是阻击微软和Sun。Google的Android和Chrome目的也是苹果和微软。而对于这些商公司的很多核心技术是不会开放的,包括Google,连Google Reader都宁可自废都不愿意捐给开源社区维护(注:有人说是不是因为不想开源,而是因为Google Reader后面牵扯太多东西,说白了就是牵扯google的核心技术),更别说Google的那三篇论文的东西了,以及Google的搜索引擎的技术了。&br&&br&这里,我是想说,&b&如果开源是像Unix那样,有几个在那些顶尖的牛人以最纯粹的目的来搞开源的话,才可能还能搞得非常地好&/b&。&br&&br&&b&&u&关于我观点中的逻辑&/u&&/b&&br&&br&我观点中的逻辑其实很简单:&br&&br&&ul&&li&&b&如果有人掌握了一个很核心技术,这个技术足以改变世界(其实并不需要改变世界,只需要遏制竞争对手),你觉得会有多少人会开源?基本不会有人的&/b&。&/li&&br&&li&&b&你看看这个世界上的引领软件潮流的技术基本上都是商业公司做出来的。因为技术研发要花时间,花精力,更重要的是要花钱。如果你花了2-3年的时间,花费成百上千万的财力,你会开源吗?&/b&&/li&&br&&li&&b&大量开源软件都是受不了这些商业公司对技术的垄断以及非常高的价格。所以,基于这个动机,结果很自然就出现了“模仿”。&/b&&/li&&/ul&了解这些因果关系后,我相信你大约知道为什么闭源的东西要牛一些,以及为什么开源会模仿。&br&&br&&b&&u&关于各种软件的对比&/u&&/b&&br&&br&很多人对我的这个观点例了一些例子,但这些例子面太窄了,他们企图以点代面。我在这里帮大家补充一些吧,这样会更客观一些(眼界不妨放大一些):&br&&br&注意:千万不要用“用户量”来定义“技术含量”,如果你觉得:&b&“有技术含量”===“有绝对的用户量”&/b&,那么,你就会得出“QQ空间甚至hao123可能是这世上最有技术含量的软件或网站”这样荒谬的结论。&br&&br&1) VMWare 和 Xen/KVM&br&2) Google的三篇论文 和 hadoop&br&3) AWS 和 OpenStack&br&4) Google Reader和一干开源的reader&br&5) Websphere/Weblogic和Jboss, tomcat (注:互联网的大多数应用都比较简单)&br&6) 输入法,你是用sogou的还是google的,还是微软的?还是fcitx?&br&7) iOS和Android,你觉得哪个质量做得更高一些呢?&br&8) Windows/MacOS 和 Linux (对此需要分开:桌面、服务器、嵌入式) (再注:苹果公司开放了Mac OS的内核Darwin的源代码,但没有包括GUI)&br&9) 多媒体方面的软件,比如:3D动画、音频、图像……Photoshop, Maya, 3DMax...开源的:Blender,GIMP,Inkscape……&br&10) 闭源的游戏和开源的游戏,你更喜欢玩哪个的呢?&br&11) 各种办公用的OA软件,MS Office,还有SAP和PeopleSoft的软件。开源的……&br&12) 用于出版行业排版的软件,Adobe的inDesign, PageMaker, MS的publisher,开源的Tex&br&13) 安全方面的软件,大家见得最多的就是杀毒软件了。(花絮:OpenSSL的代码大家看过吗?的确写得很ugly)&br&14) 软件测试相关的:PurifyPlus, VTune, CodeAnalyst, JProfiler……开源的:valgrind, gprof..&br&15) 企业内部的IT管理软件,大家可以看一下三个公司:IBM,BMC,CA,大家可以看看他们做了些什么样的ITIL的软件(关于ITIL请大家自行Google吧)。&br&16) 行业软件:集成电路设计的软件、石油勘探的软件、航空软件、汽车里的嵌入式的软件、医疗设备用的软件、金融行业的软件、建筑设计方面的(AutoCAD)……&br&17) 聊天软件:ICQ,QQ,Skype,YY,FaceTime,YIM&br&18) 编程IDE:关于IDE的比较,请移步参看Wikipedia:&a href=&///?target=http%3A//en.wikipedia.org/wiki/Comparison_of_integrated_development_environments& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Comparison of integrated development environments&i class=&icon-external&&&/i&&/a& (注:IntelliJ IDEA是半开源的)&br&19)网页制作:Dreamwaver, Fireworks, Flash...还有开源的一堆……&br&…………&br&我还可以一直把例子举下去,因为还有很多地方的软件很少人见过的软件,比如,NASA的、CERN的、DreamWorks,等等。&br&&br&希望你的视野比我更宽一点,别只看自己编程用的那些东西,多看看这个世界高精尖的地方。&br&&br&&b&&u&其它&/u&&/b&&br&&br&我有这样的观点主要是因为我的成长史主要是在商业公司,我能看得到这些商业公司中有很多比开源软件很NB的东西。我为什么喜欢进这些顶尖的商业公司,因为只有进到这些公司我才能看有权限看到这些令人惊叹的软件是怎么做出来的。&br&&br&这也是我没有花精力贡献开源的原因——&b&因为我并不觉得只有贡献在开源才算是对社会的贡献&/b&。&br&&br&这和我不写书的原因是一样的。我不写书的原因是因为我看过Effective C++,TCP/IP详解,Unix编程艺术,等等这类经典的书,我觉得我根本就没有资格写书,如果我有他们的两三成的功力,我都会考虑出书,但是我真的不行。(另一方面再看看书店里那些95%以上的垃圾的书,真是令人恶心)&br&&br&同理,我没有做开源的原因也是一样,因为我看过很多商业公司里的那些令人惊叹的东西,我觉得我还没有资格去干个开源软件,最多跟随几个我力能及而且觉得还不错的开源软件。不过,我更愿意把我的时间和精力花在向这些商业公司学习之上,以获得更有技术含量的知识。&br&&br&&b&更新:&/b&以前也做过些开源,比如:我在读过TCP/IP的书后就去写了一个类似Wireshark的东西,也开过源,但后来出现了Wireshark,觉得自己写完全写过不Wireshark,差距太大,相比之下,我一个人干出来的东西只能算是垃圾。之后又出来了两次这样的事。所以,后来,我就不转向更多的学习了,而不仓促地去做开源了。原因就是——&b&因为我觉得开源不是为了开源而开源,也不是为了装逼而开源,更不是为了吸社会的血把项目分包给社会,开源就是为了给社会做贡献,我对给社会做真正的贡献的能力还达不到&/b&。&br&&br&人生苦短,我又没有那个聪明的DNA,这世界上的垃圾已经有很多了,我就不必再为垃圾添砖加瓦了。我还是把精力放在多看和多学上吧。因为我连一个C++ STL或JDK中的一个容器类都没有信心能写好。&br&&br&当然,我并不是说干开源的人不行。只不过,我没有信心贡献罢了。说得好听点,我标准比较高,说得难听点,我能力差。你对我的这两种理解都对。我的技术的确水,我在我的博客上的个人简介也说了我不是牛人。&br&&br&最后,谢谢大家看我的这个冗长的答案。
好吧,我来回答我制造的话题。 首先,我先表达一下开源软件的伟大,并向开源的人们致于我最真诚的敬意。但,即使这样,我们也要很客观的承认大多数开源软件是存在大量问题的。就像我这个人主观上并不喜欢微软和IBM,但是我必需要承认,没有微软和IBM,计算…
当然是 the fuck (&a href=&///?target=https%3A///nvbn/thefuck& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&nvbn/thefuck · GitHub&i class=&icon-external&&&/i&&/a&)了!!!!&br&&br&当你用 linux terminal 出现手脚无力、头晕恶心,严重的话发生心肌梗塞的症状的时候,是不是想大叫 WTF ~~ 这个 shell 脚本将为你们带来福音。&br&&br&比如,你要安装 vim 时:&br&&div class=&highlight&&&pre&&code class=&language-text&&? apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
&/code&&/pre&&/div&WTF
!!此时,你应该狠狠地在 terminal 中打出:&br&&div class=&highlight&&&pre&&code class=&language-text&&? fuck
sudo apt-get install vim
[sudo] password for nvbn:
Reading package lists... Done
&/code&&/pre&&/div&真是速效救心丸啊,心情瞬间顺畅很多。&br&&br&人生苦短,写段 python 呗,于是你在 ternimal 中打出来:&br&&div class=&highlight&&&pre&&code class=&language-text&&? puthon
No command 'puthon' found, did you mean:
Command 'python' from package 'python-minimal' (main)
Command 'python' from package 'python3' (main)
zsh: command not found: puthon
&/code&&/pre&&/div&WTF !!! 手这么残!!不过没事,快打出:&br&&div class=&highlight&&&pre&&code class=&language-text&&? fuck
Python 3.4.2 (default, Oct
&/code&&/pre&&/div&&br&真特么爽。&br&&br&ps: 我对题目一开始理解有误,我刚开始一看 shell 项目,便想到 the fuck 了,但是没想到它是 python 写的,只是与 shell 有关罢了,当然,它非常有趣。大家开心就好。
当然是 the fuck ()了!!!! 当你用 linux terminal 出现手脚无力、头晕恶心,严重的话发生心肌梗塞的症状的时候,是不是想大叫 WTF ~~ 这个 shell 脚本将为你们带来福音。 比如,你要安装 vim 时: ? apt-get install vim
&b&& 我想知道为什么会出现这样的问题&/b&&br&&br&那你有没有想过,为什么 terminal 那么大,你却只能从一个角落里开始可怜巴巴地一次输入一行命令么……其实两者的答案如果寻根问底的话——假定你来知乎问问题是想寻根问底——是一样的。&br&&br&一九七〇年代廉价的电子图像显示器出现之前,大型机的终端通常使用电传打字机(teleprinter)来跟用户交互;电传打字机的输出印在纸上,用户输入的字符就像打字机一样是删不掉的,而且用户输入什么就会立刻传给服务器;后来有了以电子显示器为输出设备的终端,一开始也只能一个字符一个字符地给服务端发信息,到七十年代末能一次给服务器发送一整行信息的「智能」终端才成为主流。此时键盘上才有了现代电脑用户觉得司空见惯(拿键盘当钢琴使的 HHKB Pro 2 用户请扭过头去)的方向键。而按下方向键给终端发送的是控制光标移动的命令,这些命令最初的表示方法是转义字串(escape sequence),也就是「我先说几个字符,说完这几个字符之后再说的那个字符请不要当作字面意思理解」。这个字符在 ANSI 标准里面排行第 27(0x1B),它是个看不见的字符,一般写「&esc&」来代表。而 ANSI 的终端机标准里面,光标上、下、右、左移动的指令分别规定为 &esc&[A,&esc&[B,&esc&[C,&esc&[D,其中方括号跟字母之间还可以插入一个数字来表示要移动几位。&br&&br&你现在使用的终端模拟器,不管是 Terminal.app 还是 iTerm 2,其实都是在用软件模拟当年用硬件实现的终端,并且还在底层帮你把按下的方向键转化为能够用来移动光标的特定转义字串。编一个 C 程序,main 里只有一行 getchar(); 编译运行(或者先在 iTerm 里按 ctrl + v ),再按上下右左,屏幕上都会显示 ^[[A ^[[B ^[[C ^[[D。其中 ^[ 就代表 esc 字符(因为 ctrl + [ 输入的字符是 0x1B)。&br&&br&而无论 bash、zsh 还是 OS X 系统自备的 Python shell,其实都是在底层将你按下方向键所产生的这三个字符按照 ANSI 标准理解为你要移动光标,并移动光标。这种「把三个字符按照 ANSI 标准理解为你要移动光标」,或者叫做「line editing」,的功能是如此常用,以至于人们写了专门的程序库来做这件事,它叫做 &a href=&///?target=http%3A//tiswww.case.edu/php/chet/readline/rltop.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The GNU Readline Library&i class=&icon-external&&&/i&&/a&。&br&&br&但问题在于,readline 采用 GPL v3 授权,这一授权要求所有使用 readline 的程序必须开源。在版权法执行得比我国好的国家里,这是个严重的问题,OS X 里面也就因此没有 readline 库。所以,如果你不去弄一份 GNU Readline,&del&virtualenv&/del&(注:此处我把 pythonz 和 virtualenv 弄混了。virtualenv 并不能编译 Python,只是创建一份隔离开来的 Python 运行环境)你自己编译的 Python shell 就没有 line editing 功能;而如果你在创建虚拟环境的时候指定了这一自行编译的版本作为该环境的 Python,那么当你切换到那个环境的时候就会出现这样的问题。为了在不带 GNU Readline 的系统下给 Python 程序提供 line editing 功能,Python 提供了&a href=&///?target=https%3A//pypi.python.org/pypi/readline& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pypi.python.org/pypi/re&/span&&span class=&invisible&&adline&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 模块,以内嵌 GNU readline 库。更多信息可以读它的文档。&br&&br&那么苹果 OS X 自带的 Python shell 是怎样实现 line editing 的呢?是用 BSD 授权的 &a href=&///?target=http%3A//www.thrysoee.dk/editline/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Editline Library (libedit)&i class=&icon-external&&&/i&&/a& 。&br&&br&此外,也有可能是 virtualenv 没有正确地处理独立环境里的库——在 &a href=&///?target=https%3A//pypi.python.org/pypi/virtualenv& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pypi.python.org/pypi/vi&/span&&span class=&invisible&&rtualenv&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 一页上搜寻「readline」,可以看到不少都和 OS X 有关,所以应该确定自己在使用 virtualenv 的最新版本。&br&&br&而 readline 提供的功能,除去按方向键移动光标,还包括比如 ctrl + a 到行首、ctrl + e 到行尾、alt + f 前进一个单词、alt + b 后退一个单词之类;如果觉得 Emacs 讨厌,还可以转用 vi key-binding。如何才能挖掘出 readline 的全部功能,就留给读者做为习题好了。&br&&br&&b&& 以及如何修复&/b&&br&&div class=&highlight&&&pre&&code class=&language-text&&easy_install readline
&/code&&/pre&&/div&(不,&a href=&///?target=http%3A///a/73& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&别用pip&i class=&icon-external&&&/i&&/a&)
& 我想知道为什么会出现这样的问题 那你有没有想过,为什么 terminal 那么大,你却只能从一个角落里开始可怜巴巴地一次输入一行命令么……其实两者的答案如果寻根问底的话——假定你来知乎问问题是想寻根问底——是一样的。 一九七〇年代廉价的电子图像显示…
&b&年度最佳出炉了!github上的2万stars项目: hacker scripts.&/b&&br&&a href=&///?target=https%3A///NARKOZ/hacker-scripts& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/NARKOZ/hacke&/span&&span class=&invisible&&r-scripts&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&img src=&/e5de1721c2_b.png& data-rawwidth=&120& data-rawheight=&26& class=&content_image& width=&120&&&br&究竟是什么样的项目能在超短时间内在github拿到如此多的stars,看看说明文档:&br&&br&&blockquote&Hacker Scripts&br&Based on a _[true story](&a href=&///?target=https%3A///alexblog/249-now-thats-what-i-call-a-hacker/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Now that's what I call a Hacker&i class=&icon-external&&&/i&&/a&)_:&/blockquote&这是一个基于真实的故事。&br&&blockquote&xxx: OK, so, our build engineer has left for another company. The dude was literally living inside the terminal. You know, that type of a guy who loves Vim, creates diagrams in Dot and writes wiki-posts in Markdown... If something - anything - requires more than 90 seconds of his time, he writes a script to automate that.&/blockquote&&i&&u&xxx:&/u&&/i& 哎呀我们的build engineer跳槽到另一家公司了。这哥们儿基本上就是活在终端里。你知道的,就是那种超爱Vim、编辑图表使用Dot、就连写维基都使用Markdown的那类人。如果什么事情,不对,是任何事情,只要花费他90秒的时间,他就写个脚本,自动执行。&br&&blockquote&xxx: So we're sitting here, looking through his, uhm, &legacy&&/blockquote&&i&&u&xxx:&/u&&/i& 那么让我们坐在这儿,来看看他的。。。。呃。。。“遗产”。&br&&blockquote&xxx: You're gonna love this&/blockquote&&i&&u&xxx:&/u&&/i& 你会爱上这一切的。&br&&blockquote&xxx: [`smack-my-bitch-up.sh`](&a href=&///?target=https%3A///NARKOZ/hacker-scripts/blob/master/smack-my-bitch-up.sh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hacker-scripts/smack-my-bitch-up.sh at master · NARKOZ/hacker-scripts · GitHub&i class=&icon-external&&&/i&&/a&) - sends a text message &late at work& to his wife (apparently). Automatically picks reasons from an array of strings, randomly. Runs inside a cron-job. The job fires if there are active SSH-sessions on the server after 9pm with his login.&/blockquote&&i&&u&xxx:&/u&&/i&&b&smack-my-bitch-up.sh&/b& - &b&给这贱人一巴掌.sh&/b& - 给他的老婆大人(显然的)发送一条“加班回家晚了”的短信。 随机地自动地从一个字符串的数组中挑选一个原因。在cron-job里运行,只要在晚上九点之后,服务器上有他的SSH活动进程这个任务就会自动运行。&br&&blockquote&xxx: [`kumar-asshole.sh`](&a href=&///?target=https%3A///NARKOZ/hacker-scripts/blob/master/kumar-asshole.sh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hacker-scripts/kumar-asshole.sh at master · NARKOZ/hacker-scripts · GitHub&i class=&icon-external&&&/i&&/a&) - scans the inbox for emails from &Kumar& (a DBA at our clients). Looks for keywords like &help&, &trouble&, &sorry& etc. If keywords are found - the script SSHes into the clients server and rolls back the staging database to the latest backup. Then sends a reply &no worries mate, be careful next time&.&/blockquote&&i&&u&xxx:&/u&&/i&&b&kumar-asshole.sh&/b& - &b&Kumar这个傻X.sh&/b& - 在邮箱里扫描“Kumar& (客户里的一位DBA)的邮件。一旦找到“求助”,“难题”,“抱歉”等字眼,那么这段脚本会自动ssh登录客户的服务器,并且将现在的数据库回滚到上个备份。然后回复:“没关系兄弟,下次当心哦”。&br&&blockquote&xxx: [`hangover.sh`](&a href=&///?target=https%3A///NARKOZ/hacker-scripts/blob/master/hangover.sh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hacker-scripts/hangover.sh at master · NARKOZ/hacker-scripts · GitHub&i class=&icon-external&&&/i&&/a&) - another cron-job that is set to specific dates. Sends automated emails like &not feeling well/gonna work from home& etc. Adds a random &reason& from another predefined array of strings. Fires if there are no interactive sessions on the server at 8:45am.&/blockquote&&i&&u&xxx:&/u&&/i&&b&hangover.sh&/b& - &b&宿醉.sh&/b& - 另外一个cron-job, 设定在某个特定的日子触发。自动发送带有“哎呀今个儿觉得身体欠佳啊 / 今天要在家里工作&等等字样的邮件。再从一个预定义的字符串数组中随机选择“原因”。在早上8:45服务器上没有活动的进程就会触发。&br&&blockquote&xxx: (and the oscar goes to) [`fucking-coffee.sh`](&a href=&///?target=https%3A///NARKOZ/hacker-scripts/blob/master/fucking-coffee.sh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hacker-scripts/fucking-coffee.sh at master · NARKOZ/hacker-scripts · GitHub&i class=&icon-external&&&/i&&/a&) - this one waits exactly 17 seconds (!), then opens an SSH session to our coffee-machine (we had no frikin idea the coffee machine is on the network, runs linux and has SSHD up and running) and sends some weird gibberish to it. Looks binary. Turns out this thing starts brewing a mid-sized half-caf latte and waits another 24 (!) seconds before pouring it into a cup. The timing is exactly how long it takes to walk to the machine from the dudes desk.&/blockquote&&i&&u&xxx:&/u&&/i& (最牛逼来了) &b&fucking-coffee.sh&/b& - &b&卧槽老子要喝咖啡了.sh&/b& - 这个脚本精确地等待17秒,17秒!然后打开一个SSH进程,到。。。我们的咖啡机上(谁tmd知道这台咖啡机是联网的,运行着linux还有一个SSHD服务在运行啊@@)然后发送一串奇怪的字符给这台咖啡机。 瞧这个二进制代码,原来运行以后,这台咖啡机开始煮一杯中等大小的一半低咖的拿铁,然后在倒出咖啡前再精确地等待24秒!这个时间正正好好是这个哥们从办公桌走到咖啡机的时间。&br&&blockquote&xxx: holy sh*t I'm keeping those&/blockquote&&br&什么?你也有同样的需求?用法如下,就不翻译啦~&br&&br&&blockquote&Original: &a href=&///?target=http%3A//bash.im/quote/436725& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Цитата #436725&i class=&icon-external&&&/i&&/a& (in Russian)
&br&Pull requests with other implementations (Python, Perl, Shell, etc) are welcome.&br&&br&Usage&br&&br&You need these environment variables:&br&&br&&div class=&highlight&&&pre&&code class=&language-bash&&&span class=&sb&&```&/span&sh
&span class=&c&&# used in `smack-my-bitch-up` and `hangover` scripts&/span&
&span class=&nv&&TWILIO_ACCOUNT_SID&/span&&span class=&o&&=&/span&ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
&span class=&nv&&TWILIO_AUTH_TOKEN&/span&&span class=&o&&=&/span&yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
&span class=&c&&# used in `kumar_asshole` script&/span&
&span class=&nv&&GMAIL_USERNAME&/span&&span class=&o&&=&/span&admin@example.org
&span class=&nv&&GMAIL_PASSWORD&/span&&span class=&o&&=&/span&password
&span class=&sb&&```&/span&
&/code&&/pre&&/div&&br&&br&For Ruby scripts you need to install gems:&br&&div class=&highlight&&&pre&&code class=&language-bash&&gem install dotenv twilio gmail
&/code&&/pre&&/div&&br&Cron jobs&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&```sh
# Runs `smack-my-bitch-up.sh` daily at 9:20 pm.
20 21 * * * /path/to/scripts/smack-my-bitch-up.sh && /path/to/smack-my-bitch-up.log 2&&1
# Runs `hangover.sh` daily at 8:45 am.
45 8 * * * /path/to/scripts/hangover.sh && /path/to/hangover.log 2&&1
# Runs `kumar-asshole.sh` every 10 minutes.
*/10 * * * * /path/to/scripts/kumar-asshole.sh
# Runs `fucking-coffee.sh` hourly from 9am to 6pm.
0 9-18 * * * /path/to/scripts/fucking-coffee.sh
&/code&&/pre&&/div&&br&---&br&Code is released under WTFPL.&/blockquote&&br&当然。。。还有R, coffee, go, groovy, java, nodeJs, perl, php, powershell, python, scala等多种版本语言实现。&img src=&/afd4baffdaf894c7a53931a48dfeebbf_b.png& data-rawwidth=&982& data-rawheight=&440& class=&origin_image zh-lightbox-thumb& width=&982& data-original=&/afd4baffdaf894c7a53931a48dfeebbf_r.png&&&br&&br&&br&最后。。。赞 License&br&&b&WTFPL = DO What The Fuck you want to Public License&/b&
年度最佳出炉了!github上的2万stars项目: hacker scripts.
究竟是什么样的项目能在超短时间内在github拿到如此多的stars,看看说明文档: Hacker Scripts Based on a _[true story]()_:这是一个基于…
&b&补全&/b&&p&zsh 的命令补全功能非常强大,可以补齐路径,补齐命令,补齐参数等。(请问你记住 tar 的所有参数了吗 ,只要 tar -加 tab 键,再也不用 &a href=&///?target=https%3A//zh.wikipedia.org/zh/RTFM& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&rtfm&i class=&icon-external&&&/i&&/a& 了 )&/p&&img src=&/3e1cc094fa367c931b3e2_b.png& data-rawwidth=&1022& data-rawheight=&760& class=&origin_image zh-lightbox-thumb& width=&1022& data-original=&/3e1cc094fa367c931b3e2_r.png&&&br&&p&按下 tab 键显示出所有待选项后,再按一次 tab 键,即进入选择模式,进入选择模式后,按 tab 切向下一个选项,按 shift+tab 键切向上一个选项,ctrl+f/b/n/p 可以向前后左右切换。&/p&&br&&img src=&/b0d9cd9f9cd3ad6fd7b9f_b.png& data-rawwidth=&1120& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&/b0d9cd9f9cd3ad6fd7b9f_r.png&&&br&&p&&b&kill&/b&&/p&&p&以前杀进程是ps aux | grep xxx查进程的 PID,然后kill PID。有了 zsh,直接kill xxx然后按下 tab 键即可~&/p&&br&&div class=&highlight&&&pre&&code class=&language-bash&&&span class=&nb&&kill &/span&emacs
&span class=&c&&# 按下 tab,变成:&/span&
&span class=&nb&&kill &/span&59683
&/code&&/pre&&/div&&b&&br&&br&别名&/b&&p&zsh 不仅支持普通 alias,还支持针对文件类型的 alias。我配置的文件类型 alias 如下:&/p&&br&&div class=&highlight&&&pre&&code class=&language-bash&&&span class=&nb&&alias&/span& -s &span class=&nv&&gz&/span&&span class=&o&&=&/span&&span class=&s1&&'tar -xzvf'&/span&
&span class=&nb&&alias&/span& -s &span class=&nv&&tgz&/span&&span class=&o&&=&/span&&span class=&s1&&'tar -xzvf'&/span&
&span class=&nb&&alias&/span& -s &span class=&nv&&zip&/span&&span class=&o&&=&/span&&span class=&s1&&'unzip'&/span&
&span class=&nb&&alias&/span& -s &span class=&nv&&bz2&/span&&span class=&o&&=&/span&&span class=&s1&&'tar -xjvf'&/span&
&span class=&nb&&alias&/span& -s &span class=&nv&&php&/span&&span class=&o&&=&/span&vi
&span class=&nb&&alias&/span& -s &span class=&nv&&py&/span&&span class=&o&&=&/span&vi
&span class=&nb&&alias&/span& -s &span class=&nv&&rb&/span&&span class=&o&&=&/span&vi
&span class=&nb&&alias&/span& -s &span class=&nv&&html&/span&&span class=&o&&=&/span&vi
&span class=&nb&&alias &/span&&span class=&nv&&gcid&/span&&span class=&o&&=&/span&&span class=&s2&&&git log | head -1 | awk '{print substr(\$2,1,7)}' | pbcopy&&/span&
&/code&&/pre&&/div&&p&配置完毕之后,在 zsh 下直接输入xxx.rb,将自动用 vi 打开,直接输入xxx.tgz,将直接按照tar -xzvf解压。最后一个gcid将当前 git 项目的第一个 commit 的 id 复制到系统剪切板(pbcopy是 Mac 下的复制到系统剪切板命令,linux 请参考相应的发行版更改),在执行 rebase 的时候特别方便。&/p&&b&&br&&br&跳转&/b&&p&zsh 的目录跳转更为智能,你无需输入cd,直接输入路径即可。..表示后退一级目录,../../表示后退两级,依次类推。(...的作用和../../相同)&/p&&p&输入d,将列出当前 session 访问过的所有目录,再按提示的数字即可进入相应目录。&/p&&br&&div class=&highlight&&&pre&&code class=&language-bash&&~
1 ~/Applications
2 ~/.proxychains
3 /opt/homebrew-cask/Caskroom
~/Applications
&/code&&/pre&&/div&&b&&br&&br&历史记录&/b&&p&zsh 的历史记录跨 session,可以共享。历史记录支持受限查找。比如,输入git,再按向上箭头,会搜索用过的所有 git 命令。&/p&&b&&br&&br&通配符搜索&/b&&p&ls *.png查找当前目录下所有 png 文件,ls **/*.png递归查找。&/p&&br&&br&&p&更多请见 &a href=&///?target=http%3A//wulfric.me/2015/08/zsh/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&一些命令行效率工具&i class=&icon-external&&&/i&&/a&&/p&&br&&p&iterm2 介绍: &a href=&/question//answer/& class=&internal&&iterm2有什么酷功能? - 知乎用户的回答&/a&&/p&
补全zsh 的命令补全功能非常强大,可以补齐路径,补齐命令,补齐参数等。(请问你记住 tar 的所有参数了吗 ,只要 tar -加 tab 键,再也不用
了 ) 按下 tab 键显示出所有待选项后,再按一次 tab 键,即进入选择模式,进入选择模式后,按 tab 切向下一…
&p&我之前在博客上推荐过一些很好的学习材料,感兴趣的同学可以看一看。(&a href=&///?target=http%3A///cn/2013/12/material-of-shell/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&shell脚本学习材料&i class=&icon-external&&&/i&&/a&)。不过,我推荐的学习材料比较全面,难度也不小,所以,这里对推荐的材料进行了精简,以便让新同学学起来更加轻松愉快,提高大家学习shell脚本的积极性。&/p&&br&&p&&i&&u&&b&1.书&/b&&/u&&/i&&/p&&br&&br&&br&&b&linux shell脚本攻略&/b&&br&&br&&img src=&/v2-ab95b660eabe3b52b611fee_b.jpg& data-rawwidth=&318& data-rawheight=&417& class=&content_image& width=&318&&&br&&p&这是我强烈推荐的一本书,我的shell脚本从新手到老手全靠这本书。这本书很薄也精华。这本书追求的不是全,而是精,是各种各样的奇技淫巧,是老手天天用却不会告诉你或者他们也没有意识到的技巧。五颗星推荐。&/p&&p&此外,这本书的作者是一个印度人,二十岁的时侯写下了这本书,那时他已经是Ubuntu 和Fedora的源码贡献者了。&/p&&br&&p&&b&The AWK Programming Language&/b&&/p&&br&&img src=&/v2-11ecca690d3fd8d9458f_b.jpg& data-rawwidth=&300& data-rawheight=&444& class=&content_image& width=&300&&&br&&p&这本书的作者就是AWK程序语言的设计者,所以,其权威性毋庸置疑。值得注意的是,这本书的第二作者 Brian W. Kernighan是神一样的科学家,他是《The C Programming Language》的作者。 Brian W. Kernighan 的《程序设计实践》也是一本好书。&/p&&p&AWK的学习资料网上一搜一大片,其实,只要静下心来把这本书中的代码敲一遍,就可以无视其他所有材料了。 这本书网上有电子版。很奇怪的是,这么好的一本书,国内的出版社怎么没有引入,可能是AWK太老太小众了吧。 总之,学习AWK这是必读的一本书,五颗星推荐。&/p&&br&&b&&i&&u&2.免费电子书&/u&&/i&&/b&&br&&br&&br&&p&&b&sed and awk 101 hacks&/b&&/p&&br&&img src=&/71dd19bcf5b_b.png& data-rawwidth=&256& data-rawheight=&361& class=&content_image& width=&256&&&br&&p&这是一本印度人写的开源免费书籍(印度人好像比较喜欢也有能力干这事),应该算是入门书籍, 不过作者表达能力太强,交代的东西也很多,所以无论老手还是新手,看这本书都会有一定的收获。&/p&&p&此外,该作者还写了另外两本同样有名的开源书籍,即《vim 101 hacks》和《linux 101 hacks》。 这三本书都四颗星推荐。&/p&&br&&b&&i&&u&3.博客 && 网站&/u&&/i&&/b&&br&&br&&br&&p&&b&One-Liners Explained&/b&&/p&&br&&br&&p&除了上面推荐的比较好的书以外,网络上也有一些比较好的博文。比如,大名鼎鼎的One-liners Explained 系列。这个系列共有4篇文章,都是进阶级的,需要较强的功底才能看懂。&/p&&p&这4篇文章是:&/p&&ul&&li&Bash One-Liners Explained&/li&&li&sed One-Liners Explained&/li&&li&awk One-Liners Explained&/li&&li&perl One-Liners Explained&/li&&/ul&&br&&br&&br&&b&&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/b&&br&&img src=&/v2-b51e5c4da00d040afde3dce_b.jpg& data-rawwidth=&330& data-rawheight=&55& class=&content_image& width=&330&&&br&&p&这是一个很有名的网站,专门收集一些很酷很简洁的命令。&/p&&p&例如:当你使用vim编辑一个文档,保存的时侯才提示你没有权限,这个时侯怎么办呢? 如果你知道:w !sudo tee %命令就不用烦恼了,这个牛逼的命令我就是在commandlinefu上学会的, 也是我至今觉得最酷的一个命令。&/p&&br&&ul&&li&Top Ten One-Liners from CommandLineFu Explained One-liners Explained 系列的作者还根据CommandLineFu 写了另外一篇文章,即 &a href=&///?target=http%3A//www.catonmat.net/blog/top-ten-one-liners-from-commandlinefu-explained/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Top Ten One-Liners from CommandLineFu Explained&i class=&icon-external&&&/i&&/a&&/li&&/ul&&br&&br&&br&&b&the unix school(&/b&&b&&a href=&///?target=http%3A///& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/b&&b&)&/b&&br&&br&&br&&p&the unix school是一个印度哥们维护的博客,这个博客专注于linux与shell,最大的特色 是尝试使用不同的方法解决同一个问题,对于开阔视野,拓展思路非常有用。&/p&&p&the unix school 是我最喜欢的博客之一,里面的每一篇博文我都认真看过,强烈推荐。&/p&&br&&p&&b&bash Pitfalls(&/b&&b&&a href=&///?target=http%3A//mywiki.wooledge.org/BashPitfalls& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&BashPitfalls&i class=&icon-external&&&/i&&/a&&/b&&b&)&/b&&/p&&br&&br&&p&Bash Pitfalls文章介绍了40多条日常Bash编程中,老手和新手都容易忽略的错误编程习惯。 每条作者在给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。已经有朋友(网名:团子)将这篇文章翻译成了&a href=&///?target=http%3A///bash-pitfalls-part-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文版&i class=&icon-external&&&/i&&/a&。&/p&&br&&b&&i&&u&4.后记&/u&&/i&&/b&&br&&br&&p&认真学习完这里推荐的资料,就算得上是shell脚本老手了,不过,凡事都是凭兴趣,我相信这篇文章对 shell脚本感兴趣的新手会有很大的帮助。不过,还是要切记,多用多动手才是学习linux和shell的最佳方法。&/p&&br&&p&如果你对Python感兴趣,也可以看看我的这个回答:&a href=&/question/& class=&internal&&怎样才能写出pythonic的代码? - 程序员 - 知乎&/a&&/p&
我之前在博客上推荐过一些很好的学习材料,感兴趣的同学可以看一看。()。不过,我推荐的学习材料比较全面,难度也不小,所以,这里对推荐的材料进行了精简,以便让新同学学起来更加轻松愉快,提高大家学习shell脚本的积极性。 1.书 linux …
&ul&&li&在多数领域开源软件和闭源差距极大,像OpenOffice在MS Office前被虐的渣都不剩,像GIMP在Photoshop面前根本不可能抬的起头。开源软件可能只是在程序员的小圈子软件里面能和闭源的正面竞争,而且多数在技术上也并不占优。&/li&&li&千万不要低估微软,千万不要低估Adobe,千万不要低估甲骨文……多数开源社区也就是聚拢了一帮比较不错的天才,但是不要忘了多数的天才都是在这些闭源软件公司全职写代码,精力上的投入一目了然。&/li&&li&在多数领域领头的开源软件都是比闭源软件要晚出来很多很多年的,所以借鉴是必然的,而且多数用户层面的开源软件本质就是为了解决不想花钱买软件这个需求。&/li&&li&&b&大量开源软件其实都是大家认为的闭源软件公司的广告而已。&/b&&/li&&/ul&&b&================================================================&/b&&br&软件是一个很大的范畴,不只是操作系统,不只是开发工具,还有办公软件、游戏、行业软件、实验室软件等等。在多数领域的精品软件基本都是商业产品,也就是基本都是闭源的,这个世界上毕竟绝大多数的人都是追名逐利的,这也是无可厚非的。&br&Linux不代表软件,Git也不代表软件,他们都只是在软件世界里面一个小分类的佼佼者。但并不代表整个生态系统里面所有的节点都能够做到这个高度,而且事实上他们的高度可能并没有想象中的那么高。&br&最后对于开源软件有个事情必须要明白,很多开源软件为了规避专利问题,也规避掉了最优的方案。&br&&b&================================================================&/b&&br&陈皓的观点第一条我是赞同的,商业公司做的好是正常的,尤其我们都能看到在游戏和行业软件两个很重(zhuan)要(qian)的软件分类里面现在甚至是没有开源软件的事情。真正的开源软件辉煌的场所还都是在程序员自己的圈子里。&br&第二条我不是很赞同,所以我前面用的是「借鉴」而不是「抄袭」,我觉得现在这种程度完全谈不上抄袭。&br&另外我特地加粗的那行是要说,很多公司提供的开源软件,本质还是为了自己的商业目的服务,这类软件质量很高,像Chrome,只是可惜太少了。
在多数领域开源软件和闭源差距极大,像OpenOffice在MS Office前被虐的渣都不剩,像GIMP在Photoshop面前根本不可能抬的起头。开源软件可能只是在程序员的小圈子软件里面能和闭源的正面竞争,而且多数在技术上也并不占优。千万不要低估微软,千万不要低估Adob…
&p&远远没达到&/p&&p&我给你讲 用户体验 要么整用户 要么整开发者&/p&&p&Mac照死了整开发者 用户就比较开心&/p&&p&Windows整天吓唬开发者 但开发者不怎么鸟 用户不算很开心 但人数一多就被稀释了 一千万人觉得生活条件差的想自杀 十亿大家就安分了&/p&&p&Linux默认没有用户 所有人都是开发者&/p&
远远没达到我给你讲 用户体验 要么整用户 要么整开发者Mac照死了整开发者 用户就比较开心Windows整天吓唬开发者 但开发者不怎么鸟 用户不算很开心 但人数一多就被稀释了 一千万人觉得生活条件差的想自杀 十亿大家就安分了Linux默认没有用户 所有人都是开发者
日常工作,很多工作都是很琐碎 很细节的,你想不到你会遇到什么具体的小任务。&br&这时,你总不能打开vim 写个python脚本。&br&很可能还没写完#! ,shell 可能已经搞定了任务了。&br&&br&所以会shell,熟练掌握各种命令,会sed awk,给日常工作带来很大的效率提升。&br&相信每一个Linux下的讨饭吃的程序员都深有体会。&br&&br&琐碎任务一次性的任务交给
注定要扩展,代码量不小,要维护的任务交给python.&br&需要效率的工作交给C。从来就不冲突。
日常工作,很多工作都是很琐碎 很细节的,你想不到你会遇到什么具体的小任务。 这时,你总不能打开vim 写个python脚本。 很可能还没写完#! ,shell 可能已经搞定了任务了。 所以会shell,熟练掌握各种命令,会sed awk,给日常工作带来很大的效率提升。 相…
&p&可以转载,注明出处。&/p&&p&&a href=&///?target=http%3A//shanker./5036& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&使用zsh的十大优点&i class=&icon-external&&&/i&&/a&&br&&/p&有朋友留言说不完全兼容,查了一下,优点1改为如下,如果还有补充等我以后实践中在来完善。&br&&br&&p&优点1:&/p&&p&如果你的bash脚本开头是以!#/bin/bash的话,在zsh下还是完全兼容bash的,之前bash下的使用习惯可以完全兼容。&/p&&br&&p&优点2:&/p&&p&更强大的tab补全,当你切换目录敲两下tab,他可以列出当前目录下面的所有目录,并且可以使用键盘上下左右键来选择要进入的目录。&/p&&br&&img src=&/889858fcc59dd6fe978f099dff60bb87_b.png& data-rawwidth=&448& data-rawheight=&159& class=&origin_image zh-lightbox-thumb& width=&448& data-original=&/889858fcc59dd6fe978f099dff60bb87_r.png&&&br&&br&&p&优点3:&/p&&p&更智能的切换目录,比如你要进入一个很深的目录,like this /var/log/nginx/error/lastyear/may/first/monday, 用zsh可以这样输入cd /v/l/n/e/l/m/f/m,然后按tab即可补全整个路径。或者你实现知道当前目录名称,可以直接输入目录,即可进去目录。bash下cd - 可以切换到刚才进入的目录,在zsh下可以记录最近进去过的10个目录,只需要输入d,然后看到对应的0-9的目录,输入对应的数字,即可进入对应的目录(感谢 &a data-hash=&d818ae617a657e53a93dd2b& href=&///people/d818ae617a657e53a93dd2b& class=&member_mention& data-hovercard=&p$b$d818ae617a657e53a93dd2b&&@JayXon&/a& 的提示)。或者直接输入cd -然他后TAB一下,你会发现有最近使用过的31个目录等候你选择。 &/p&&br&&img src=&/7a151eea007d2ba78d071a7_b.png& data-rawwidth=&476& data-rawheight=&205& class=&origin_image zh-lightbox-thumb& width=&476& data-original=&/7a151eea007d2ba78d071a7_r.png&&&br&&img src=&/cc93bc1d6a553d39ecf5882_b.png& data-rawwidth=&331& data-rawheight=&342& class=&content_image& width=&331&&&br&&img src=&/3a7e57a1c81e53f0faeaad_b.png& data-rawwidth=&435& data-rawheight=&629& class=&origin_image zh-lightbox-thumb& width=&435& data-original=&/3a7e57a1c81e53f0faeaad_r.png&&&br&&br&&br&&p&优点4:&/p&&p&命令选项补齐,比如输入docker,然后按tab,即可显示出docker都有哪些命令选项。&/p&&br&&img src=&/6aa78fd011bd91c11425ecbb14b6cd57_b.png& data-rawwidth=&752& data-rawheight=&459& class=&origin_image zh-lightbox-thumb& width=&752& data-original=&/6aa78fd011bd91c11425ecbb14b6cd57_r.png&&&br&&p&优点5:&/p&&p&命令参数补齐,比如要kill一个进程,直接输入kill 进程名,会自动显示出进程的process id,&/p&&p&如果用ssh,则会输出最近用ssh 连接过的主机名,配合.zshrc还可以实现自定义ping命令自动补齐的命令参数。&/p&&p&zstyle ':completion:*:ping:*' hosts 192.168.1.{1,50,51,100,101} &a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&&i class=&icon-external&&&/i&&/a&&/p&&br&&img src=&/20a060d0cbaa19d2f0013a_b.png& data-rawwidth=&564& data-rawheight=&317& class=&origin_image zh-lightbox-thumb& width=&564& data-original=&/20a060d0cbaa19d2f0013a_r.png&&&br&&p&优点6:&/p&&p&大小写字母自动更正,比如我们要cat一下README.txt,直接输入cat readme.txt TAB,之后zsh就会把小写的readme改成大写的。这个功能很好用哦。&/p&&br&&br&&p&优点7:&/p&&p&有着丰富多彩的主题,如果你使用我的脚本安装oh-my-zsh的项目的话,在~/.oh-my-zsh/themes里会找到多达142个主题,看中哪个主题直接在~/.zshrc 里面更改:&/p&&br&1&br&ZSH_THEME=&ys&&br&&p&想要看其他的主题,可以看官网的这个地址:&/p&&p&&a href=&///?target=https%3A///robbyrussell/oh-my-zsh/wiki/External-themes& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&External themes · robbyrussell/oh-my-zsh Wiki · GitHub&i class=&icon-external&&&/i&&/a&&/p&&p&或者知乎上的这个讨论地址:&/p&&p&&a href=&/question/& class=&internal&&oh my zsh 哪些主题比较好看、有特点? - 编程&/a&&/p&&p&然后我用的是这个主题:&/p&&img src=&/3c2fe415e19ae2a70f208b7ccb091573_b.png& data-rawwidth=&443& data-rawheight=&163& class=&origin_image zh-lightbox-thumb& width=&443& data-original=&/3c2fe415e19ae2a70f208b7ccb091573_r.png&&&br&&br&&p&优点8:&/p&&p&更强大的alias命令,比如下面命令,当你在zsh环境下输入hello.py即可直接用vim打开文件编辑,一个tgz的文件即可自动解压缩。&/p&&br&alias -s py=vim&br&alias -s html=vim&br&alias -s tgz='tar zxvf'&br&&br&&p&优点9:&/p&&p&智能命令错误纠正,比如输入apt-gte install somefile,回车后,zsh会提示你是否纠正apt-gte 为apt-get?输入y,后即是正确命令执行。在配合一下zshrc的profile的sudo命令设置,按两下ESC,即可在命令的前面自动加上sudo。&/p&&br&&br&##在命令前插入 sudo {{{&br&#定义功能&br&sudo-command-line() {&br&[[ -z $BUFFER ]] && zle up-history&br&[[ $BUFFER != sudo\ * ]] && BUFFER=&sudo $BUFFER&&br&zle end-of-line
#光标移动到行末&br&}&br&zle -N sudo-command-line&br&#定义快捷键为: [Esc] [Esc]&br&bindkey &\e\e& sudo-command-line&br&#}}}&br&&br&&img src=&/41aade0b0bed6_b.png& data-rawwidth=&558& data-rawheight=&262& class=&origin_image zh-lightbox-thumb& width=&558& data-original=&/41aade0b0bed6_r.png&&&br&&br&&p&优点10:&/p&&p&最最强大的优点是可以集成各种类型的插件,比如切换目录的可以继承autojump,想跳转到哪里,直接j 加目录名称,真的非常强大,非常便利,这个bash也可以使用。比如想要去nginx目录,可以直接输入j nginx,他会搜索使用率最高的nginx的路径,如果想要去/var/log/下的nginx呢,直接输入j v ng,效果如下:&br&&/p&&img src=&/25d84e19b878c87ab93bb9d6_b.png& data-rawwidth=&343& data-rawheight=&180& class=&content_image& width=&343&&&br&&p&在比如git插件,当你在一个git 仓库的时候你的zsh PS1是这样显示的,&/p&&img src=&/8a6e79de9b48d9e46f8e_b.png& data-rawwidth=&404& data-rawheight=&42& class=&content_image& width=&404&&&br&&p&会面会跟git 是master 还是 branch,然后的o 表示当前没有modify,也是最新的,比如我们更改一个文件,立马变成如下:&/p&&img src=&/48dfd4aeb_b.png& data-rawwidth=&403& data-rawheight=&54& class=&content_image& width=&403&&&br&&p&后面的o变成了x,代表你的本地仓库有更新。&/p&&p&在比如说你在你的仓库里新添加了几个文件,当你使用git add的时候多按几次TAB,你的新添加的文件就都补上了。&/p&&br&&p&还有一个比较厉害的插件是history-substring-search, 强大到令人发指,首先你输入的每条命令他会给你记录下时间,并且在你的home目录创建.zsh_history/相对应的目录,并记录你在当前目录下用过的命令。&br&&/p&&p&比如输入ansible,按上下箭头,即可搜索之前使用过的包括ansible的命令,而且是完全匹配,怎么说呢,就是比如说输入“ansi” 他就会匹配命令当中包含“ansi”的,如果输入“ansible all” 他就会匹配完全包含“ansible all”的命令,强大的地方在于当你输入ansible 上箭头比如找到这条命令ansible all -m shell -a 'update',你可以左右光标符到m,然后上下翻命令,这时候搜索的就是&ansible all -&。也可以用histall | grep ansible的方式:&/p&&img src=&/bbe074dd070aa8b3fdb38ada5eb078fb_b.png& data-rawwidth=&652& data-rawheight=&572& class=&origin_image zh-lightbox-thumb& width=&652& data-original=&/bbe074dd070aa8b3fdb38ada5eb078fb_r.png&&&br&&p&zsh还有很多强大的plugin值得去研究一下,比如集成docker的,aws的,go,python等等。还有大部分不习惯centos7的systemctl命令的,有个systemd的插件值得一用。&/p&&br&# root at shanker in ~/.oh-my-zsh/plugins/systemd on git:master o [7:17:36]&br&# less systemd.plugin.zsh &br&user_commands=(&br&
list-units is-active status show help list-unit-files&br&
is-enabled list-jobs show-environment cat)&br&sudo_commands=(&br&
start stop reload restart try-restart isolate kill&br&
reset-failed enable disable reenable preset mask unmask&br&
link load cancel set-environment unset-environment&br&
edit)&br&for c in $user_ alias sc-$c=&systemctl $c&; done&br&for c in $sudo_ alias sc-$c=&sudo systemctl $c&; done&br&alias sc-enable-now=&sc-enable --now&&br&alias sc-disable-now=&sc-disable --now&&br&alias sc-mask-now=&sc-mask --now&&br&&br&&p&如果大家觉得好用,可以用我写的自动化安装脚本,只支持centos like和ubuntu like系统哦。&/p&&p&&a href=&///?target=https%3A///sangrealest/shell/blob/master/init_zsh.sh& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&shell/init_zsh.sh at master · sangrealest/shell · GitHub&i class=&icon-external&&&/i&&/a&&/p&&p&或者参考这篇文章:&/p&&p&&a href=&///?target=http%3A//shanker./7213& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Oh-My-Zsh的自动安装和功能集成&i class=&icon-external&&&/i&&/a&&/p&
可以转载,注明出处。 有朋友留言说不完全兼容,查了一下,优点1改为如下,如果还有补充等我以后实践中在来完善。 优点1:如果你的bash脚本开头是以!#/bin/bash的话,在zsh下还是完全兼容bash的,之前bash下的使用习惯可以完全兼容。 优点…
Linux 练级攻略:&br&1.掌握至少50个以上的常用命令。&br&2.熟悉Gnome/KDE等X-windows桌面环境操作。&br&3.掌握.tgz、.rpm等软件包的常用安装方法。&br&4.学习添加外设,安装设备驱动程序(比如网卡)。&br&5.熟悉Grub/Lilo引导器及简单的修复操作。&br&6.熟悉Linux文件系统和目录结构。&br&7.掌握vi,gcc,gdb等常用编辑器,编译器,调试器。&br&8.理解shell别名、管道、I/O重定向、输入和输出以及shell脚本编程。&br&9.学习Linux环境下的组网。&br&10. 学习Linux环境下的集群/内核。&br&&br&这只是针对Linux,学好的定义请楼主自行判断。我来说一下我的理解(学好linux的理解)&br&1. 掌握常用命令(包括grep、awk、sed、ps、find等等吧,熟练使用,基础的选项不用man)&br&2. 第二项不解释&br&3. 毫无压力的安装tgz,deb以及rpm包,这是基础,学好的话理解rpm或是deb包的原理,不是很难的事情&br&4. 装驱动,同上一条,主要也就是解决问题吧&br&5. 这个在你先装了linux,后来又装windows的时候就会遇到。了解下grub的代码,也还好,网上讲解的比较多&

我要回帖

更多关于 linux运行android程序 的文章

 

随机推荐