我的脚本中的命令别名

时间:2013-09-01 15:31:46

标签: linux unix bash

我正在创建一个脚本,用于复制附有其名称的日期的文件或目录,例如,如果文件名为test,则为test-20130901.bkup

这是我的脚本

#!/usr/bin/bash
set -x

getopts fd TYPE
[ $TYPE = "d" ] && alias cp="cp -r"

backup_error() {
        echo "${0##*/}: $1"
        exit -1
}

typeset -r FROM_DIR=$2 TO_DIR=$3
if [ ! -e $FROM_DIR -a ! -d $FROM_DIR ] || [ ! -e $TO_DIR -a ! -d $TO_DIR ]
then
        backup_error "One of the directories isn't exist or it maybe a file";
fi

typeset -r DATE=$(date "+%Y%m%d")
for filename in $FROM_DIR/*
do
        if [ -$TYPE $filename ]
        then
                cp $filename $TO_DIR/${filename##*/}-$DATE.bkup
        fi
done

unalias cp

在脚本中,我检查用户是想要仅在文件上运行脚本还是仅在目录上运行脚本。 -f仅限文件 -d仅限目录

[ $TYPE = "d" ] && alias cp="cp -r",此行检查脚本是否针对目录运行我必须使用cp -r,因此我将cp的别名设为cp -r

但是当我使用set -x进行调试时,我发现当用户使用-d选项时,cp中的if命令仍然是原始的而不是别名。< / p>

调试:

> ./backup.sh -d . .
+ getopts fdb TYPE
+ '[' d = d ']'
+ alias 'cp=cp -r'
+ typeset -r FROM_DIR=. TO_DIR=.
+ '[' '!' -e . -a '!' -d . ']'
+ '[' '!' -e . -a '!' -d . ']'
++ date +%Y%m%d
+ typeset -r DATE=20130901
+ '[' -d ./backup.sh ']'
+ '[' -d ./dir1 ']'
+ cp ./dir1 ./dir1-20130901.bkup
cp: ./dir1: is a directory
+ '[' -d ./file1 ']'
+ '[' -d ./file2 ']'
+ '[' -d ./test.sh ']'
+ unalias cp

1 个答案:

答案 0 :(得分:2)

改为使用函数:

if [[ $TYPE == d ]]; then
    function cp {
        command cp -r "$@"
    }
fi

在Bash中,[[ ]]推荐test[ ]

同时引用请在""之间正确引用您的变量,以防止分词和意外的路径名扩展。

其他警告:

    exit -1  ## exit can only accept 8-bit integral values from 0 to 255. -1 here is orthodox and is equivalent to 255.

您应该在此引用变量或使用[[ ]]

    if [[ ! -e $FROM_DIR && ! -d $FROM_DIR ]] || [[ ! -e $TO_DIR && ! -d $TO_DIR ]]

    if [ "-$TYPE" "$filename" ]  ## for custom operators, test is better: test "-$TYPE" "$filename"

            cp "$filename" "$TO_DIR/${filename##*/}-$DATE.bkup"

for filename in "$FROM_DIR"/*

最后确保将脚本运行为:

bash script.sh -f from_dir to_dir
# Or
bash script.sh -d from_dir to_dir