Por que meu script Bash exibe o erro “too many arguments” no comando cp?

0

Aqui está o meu script, eu recebo o erro "linha 33: [: muitos argumentos", estou confuso porque, certamente apenas 2 argumentos estão sendo fornecidos para cp aqui?

Estou fornecendo dois diretórios para o script sem espaços, ou seja, $ 1 = dir1 / e $ 2 = dir2 /

#!/bin/bash

### Assign suitable names to arguements. ###

source=$1
dest=$2

### Error handler for all script errors. ###

function errorHandler {
    case $1 in
        ERRargs) printf "USAGE: e2backup source_dir dest_dir.\n"; exit 1;;
        ERRsource) printf "ERROR: Source does not exist or is not a directory.\n"; exit 2;;
        ERRdest) printf "ERROR: Destination does not exist or is not a directory.\n"; exit 3;;
        ERRempty) printf "ERROR: Destination is not empty.\n"; exit 4;;
    esac
}

### Test num. of args, source/dest validity and empty dest. Then perform backup. ###

if [ $# -ne 2 ]
  then
    errorHandler ERRargs
elif [ ! -d $source ]
  then
    errorHandler ERRsource
elif [ ! -d $dest ]
  then
    errorHandler ERRdest
elif [ -n "$(ls -A $dest)" ] 
  then
    errorHandler ERRempty
elif [ cp -R $source $dest ]
  then
    printf "Successfully backed-up from $source to $dest"; exit
else
    printf "Back-up failed, please see e2backup.error"; exit 5
fi
    
por Mike 07.03.2013 / 23:28

2 respostas

1

Não é cp mas [ aka test , o que lhe dá o erro

    
por 07.03.2013 / 23:32
0

No ponto, a instrução cp -R $source $dest não é uma condição de teste em si. Então você deve dizer ao BASH para executar os comandos cp . Você pode usar as cotações anteriores ou $(...) e testar o resultado ou melhor, como sugerido por um comentarista:

if [[ $# -ne 2 ]]
  then
    errorHandler ERRargs
elif [[ ! -d $source ]]
  then
    errorHandler ERRsource
elif [[ ! -d $dest ]]
  then
    errorHandler ERRdest
elif [[ -n "$(ls -A $dest)" ]]
  then
    errorHandler ERRempty
elif cp -R $source $dest
  then
    printf "Successfully backed-up from $source to $dest"; exit
else
    printf "Back-up failed, please see e2backup.error"; exit 5
fi

Atualizado : O BASH suporta tanto '[]' quanto '[[]]' para um teste. Existe um significado ligeiramente diferente que o curioso pode encontrar na página man. Além disso, também é possível usar outras maneiras de fazer um teste, como usar o comando test bash builtin.

    
por 11.03.2013 / 16:29