Script falha ao expandir o asterisco ('*')

3

Eu tenho um script para coletar dados nmon a cada hora:

#!/bin/bash
# olympics_yymmdd_HHMM.nmon
time_stamp='date +"%y%m%d"'
h_name="$HOSTNAME"
exec > /var/log/nmon_capture.log
n_name=$h_name"_"$time_stamp"_*.nmon"
n_dir="/var/log/nmon_data"
cd $n_dir
sleep 1m
pwd
ls -al $n_name
#
/usr/bin/nmon -f -t -s 60 -c 1440 -m $n_dir
gzip $n_name
ls -al
exit

A saída de depuração mostra um problema com o arquivo de listagem. No entanto, isso funciona bem em outros servidores.

# bash -x /usr/bin/nmon_capture 
++ date +%y%m%d 
+ time_stamp=170217 
+ h_name=olympics 
+ exec 
+ n_name='olympics_170217_*.nmon' 
+ n_dir=/var/log/nmon_data 
+ cd /var/log/nmon_data 
+ sleep 1m 
+ pwd 
+ ls -al 'olympics_170217_*.nmon' 
ls: cannot access olympics_170217_*.nmon: No such file or directory 
+ /usr/bin/nmon -f -t -s 60 -c 1440 -m /var/log/nmon_data 
+ gzip olympics_170217_1504.nmon 
+ ls -al 
+ exit 
    
por Zafreen 17.02.2017 / 22:15

1 resposta

1

Quando você faz uma tarefa, o lado direito é considerado:

n_name=$h_name"_"$time_stamp"_*.nmon"

Portanto, o asterisco ( * ) será incluído literalmente na variável.
Não será expandido como é habitual com asteriscos em caminhos.

Como é provável que você não tenha um arquivo com um asterisco no diretório, o arquivo não foi encontrado e um erro foi emitido por ls .

Além disso, se você quiser que a expansão dos asteriscos funcione, isso deve ser feito no diretório em que o arquivo deve ser encontrado:

a_dir=/dir_to_file
n_name=$(echo "${a_dir}/${h_name}_${time_stamp}_"*".nmon")    
n_dir="/var/log/nmon_data"
cd "$n_dir"

E é uma boa ideia usar a opção de shell nullglob :

shopt -s nullglob

para evitar que * seja retido se não houver arquivo com esse nome.

Ou, melhor ainda, usar a opção failglob :

shopt -s failglob

Para ter um erro claro emitido quando nenhum arquivo é encontrado.

a_dir=/dir_to_file
n_name=$(shopt -s failglob; echo "$a_dir/${h_name}_${time_stamp}_"*".nmon")
(( $? )) && exit 1

Ajuste o valor de "$ n_dir" às suas necessidades (não está claro na sua descrição do problema).

E por favor: cite suas expansões por padrão, como: ls -al "$n_name"

    
por 18.02.2017 / 03:30