代码之家  ›  专栏  ›  技术社区  ›  JasonSmith

shell脚本中临时目录中的临时操作

  •  9
  • JasonSmith  · 技术社区  · 15 年前

    我需要一个新的临时目录来完成shell脚本中的一些工作。当工作完成后(或者如果我中途终止工作),我希望脚本切换回旧的工作目录,并清除临时目录。在Ruby中,它可能如下所示:

    require 'tmpdir'
    
    Dir.mktmpdir 'my_build' do |temp_dir|
      puts "Temporary workspace is #{temp_dir}"
      do_some_stuff(temp_dir)
    end
    
    puts "Temporary directory already deleted"
    

    在bash脚本中,buck做这件事的最佳选择是什么?

    这是我当前的实现。有什么想法或建议吗?

    here=$( pwd )
    tdir=$( mktemp -d )
    trap 'return_here' INT TERM EXIT
    return_here () {
        cd "$here"
        [ -d "$tdir" ] && rm -rf "$tdir"
    }
    
    do_stuff # This may succeed, fail, change dir, or I may ^C it.
    return_here
    
    3 回复  |  直到 15 年前
        1
  •  15
  •   JayM    15 年前

    干得好:

    #!/bin/bash
    TDIR=`mktemp -d`
    
    trap "{ cd - ; rm -rf $TDIR; exit 255; }" SIGINT
    
    cd $TDIR
    # do important stuff here
    cd -
    
    rm -rf $TDIR
    
    exit 0
    
        2
  •  1
  •   Cascabel    15 年前

    通常为自己设置临时目录的实用程序是 mktemp -d (和 -p 选项允许您指定前缀目录)。

    我不确定“我想陷阱”是否也是一个问题,但是bash确实让你用(惊喜!) trap -请参阅文档。

        3
  •  1
  •   Chris Johnsen    15 年前

    假设 mktemp -d 返回相对路径名,我会忘记 $here 而是这样做:

    tdir=
    cleanup() {
        test -n "$tdir" && test -d "$tdir" && rm -rf "$tdir"
    }
    tdir="$(pwd)/$(mktemp -d)"
    trap cleanup EXIT
    trap 'cleanup; exit 127' INT TERM
    
    # no need to call cleanup explicitly, unless the shell itself crashes, the EXIT trap will run it for you
    
    推荐文章