Evitando expansão glob na string fgrep

0

Estou trabalhando em uma distro Busybox que não possui o comando crontab . Eu quero criar um script bash que atualiza o arquivo crontab do root com trabalhos listados em um arquivo de texto. Eu tenho a maioria do script funcionando, exceto que quando tento usar o fgrep para procurar o trabalho no arquivo cron, ele expande os caracteres * como globs e estraga tudo.

# Notes: CRONJOBS_LIST is the text file containing new jobs.
#        CRONJOBS_DIR is the directory where the new jobs will be installed.
#        CRONTAB_FILE is /etc/cron/crontabs/[user].

# Find each job in the crontab file. If not found, append it.
while read -r job; do
    if ! fgrep -q "$job" "$CRONTAB_FILE"; then
        # Appending file in loop avoids adding duplicate jobs if any are found in list
        echo "$job" >> "$CRONTAB_FILE"
        echo "Added '$job' to $CRONTAB_FILE"
    else
        echo "'$job' already found in $CRONTAB_FILE"
    fi
# Replace variable references in job list with correct paths
done < <(sed -e "s|\$CRONJOBS_DIR|$CRONJOBS_DIR|" "$CRONJOBS_LIST")

Alguém pode me ajudar a corrigir o script para que uma linha em CRONJOBS_LIST goste:

2 0 * * * bash $CRONJOBS_DIR/sysbak.sh backup

será expandido sem expandir o * s como globs?

    
por Stobber 27.07.2016 / 20:34

1 resposta

1

Se eu entendi o que você está tentando fazer, você deseja adicionar as linhas no arquivo $ADD ao arquivo $TARGET , mas sem adicionar linhas que já existem?

Acho que pode haver maneiras mais fáceis do que o grepping repetido. comm pode fornecer as linhas que existem apenas no primeiro, no segundo ou nos dois arquivos, vamos usar isso:

comm -23 <(sort "$ADD") <(sort "$TARGET") > tmp ; cat tmp >> "$TARGET"

O argumento -23 significa que não mostram linhas presentes apenas no arquivo 2, e não mostram linhas presentes em ambos (3). As entradas precisam ser classificadas e eu estou fazendo o acréscimo por meio de um arquivo temporário apenas para estar no lado seguro.

Uma solução de força bruta com sort e uniq também pode funcionar ...

cat "$ADD" "$TARGET" | sort | uniq > tmp ; mv tmp "$TARGET"

Isso, é claro, classificará o arquivo resultante (e removerá todas as linhas duplicadas existentes anteriormente).

(É claro que você pode querer criar um nome único de arquivo temporário .)

Quanto ao código atual, acho que o condicional em fgrep está invertido, pois grep retorna 0 se uma correspondência for encontrada e, diferentemente da maioria dos ambientes de programação, zero atua como true em shell scripts. Também something | while read ... deve funcionar da mesma forma que while... < <(something) , mas pode ser mais fácil de ler.

    
por 27.07.2016 / 22:07