脚本中 mkdir 和 mktemp 之间的区别
Difference between mkdir and mktemp within a script
当我使用 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 被设置为空字符串。
当我使用 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 被设置为空字符串。