热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

资深Linux程序员的开发经验谈

资深Linux程序员的开发经验谈--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
转贴:
Sppence Murray 是 Linux 开发高手之一,同时长期以来他一直是 UNIX 的坚定支持者。本文介绍的是 Murray 和他在 Codemonks Consulting 的同事在日常的 Linux 开发以及应用服务工作中用到的基本技术: shell 脚本,相信 Linux 的开发人员都会受益于这项有用而且通用的技术。

  Spence Murray 是 Codemonks Consulting 的创始人之一,自从 20 世纪 80 年代最早在 SunOS 上编写代码到现在,一直致力于 UNIX/Linux 的开发。从那时起,他曾在 IBM 公司的 AIX、SGI 公司的 Irix 工作,长时间地编写跨平台的 UNIX 代码,包括 HP/UX,Irix,Solaris/SunOS,SCO UNIX,各种 BSD,MacOS X,当然,还有 Linux。从图形/视频设备驱动程序到 UI 代码,他什么工作都做过。Murray 编写的跨平台代码包括 X Window System Xserver 代码,以及作为 Netscape Navigator 一部分的核心浏览器代码。

  Murray 最经常使用的 Linux 工具是 vi、bash 和 Emacs。“不论我是在写 C、C++、Java、shell 脚本,还是 HTML,大部分的时间我都在这些工具中来回切换”,他说。

  Linux 秘密武器

  Murray 认为,对一个 Linux 开发人员来说,shell 是一个强大的软件开发工具,无论怎么评价都不过分。“在我做的每一项工作中都要用到 shell 脚本,不论是快速地阅读和修改普通文本还是编写代码”,他说。“它轻便而快捷,它短小的命令使得来回移动代码称为一个迅速而没有痛苦的过程。作为一名编辑,它很快就会成为第二本能”。

  对 Murray 来说,Emacs 作为一个开发工具出现的晚了一些。“在 90 年代早期,我尝试使用 Emacs 作为一个 IDE,并很快就转换门厅。Emacs 非常强大,在那些日子里,我会一直开着一个 Emacs 窗口,经常打开几十个源文件,每个都有我编辑的上下文、使用 gdb 的调试会话以及在不同的源目录下运行的 bash 脚本。有很多关于 Emacs 的资料,可以说,这是个可怕的工具...再者,您可以在任何您想要花时间去做开发的系统上运行 Emacs。

  自从 20 世纪 80 年代中期第一次使用 SunOS支持的 vi 这个简洁的环境以来,Emacs 编辑器已经成为了 Murray 的标准工具。"它在各种流派的 UNIX 上都可以使用,这是我在致力于跨平台的开发工作时选择它的主要原因之一”,他说。

  Linux 开发人员:了解您的 shell

  Murray 要求您要了解您的 shell。“Bash、tcsh、csh??shell 是您最基本的软件开发工具”,他强调说。“它可以做许多了不起的事情。所有的工作都要依赖于它……和它的强大功能”。作为说明通用的 shell 脚本功能强大的例子,在参考资料部分中有一个可以下载的文件,其中有一组脚本,用于获得 Red Hat 发行的更新 RPM 软件包并将它们合并到原来的软件包和定制的软件包。下载文件并解压缩后,您可以在 /developerworks/rpm_update_scripts 目录下找到脚本。最终结果是一个包括所有软件包最新版本的目录和一个用于网络安装的升级的 hdlist 文件。

  下面的代码片段实现的是对 Red Hat RPM 软件包的自动更新,以创建一个使用最新的 RPM 的可以安装的版本。这对任何一个维护公共 Linux 服务器的人来说是一个基本的步骤。就我们而言,我们通常是维护许多公共 Linux 服务器上的大量网络服务。下面是可以自动完成更新最新的安全和功能的过程的部分脚本。

  下面的脚本样例证明了普通的 shell 编程技术可以广泛应用于各种系统配置和程序设计应用。脚本使用的是 bourne shell,它是在不同的 UNIX 系统中最为常见的 shell。这样就可以保证这些非常轻便的代码可以稍加修改或者不加修改地在不同的 UNIX 系统上使用。修改 Red Hat 软件包的规范以应用于其它 Linux 发行版本是很容易的。

  freshen.sh 使用指定的 RPM ftp 更新站点上的 RPM 软件包来更新原有的 RPM 列表。执行过滤器来替换更新 RPM 软件包。最后,长长的发行列表根据从更新镜像站点上得到的新 RPM 软件包完成更新。

  清单 1. fresh.sh


#!/bin/sh
rh_ver=$1
rh_path=$2
update_dir=${rh_path}/RH${rh_ver}-updates
custom_dir=${rh_path}/RH${rh_ver}-custom
install_dir=${rh_path}/RH${rh_ver}-install

# Sanity check for the original directory.

