理想化的wget下载&安装过程

时间:2012-09-30 19:53:36

标签: linux bash shell wget

我正在尝试使用Wget安装正确的安装过程,在本例中我将使用Nginx。

# Download nginx to /tmp/ directory
wget http://nginx.org/download/nginx-1.3.6.tar.gz -r -P /tmp

# Extract nginx into /tmp/nginx directory
tar xzf nginx-1.3.6.tar.gz -C /tmp/nginx

# Configure it to be installed in opt
./configure --prefix=/opt/nginx

# Make it
make

# Make install
make install

# Clean up temp folder
rm -r /tmp/*

这是理想化的过程吗?有什么我可以改进的吗?

2 个答案:

答案 0 :(得分:2)

首先,您肯定会重新发明轮子:如果您要解决的问题是目标系统上的自动打包/构建软件,那么有各种各样的包管理系统,端口可用的无数解决方案建设者等。

至于你的shell脚本,你应该考虑修改一些事项:

  • http://nginx.org/download/nginx-1.3.6.tar.gznginx-1.3.6.tar.gz等内容是常量。尝试在单独的变量中提取所有常量,并使用它们来使维护此脚本更容易,例如:

    NAME=nginx
    VERSION=1.3.6
    FILENAME=$NAME-$VERSION.tar.gz
    URL=http://nginx.org/download/$FILENAME
    TMP_DIR=/tmp
    INSTALL_PREFIX=/opt
    
    wget "$URL" -r -P "$TMP_DIR"
    tar xzf "$FILENAME" -C "$TMP_DIR/nginx"
    
  • 您通常无法100%确定目标部署系统上存在wget。如果您想最大限度地提高可移植性,可以尝试检测常用的网络实用程序,例如wgetcurlfetch甚至lynxlinks,{ {1}}等等

  • 使用临时目录的正确做法是一个很长的单独问题,但一般来说,您需要遵守以下三个方面:

    • 应该以某种方式找出临时目录位置。一般来说,假设w3m始终是一个临时目录是错误的,因为它可以不挂载,它可以是不可写的,如果/tmp文件系统已满,等等。 ,没有便携式和通用的方法来检测临时目录。至少应该检查tmpfs的内容,以便用户可以将脚本指向正确的临时目录。另一个可能很明智的想法是一组启发式检查,以确保可以写入所需的位置(至少检查$TMPDIR$TMPDIR$HOME/tmp/tmp),有足够的空间等等。
    • 应该以安全的方式创建临时目录。在Linux系统上,/var/tmp通常就足够了。在基于BSD的系统上,需要更多的手动工作,因为默认的mktemp --tmpdir -d some-unique-identifier.XXXXXXXXX实现并不特别具有种族抗性。
    • 使用后应该清理临时目录。清洁不仅要在成功退出时进行,还要在出现故障时进行。这可以通过使用信号陷阱和特殊清理回调来解决,例如:

      mktemp
  • 如果你真的想使用递归# Cleanup: remove temporary files cleanup() { local rc=$? trap - EXIT # Generally, it's the best to remove only the files that we # know that we have created ourselves. Removal using recursive # rm is not really safe. rm -f "$LOCAL_TMP/some-file-we-had-created" [ -d "$LOCAL_TMP" ] && rmdir "$LOCAL_TMP" exit $rc } trap cleanup HUP PIPE INT QUIT TERM EXIT # Create a local temporary directory LOCAL_TMP=$(mktemp --tmpdir -d some-unique-identifier.XXXXXXXXX) # Use $LOCAL_TMP here ,那么使用任何rm来表示glob文件是一种不好的做法。如果你的目录有超过几千个文件,*会扩展到太多的参数并溢出shell的命令行缓冲区。我甚至可以说,没有一个好借口使用任何通配是一种不好的做法。上面的rm行至少应重写为:

    *

    删除rm -f /tmp/nginx-1.3.6.tar.gz rm -rf /tmp/nginx 中的所有子目录(如/tmp中所示)对于多用户系统来说是非常糟糕的做法,因为您将获得权限错误(您将无法删除其他用户的文件)或者你可能通过删除活跃使用的临时文件来严重破坏其他人的工作。

  • 一些小抛光:

    • POSIX标准/tmp/*现在使用普通的短UNIX选项,即tar,而不是tar -xvz
    • 现代GNU tar(以及AFAIR,BSD tar也)并不需要任何“解压缩”标志,例如tar xvz-z-j等。检测归档/压缩格式本身,-y足以提取任何tar -xf / .tar / .tar.gz tarball。

答案 1 :(得分:1)

这是基本的想法。您必须以root用户身份运行make install命令(如果需要,还可以运行整个脚本)。您的rm -r /tmp/*应为rm -r /tmp/nginx,因为其他命令可能包含他们在tmp目录中处理的内容。

还应该注意的是,从像这样的源构建的工作没有对一个体面的大小项目进行修改的可能性相当低。通常,您会发现需要明确指定库的路径,或者某些代码在您的发行版中无法正确编译。