2011, 完全用 GNU/Linux 工作

感谢坐井观天 的原创投递
首先,请允许我依然把王垠称之为学长,虽然他选择了一条完全不同的道路。(顺便提一句,现在他在国外做编译器理论方面的研究,希望他做的是自己真正喜欢的 事)他创作的长篇文章《完全用 GNU/Linux 工作》,洋洋两万多字,从不同角度居高临下的阐述了他眼中 Linux 较之于 Windows 的各种优点,这篇文章并不简单的是一篇论述 “ Windows 能做的事 Linux 都能做” 这样的文章。文章中通篇洋溢着一个计算机应用和计算机教育体系的人的万丈豪情,尽管可能偏激,但不乏详细的推理论述。

不得不说,学长的很多想法,在近几年开源被越来越多的人所认识和了解的过程中,得到了证实。而另一方面,随着互联网的飞速发展, GNU/Linux 又迸发出了新的活力。以下的部分,就借用学长文章的小标题,从学长这篇文章之后的几年中展开。

  1 “UNIX 是简单的,你不需要成为天才也能理解这种简单。”

   学长在这里说的是什么问题呢?很简单,大多数 Linux 用户把 Linux 作为一个玩具来使用,而不是一个代表先进生产力的工具。很不幸的就是,时至如今,依然如此,而且一系列发行版带来的图形化,傻瓜化的浪潮几乎把所有的新用 户卷进了这个漩涡。我身边的同学,凡是到大学后接触 Linux 的,往往使用 Linux 的唯一原因就是 Linux 有很酷的 3D 桌面,或者别人看到你在用 Linux 上网听歌的时候觉得你是一个勇于接受新鲜事物的人。一旦要真正做点事情,还是一边骂着微软的独断专横,一边默默地重启,等待 Windows 7 的四片叶子转啊转,然后挂上飞信,打开 QQ,启动迅雷,最小化,然后开 Word 写写东西,开 PowerPoint 看看课件什么的。

   并不是说这样不好。事实上,苹果的成功大致也可以归结于此。但是 Linux 少了折腾,还是 Linux 吗?归根结底,什么系统从现在看来并不是那么重要,Chromium OS 甚至要用浏览器颠覆整个操作系统的功能。而 Linux 上的开源软件,UNIX 的简单哲学,却成了更加重要的东西。举个例子来说。作为一个计算机系的同学,当你需要批量重命名很多文件的时候,是满世界的去找无数款不知好不好用的软件 呢,还是自己动手写个小脚本来解决问题呢?按照 Larry Wall 所讲的程序员的美德——懒,不耐烦,狂妄自大,那答案一定就是后者,省时省力,又不怕病毒,正则表达式抑或信息提取,都不是什么问题。可是事实上那么多人 还是选择前者,还把这个 Windows 下的习惯自然而然带到了 Linux 里面来。再比如 PDF 文件合并分割等等,明明 Ghostscript 一行命令的事情,就是有那么多人愿意特意下载一个小工具,小软件,哪怕这个软件唯一的功能就是后台调用 Ghostscript。不用说 Windows,就是 Linux 下这样的小工具也开始泛滥了。

  但是也可以看到一些同学不满足于 此,并且开始尝试去理解 Linux。可惜这些同学往往过得比较纠结。虽然 Linux 往往是高效的,简单的,但是那么多“友好”的发行版是不是依然简单就是一个问题了。本来 Linux 的机制足够简单,修改一下 /etc/fstab 实现自动挂载,在 HAL 配置里写几行就可以挂载 USB ,想换个显卡驱动就直接修改 /etc/X11/xorg.conf ,想设置启动项就调调 runlevel 设置,想看看内核模块就直奔 /etc/modules。但是“友好”的发行版里面一切都没这么简单。为了迎合图形化的配置方式,所有这些都是自动生成的,要么是空空的,要么是复杂到 让人无从下手的,总之让你想动也动不了,让用户永远做小白。这里不点名批评一个用的人很多的发行版,因为不管用几年还是搞不懂 Linux 是怎么跑的。“Make Easy Things Easy While Hard Things Possible”,前者做得越来越好是应该的,但是让人易用难懂,就又回到 Microsoft 的老路上去了。

  2 微软的地位

   自从有了 Apple 和 Google,这两年喷微软的人越来越少了。人们总是倾向于同情弱者,而且王者不再的时候大家就能念起他的好。学长写那篇文章的时候,微软把开源作为自己 最大的敌人(比尔大叔是这么说的),但是现在俨然换成了苹果。和苹果一比,微软就成了一个比较开放的公司。至少人家产业链开放,API 开放,苹果倒是好,连 Flash 都不让用,脚本语言都不让写了。眼看 IE 的份额被开源浏览器一点点吃掉,卖终端卖软件的收入来源在互联网时代又不是那么靠得住,必应搜索又起色不大,不知道退休的比尔大叔还能不能坐的住。

   反过来讲,微软也不是开源的最大敌人了。很多开源软件现在都有 Windows 版本,而网络应用的出现把很多依赖 Windows 的软件跨平台化了。之前,我们还在抱怨为什么 QQ 没有 Linux 版,飞信没有 Linux 版,什么什么没有 Linux 版。我们在抱怨 Windows 平台的开发环境怎么怎么不好。现在 Web QQ,云输入法非常方便,Vim & Emacs 的 Windows 版也用着感觉还不错。想想自己有很长一段时间,当开机出现操作系统选单的时候,真的是随机地开一个来用。反正浏览器是一样的,编译器是一样的,写文档用的 TeX 都没啥区别。在这种情况下,开源也真的不屑于和微软较劲了。

  现在真正的问题是苹果,正如当年咄咄逼人的微软。当软件和硬件被 结合起来,制造商帮助用户做出每一个选择的时候,我们仿佛看到了一个更为强大的“微软”的幽灵。如果你想知道 Linux 世界对此的反应,看看 Linus Torvalds pans Apple with ‘utter crap’ putdown。但是未来怎样就不知道了,螳螂补蝉黄雀在后,会不会是 Google 的云计算一统天下?那时的软件会不会重现 UNIX 大型机时代的辉煌吗?那时的我们有多少自由?这些都不是我们现在可以回答的问题。

  3 Windows 笼罩下的中国计算机教育

   只能说,习惯和体制化的力量依然非常大。大学依然在这么教,学生依然要这么学。没办法,开源软件罕有中文文档,所有资料难成体系,大家都是业余很热情, 真正普及起来有难度。但是我能非常高兴地看到,至少在清华大学,很多课程对开源软件已经是非常友好了。虽然 Windows 下的参考资料较多,有些官方的课件也只有 Windows 下的范例,但是一般也会鼓励有兴趣的同学用 Linux 来完成大作业和大实验,反正至少不会限制基于 Linux 的解决方案。理论中心的很多课程作业都鼓励使用 LaTeX 排版来做,其他作业也大多可以用 PDF 格式上交,程序与工程可以用 VC 的 project,也可以用 makefile 和 GCC 工具。网络登录现在有了网页版,信息门户现在同时支持 IE 和 Firefox。不得不说,所有这些,都是非常有益的尝试。

  上面我批评过的那个发行版,这里需要表扬。以前 Linux 用户有一种单打独斗的中世纪英雄的感觉,出了问题就要求每个人都能和黑客一样一眼看穿。现在拜这个发行版所赐,有什么问题大家一起解决一下也成了惯例,宣传力度也上去了。这才是开源的力量。

  4 Linux,中文与国际化

  写到这里觉得没有必要按照学长的思路继续了。关于 Linux 可以做什么,不适合做什么,那篇文章中的东西完全适合现在拿来看——这就是经典的魅力。但是对于我们来说,还有一个重要的东西原文没有涉及,那就是中文与国际化。