# Create update and install directories if they don’t exist

[ -d ${update_dir} ] || mkdir ${update_dir}
[ -d ${install_dir}/RedHat/RPMS ] || mkdir -p ${install_dir}/RedHat/RPMS

# Get latest updates from fresh rpms FTP site

./get_update.sh ${rh_ver} ${update_dir}

# Create/update hardlinks from update, and custom directories
# to the install directory. We assume that original RPMS are already
# hardlinked to the install directory, so all we need to do is filter
# out any replaced by updated packages.

./do-links.sh ${update_dir} ${install_dir}/RedHat/RPMS
[ -d ${custom_dir} ] && ./do-links.sh ${custom_dir}
${install_dir}/RedHat/RPMS

# Filter out all but the latest version of everything.

./filter-rpms.pl $install_dir/RedHat/RPMS

# Rebuild the hard disk lists
/usr/lib/anaconda-runtime/genhdlist ${install_dir}


  freshen.sh 调用 do-links.sh 和 get_update.sh ,分别去设置 RPM 发行版本的源、宿(省略了源 RPM 软件包;硬链接用来设置目的 RPM)和检索更新。

  清单 2. do-links.sh


#!/bin/sh

src=$1
dest=$2

#for file in $src/*; do
for file in `find $src -name *.rpm -a ! -name *.src.rpm -print`; do
base=`basename $file;`
if test ! -f $dest/$base; then
echo "Linking $file";
ln $file $dest
else
echo "EXISTS: $file";
fi
done


  清单 3. get_update.sh


#!/bin/sh
rh_ver=$1
dest=$2
echo "Retrieving updates for version ${rh_ver} to $dest"
lftp < open ftp.freshrpms.net

mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i386 $dest/i386
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i486 $dest/i486
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i586 $dest/i568
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/i686 $dest/i686
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/SRPMS $dest/SRPMS
mirror -n pub/redhat/linux/updates/${rh_ver}/en/os/noarch $dest/noarch
推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • scrcpy通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何ro ... [详细]
  • 之前项目在windows2003服务器上设置定时任务,每天执行。现在把项目移植到linux系统。也要在linux系统上设置计划任务。但是之前我从来没有做过。所以多得不 ... [详细]
  • ZOC7 for Mac 7.25.6 好用的终端仿真器
    zoc7mac破解版是一个专业的SSH和Telnet客户端和终端模拟软件,以出色的配置和用户界面而闻名。凭借其令人印象深刻的仿真和功能,通过使用选项卡式会话,键入命令历史记录,回滚 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 程序员如何选择机械键盘轴体?红轴和茶轴对比
    本文介绍了程序员如何选择机械键盘轴体,特别是红轴和茶轴的对比。同时还介绍了U盘安装Linux镜像的步骤,以及在Linux系统中安装软件的命令行操作。此外,还介绍了nodejs和npm的安装方法,以及在VSCode中安装和配置常用插件的方法。最后,还介绍了如何在GitHub上配置SSH密钥和git的基本配置。 ... [详细]
  • 安卓及谷歌官网不容易上,在此整理好下载地址,这样就可以直接用迅雷下载了。Eclipse最新Mars版Eclipse(暂时还没被墙)Mac版:http:www.eclipse.org ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
  • 【BP靶场portswigger服务端10】XML外部实体注入(XXE注入)9个实验(全)
    前言:介绍:博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。殊荣:CSDN网络安 ... [详细]
  • Docker安装Rabbitmq(配合宝塔)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker安装Rabbitmq(配合宝塔)相关的知识,希望对你有一定的参考价值。一、事前准备 ... [详细]
  • CentOS7系统目录LINUX有四种基本文件系统类型普通文件:如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等,可用cat、less、 ... [详细]
  • 下载了一个东西想看一下摘要是否正确,但是cmd没有这个小工具,只好用Ubuntu来辅助一下,在右键菜单内加入一个选项叫”在这里打开Ubuntu”,期望是点下去后打开wsl然后工作目 ... [详细]
  • 阿里云服务器iis设置方法与上千种Linux桌面版本相比,Linux服务器只有可怜的十几种。但想要选对适合你的企业需要的仍然不是件容易的事情,选Linux服务器首先要 ... [详细]
  • 这么多流媒体服务器?你怎么技术选型?
    在上一篇文章里我们介绍了我们介绍了MCU和SFU的优缺点,webRTC通信方案SFU和MCU的区别?下面就来探讨下常见的SFU开源解决方案,当然,你也可以自己实现SFU流媒体服务器 ... [详细]
  • mac os php mysql_Mac OS下配置PHP+MySql环境
    由于最近需要布置mantis用来进行bug追踪,在此记录其过程。由于PHPapache环境在MacOS上是自带的,所以不需要另处下安装包, ... [详细]
author-avatar
比刀郎还冲动啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有