я создаю скрипт для копирования файлов или папки с датой, прикрепленной к его имени, например, если имя файла 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
для debug Я нахожу, когда пользователь использует -d
опцию команды cp
в if
, все еще оригинальной, а не псевдонимом.
Debugging:
> ./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
[$ TYPE = "d"] && __cp = "cp -r" || __cp = "ф" , а затем .... $ __ ф $ имя_файла $ TO_DIR/$ {имя файла ## * /} - $ DATE.bkup просто выплеснуть сглаживанием/unaliasing подход)) –
Это хорошо, но знаете ли вы какие-либо оправдания тому, что произошло? –