Unicode (常用的是 UTF-8 编码方式)正在逐渐淘汰掉 GBK 时代的那些老软件。Windows 一再地强调本地化,但现在,更重要的变成了国际化。无疑 Linux 在这方面做的非常之好。GNU 几乎所有的软件都有国际化支持,这得益于代码贡献者遍及全世界的优势。GTK+ 和 Cairo 的成熟,发行版开发者对全球用户的重视,使得现在多语言基本已经不再是问题。记得几年之前,安装好 Linux 最大的一件麻烦事就是配置中文支持。又要装字体,又要设地区,想让文件名不乱码还必须手动更改一堆参数,即使这么折腾下来 Adobe 的没点阵的宋体还是看得人各种不舒服,而且时常有基于 X 的应用程序动不动就乱码。而现在最重要的突破就是文泉驿正黑(独立开发)和微米黑(基于 Droid 字体),基本上把 Linux 的中文显示质量提高到了超越 Windows XP,达到 Windows 7,直追 Mac OS X 的水平。很明显的一个变化,之前各大论坛求宋体美化 fonts.conf 文件的人络绎不绝,现在已经很少有人用了。

  回头说说 TeX。TeX 的 CJK 宏包有大量的 Dirty Hack,现在更好的解决方法是 XeTeX,直接调用 Linux 系统的 fontconfig,可以使用 TrueType 和 Type1 字体,从而用轻量级的 XeCJK 宏包解决了中文字体和标点微排版的问题。由于用了 Linux/X11 的 fontconfig,所以在 Linux 下用就成了原生支持,效果很好。同样,喜欢 GUI 也没有错。用 LyX,一样能感受到所见即所得的好处,数学公式的即时显示,让看着屏幕想数学题也成为了可能,日常写点东西比 Word 方便,而且更加严谨。学长提到的 ConTeXt 也是个好东西,适合喜欢折腾的人来用。这个的好处就是可以像 HTML 的 CGI 一样,用脚本语言来“写”文档,这是 Word 之类的字处理软件所不能企及的。可惜的是这么多年 ConTeXt 没有一个像 XeCJK 这么专业的包来处理中文,否则的话一定更受欢迎。

  5 附录——最近出现的好用的 Linux 程序

  学长的文章附录中给出了一些好的工具,但并不是全部。现在来看,对比几年之前,很多工具都逐渐从新生走向了成熟。这是一件好事,因为我们有了更多的选择。

  GUI 编辑器:Gedit, Geany, Scite.
