【发布时间】:2010-10-22 03:18:41
【问题描述】:
我正在编写一个非常简单的 Bash 脚本,它 tars 给定目录,加密该目录的输出,然后将生成的文件拆分为多个较小的文件,因为备份媒体不支持大文件。
我在 Bash 脚本方面没有太多经验。我相信我在正确引用我的变量以允许参数中有空格时遇到问题。脚本如下:
#! /bin/bash
# This script tars the given directory, encrypts it, and transfers
# it to the given directory (likely a USB key).
if [ $# -ne 2 ]
then
echo "Usage: `basename $0` DIRECTORY BACKUP_DIRECTORY"
exit 1
fi
DIRECTORY=$1
BACKUP_DIRECTORY=$2
BACKUP_FILE="$BACKUP_DIRECTORY/`date +%Y-%m-%dT%H-%M-%S.backup`"
TAR_CMD="tar cv $DIRECTORY"
SPLIT_CMD="split -b 1024m - \"$BACKUP_FILE\""
ENCRYPT_CMD='openssl des3 -salt'
echo "$TAR_CMD | $ENCRYPT_CMD | $SPLIT_CMD"
$TAR_CMD | $ENCRYPT_CMD | $SPLIT_CMD
say "Done backing up"
运行此命令失败:
split: "foo/2009-04-27T14-32-04.backup"aa: 没有这样的文件或目录
我可以通过删除我设置 $SPLIT_CMD 的 $BACKUP_FILE 周围的引号来修复它。但是,如果我的备份目录名称中有空格,则它不起作用。此外,如果我将“echo”命令的输出直接复制并粘贴到终端中,它工作正常。显然,我不明白 Bash 是如何逃避事情的。
【问题讨论】:
-
既然可以将 $BACKUP_FILE 放在管道中的 $SPLIT_CMD 之后,为什么还要将它嵌入到 SPLIT_CMD 中?
-
好吧,我可以这样做,但在这一点上,让变量包含我的命令并没有多大意义,我不妨像下面 Juliano 的回答那样将其全部展开。