Eu não vou deixar isso sem resposta, porque há algumas coisas seriamente erradas com este script. No entanto, como não sei o que o script deve fazer, essa resposta não resolverá seu problema.
-
chdir($directory);
pode falhar. Você precisa tratar do Erro .chdir($directory) or die "chdir($directory): $!";
-
$files .= "'$filename' "
não é o melhor para um nome de arquivo: ele falhará se o nome do arquivo contiver'
. Você poderia preparar o nome do arquivo com$filename =~ s/'/'\''/
, mas na verdade existe uma maneira melhor de fazer isso (veja o próximo ponto). -
system
com um único argumento chama um shell. Mas você não está usando nenhum recurso de shell, então você deve usar o formulário de lista. E assim você não precisa construir uma string que reúna todos os nomes de arquivos: apenas use a lista que você já tem.my @cmd = qw(/usr/bin/tar cvfz); system(@cmd, $dest_path, @ARGV);
-
Você ainda precisa lidar com erros de
system
.system(@cmd, $dest_path, @ARGV) or die "Call to $cmd[0] failed with status $?";
Se esta é a última coisa que o seu script faz, ligue para
exec
em seu lugar.exec(@cmd, $dest_path, @ARGV) or die "exec $cmd[0] failed: $!";
Até agora você pode fazer tudo isso facilmente no shell.
#!/bin/sh
set -e
cmd='tar cvzf'
dest_path='Archive.tgz'
cd -- "$(dirname -- "$0")"
echo "$cmd $dest_path $*"
exec $cmd "$dest_path" "$@"