绘图工具:Asymptote(矢量图), Gnuplot(统计图), Geogebra(几何图), Google 绘图(流程图)
特别推荐 Google 绘图,好处是容易上手,用来做点不那么正式的东西非常方便。
ftp 客户端:gftp
自动下载工具:aria2(可以多线程,支持多服务器)
桌面环境:Xfce 和 LXDE 两个轻量级的桌面环境。
功能日臻完善,但是保持了必要的简洁和适度的可定制性。既没有 Gnome 或 KDE 那么多用不到的附件,又不像 FVWM 和 Openbox 一样欺负懒人。大多数人应该会不难上手吧。
中文输入:轻量级的小企鹅输入法,终于又开始更新了。云输入法及其客户端,值得期待。
浏览器:Firefox, Chrome, Opera. 现在只有在很旧的工作站上能看到 Mozilla。
PDF & Flash:Google Chrome 自带,其实够用。
BBS:Qterm 居然也一直在更新。
英汉字典,Email 客户端,QQ 客户端,甚至放音乐(谷歌音乐,支持正版)都变成网页版了。
看 Word 文档:上传到 Google Docs。如果嫌麻烦,写几行,DIY 一个 handler 出来就行。

  6 后记

   用 Linux + XeTeX + LyX 写完了这点东西。再次向王垠学长致敬。可能很多东西,这里的理解不够深刻,毕竟只是一个用户的所谓“感觉”而已,也不免掺杂了自己的主观感受。如果这点东 西能让更多的人关注 Linux,更多的人去理解 Linux,作者也就感激不尽了。

  在Linux系统的/etc目录下有这样一个文件passwd,该文件里包含系统中所有用户信息的记录,记录里包含每个用户的如下信息:用户名、密码、用户ID、组ID、用户全名、用户主目录和用户登录所用的shell。请设计一个脚本(shell)程序能实现增加、删除、查找和显示特定用户信息的功能。你们可以通过创建一些UNIX/LINUX shell 脚本文件来满足以上需求。   可以用任意一个文本编辑器打开passwd文件,该文件里包含用冒号分隔开的字段组成的记录,如下所示:   root:x:0:0:root:/root:/bin/bash   zxj:x:500:500:zxj303:/home/zxj:/bin/bash    .    .    .   在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能: 在屏幕上显示当前所有用户的记录 在屏幕上显示当前所有用户(经过格式化和排序的)的记录 只在屏幕上显示用户名和用户ID 只在屏幕上显示(经过格式化和排序的)用户名和用户ID 查询并显示特定用户的记录 往passwd文件里增加新的用户记录 从passwd文件里删除某个用户记录   你可以使用UNIX/LINUX中一些比较简单的命令或命令组合来执行1、2、3、4、5的任务。对于任务6和7,你需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在你的主脚本menu文件中调用这些脚本文件。   可能你还需要查询一些Unix/Linux命令,比如awk,、sort、tr、cut、paste、sed、grep;你也可能还需要查询其他的Unix/Linux命令。   建议你在主目录下建立一个以 xx xx xx(xx xx xx为学号)命名的目录,并且在本次作业中使用它作为工作目录。 主脚本文件中的菜单   在menu脚本文件里将创建如下菜单,菜单里包含供用户选择的一些操作。 用户信息主菜单 打印当前所有记录 打印当前所有记录(格式化后的) 打印用户名和用户ID 打印(格式化了的)用户名和用户ID 查询特定记录 增加新记录 删除记录 Q——退出 你的选择是:(等待用户输入)   当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。你必须用while循环和case条件语句配合来完成此操作。另外在显示主菜单前必须先清除用户屏幕。在以下所有步骤中,当显示主菜单前都需要先清屏。   在menu脚本文件的前面部分你首先要定义三个变量,这三个变量分别存放passwd、add、delete文件的文件名,并且能在所有涉及到passwd、add、delete文件的语句中使用他们。 比如,可以定义成:           record_file=passwd   在所有访问passwd文件的语句中,只要使用 $record_file 即可。这样做的一个优点就是,如果以后你需要重新命名记录或者需要在不同的记录文件中使用你的脚本的话,你只需要修改以上一个语句而不须在所有有关的记录文件里逐一修改语句。如下定义另外两个变量:   add_file=add   delete_file=delete   定义以上变量之后,你必须核对menu脚本文件,看看所需的文件(passwd、add、delete)是否准确存放在当前目录下。如果其中任何一个不存在,你的脚本menu文件就必须显示以下信息,然后退出:   Required file theMissingFile does not exist.(所需文件不存在)   比如,如果passwd文件不存在,就显示“Required file passwd does not exist.(所需文件记录不存在)”然后退出。   在以上等待用户做出选择的菜单中,如果用户偶尔输入了一个代码而不是1、2、3、4、5、6、7或Q,就有信息提示“无效的代码,请按回车键继续``````”(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。可以允许用户使用Q或q退出。   在以上等待用户做出选择的菜单中,如果用户简单地按了回车键(而不是输代码)的话,就会出现信息“Selection not entered. Press Enter to continue…"(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。   当用户选择了第一项——打印当前所有用户记录   以下是当用户在主菜单中选择第一个选项后,menu脚本文件输出的内容的例子:    (此处是主菜单—略) 你的选择:1(用户输入) root x 0 0 root /root /bin/bash zxj x 500 500 zxj303 /home/zxj /bin/bash . . . . 按回车键继续。。。(等用户按回车键。按后要再次显示主菜单) (注:以上输出内容与passwd文件不同之处在于:空格键代替了所有的冒号。你需要找找哪些Linux命令会这样做。)   当用户选择第二项时——打印当前经过格式化的用户记录后,   以下是当用户在主菜单中选择第二个选项后,menu脚本文件输出的例子:    (此处是主菜单—略) 你的选择:2(用户输入) root x 0 0 root /root /bin/bash zxj x 500 500 zxj303 /home/zxj /bin/bash . . . . 按回车键继续。。。(等用户按回车键。按后再次显示主菜单) (说明:以上格式输出是按用户名排序的。每列应该左对齐。)   当用户选择3时,——打印用户名和用户ID   以下是当用户在主菜单中选择第三个选项后在脚本菜单输出的内容的例子:    (此处是主菜单—略)   你的选择:3(用户输入)   root,0   zxj,500    .    .    .    . 按回车键继续。。。(等用户按回车键。按后再次显示主菜单) (注意 以上输出与passwd文件内容之间的不同之处。冒号已被逗号代替。每个表目[记录]只有显示姓名和电话号码。)   当用户选择4时,——打印(格式化的)用户名和用户ID      以下是当用户在主菜单中选择第四个选项后在脚本菜单输出的内容的例子: (此处是主菜单—略)   你的选择:4(用户输入)   root 0   zxj 500       .    .    . 按回车键继续。。。(等用户按回车键。按后再次显示主菜单)   当用户选择5时,——查找特定的记录   以下是当用户在主菜单中选择第五个选项后在脚本菜单输出的内容的例子:   (此处是主菜单—略)   你的选择:5(用户输入)   输入关键字:Jones (用户输入)   Jones:x:600:600:Jones Sarah:/home/Jones:/bin/sh    按回车键继续。。。(等用户按回车键。按后再次显示主菜单)   如果输入的关键字不在记录里,则必须输出相关信息,示例如下: (此处是主菜单—略) 你的选择是:5(用户输入) 输入关键字:Monks (用户输入) 没有找到Monks 按回车键继续。。。(等用户敲回车键。之后再次跳出主菜单)   如果用户简单地按回车键而不是输入关键字,就要产生以下输出:    (此处是主菜单) 你的选择是:5(用户输入) 输入关键字:(用户简单地按回车键没有输入任何东西,即没有键入关键字) 没有输入关键字 输入关键字:(仍然等待用户的输入)   可以允许输入的关键字不区分大小写(例如JONE和jone的输出结果是一样的) 你的add脚本文件   当用户在主菜单里选择6时你的add脚本文件就要被调用,以下是增加功能的输出示例:    (此处是主菜单—略) 你的选择是:6 (先清屏)             用户信息增加情况 输入新用户的具体情况 用户名: 密码: 确认密码: 用户ID: 组ID: 用户全名: 用户主目录: 登录shell:   你的脚本文件必须能使用户输入一个有效的用户ID(数字、一般非超级用户的ID大等于500)。你的脚本文件必须能够识别用户输入的ID。 如果用户只是简单的按回车键,就要输出以下内容: 用户ID(xxxx):(由用户简单的按回车) 没有键入ID 用户ID:(xxxx):(等待用户输入一个有效的ID) 如果用户输入的是一个无效的ID或者是不符合格式的ID,就要输出以下信息: 用户ID:(xxxx): abc123 (用户输入) 无效ID 用户ID:(xxxx): (等待用户输入一个有效的ID) 对组ID的要求类似与用户ID 用户名:Warren (用户输入)   一个有效的用户名必须只含字母和数字。类似以上所说的,如果用户输入一个无效的用户名,就应该显示这样的信息:“用户名只包含字母和数字”,并且提示用户再次输入姓。如果用户只按回车没有输入的话,则显示信息:“没有输入用户名”,并提示用户再次输入姓。 密码:****** (用户输入)   输入密码时不显示或显示*,要求密码长度至少达到6位以上、且由大小写字母、数字和控制字符组成;确认密码如果与密码不符应该让用户重新输入。 主目录:Todd(非用户输入,但要根据用户名正确显示)   一个有效的主目录名必须根据用户名在/home目录下正确地添加,要求能在passwd文件中的相应记录上自动添加主目录名,还要在/home 目录下自动建立该名字的目录(可以暂不做)。 登录shell:bash(用户输入)   一个有效的shell必须只能是bash、sh、kash、csh中的一种。如果用户输入一个无效的shell名,就会显示这样的信息:“输入的shell名不在本系统范围内!”,并且提示用户再次输入。如果用户只按回车没有输入的话,则显示信息:“没有输入!”,并提示用户再次输入shell名。 保存记录 (此信息只在成功增加新记录之后才显示,如果新的记录没有成功增加则不能显示次信息。在后面的例子里,用把内容添加到已存在文件上的UNIX命令显示一个标准的错误信息)。 再增加一个吗?(是)或(否):是(用户输入) (以上过程从“首先清理用户屏幕”开始,然后重复。   然而,如果用户输入了N,增加记录操作就要退出,然后显示主菜单,以便用户能做其他选择,(比如,现在用户可能想要浏览记录文件中的内容以便确认新记录是否已经添加进文件。)   如果用户偶然打进一个代码而非Y或N,就会退出增加记录操作并显示主菜单。   在add脚本文件的开始,你必须定义一个变量,这个变量存放passwd文件的文件名,并且能在所有涉及到passwd文件的语句中使用它。 在你的shell程序全部完成后你可以自己编三条记录添加到passwd文件中。 你的delete脚本文件    当用户在主菜单中选择7时,你的delete脚本文件必须被调用。下面是示例:    (主菜单如下) 你的选择:7(用户输入) (先清屏)删除用户记录 输入用户ID(xxxx): 500(用户输入) zxj:x:500:500:zxj303:/home/zxj:/bin/bash   你的delete脚本必须要求用户输入有效的用户ID,要求同add脚本。若有用户输入一个无效的用户ID,应显示信息:“无效的用户ID!”,并再次提示用户输入一个用户ID。如果用户简单的按回车键而没有任何输入,显示信息:“没有输入!”,并提示用户再次输入一个用户ID。) 确认删除:(是)或(否):是(用户输入) 记录删除。(此信息只在成功删除新记录之后才显示,如果记录没有成功删除则不能显示此信息。在后面的例子里,UNIX系统将会显示一个标准的错误提示信息)。 (如果用户输入N或者除了Y或N以外的字母的话,删除操作应该退出并显示主菜单。这样能保证用户按Y来删除一个记录) Delete another? (y)es or (n)o: y (user input) 再删除一个?(是)或(否):是(用户输入) (以上过程从清屏开始并不断重复) 如果用户输入N或者除了Y或N的字母外,就退出删除操作,显示主菜单。 然而,如果找不到包含有键入用户ID的记录的话,就要输出以下信息: 删除用户记录 输入用户ID(xxxx):5555 (用户输入) 没有找到5555 按回车继续…… (务必使鼠标停留在信息末尾。等用户按了回车后,跳出主菜单。)   在你的delete脚本文件的开始处,你必须定义一个变量,这个变量存放passwd文件的文件名,并且能在所有涉及到passwd文件的语句中使用它。 对大作业的要求:    必须包含你的姓名,学生号以及你的SHELL脚本文件如何使用的简介。你还必须确认在Bash SHELL中可以运行你的脚本文件。为了使你的脚本文件输出更具有可读性,请在合适的地方用”\n”和注释。还要考虑脚本的结构和布局。     如何交你的作业:    你需要分别以硬拷贝(书面形式)和电子文档形式(副本)提交你的shell编程大作业。   你必须提交一份硬拷贝(有一个写上名字的装订好的封面)和一份含下面四个文件的电子拷贝(三份SHELL脚本和一份文本文件)。   menu、add、delete、passwd
LINUX/UNIX Shell编程大作业Linux系统的/etc目录下有这样一个文件passwd,该文件里包含系统中所有用户信息的记录,记录里包含每个用户的如下信息:用户名、密码、用户ID、组ID、用户全名、用户主目录和用户登录所用的shell。请设计一个脚本(shell)程序能实现增加、删除、查找和显示特定用户信息的功能。你们可以通过创建一些UNIX/LINUX shell 脚本文件来满足以上需求。 可以用任意一个文本编辑器打开passwd文件,该文件里包含用冒号分隔开的字段组成的记录,如下所示: root:x:0:0:root:/root:/bin/bash zxj:x:500:500:zxj303:/home/zxj:/bin/bash . . . 在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能: 1、 在屏幕上显示当前所有用户的记录 2、 在屏幕上显示当前所有用户(经过格式化和排序的)的记录 3、 只在屏幕上显示用户名和用户ID 4、 只在屏幕上显示(经过格式化和排序的)用户名和用户ID 5、 查询并显示特定用户的记录 6、 往passwd文件里增加新的用户记录 7、 从passwd文件里删除某个用户记录 你可以使用UNIX/LINUX中一些比较简单的命令或命令组合来执行1、2、3、4、5的任务。对于任务6和7,你需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在你的主脚本menu文件中调用这些脚本文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值