微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

脚本中 mkdir 和 mktemp 之间的区别

如何解决脚本中 mkdir 和 mktemp 之间的区别

当我使用 mkdir 在 cwd 中创建一个名为 workdir 的目录时,以下方式非常有效:

#!/bin/bash

SUBDIR=$(pwd)
export BASISDIR="/home/Basis_Sets"

for i in *.ZMAT; do
    [ -f "$i" ] || break
    BASENAME=$(basename $i .ZMAT)
    ZMAT_file=$BASENAME.ZMAT
    FCMINT_file=$BASENAME.FCMINT
    ERROR_file=$BASENAME.slu
    
    mkdir $SUBDIR/$BASENAME
    export workdir="$SUBDIR/$BASENAME"
    if [[ ! -f $ERROR_file ]] && [[ -d $workdir ]]; then
        cp $BASENAME.* $workdir
        cp $BASISDIR/GENBAS $workdir
        cp _CFOUR_SLURM.SUB $workdir
        cd $workdir
        RUN_COMMAND="sbatch -J $BASENAME _CFOUR_SLURM.SUB"
        eval $RUN_COMMAND
        mv $ZMAT_file ZMAT
        mv $FCMINT_file FCMINT
        file_count=$(ls -x *)
        echo "File Count: $file_count"
        cd $SUBDIR
        sleep 10
    else
        echo "$BASENAME Error File Exists - Not Submitting Job"
    fi
done

但是,当我按如下方式使用它时,它无法识别 workdir,但仍会创建目录(即 if 语句失败,但已创建目录)。我在不同的脚本中使用了这种相同的方法来创建一个临时目录 [即:NAME=$(mktemp -d ....)],它工作得非常好。为什么下面的代码适用于 mktemp 而不适用于 mkdir?

#!/bin/bash

SUBDIR=$(pwd)
export BASISDIR="/home/Basis_Sets"

for i in *.ZMAT; do
    [ -f "$i" ] || break
    BASENAME=$(basename $i .ZMAT)
    ZMAT_file=$BASENAME.ZMAT
    FCMINT_file=$BASENAME.FCMINT
    ERROR_file=$BASENAME.slu
    
    workdir=$(mkdir $SUBDIR/$BASENAME)
    ....

解决方法

mkdir 不打印创建的目录的名称; mktemp -d 确实如此。由于 mkdir 不打印任何内容,因此 $WORKDIR 被设置为空字符串。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。