Tenho vários servidores que possuem vários arquivos com informações de data de implantação que preciso analisar e obter uma cópia local dos arquivos com 2 meses ou mais.
#!/bin/bash
# split on new line not space
# don't want to quote everything
# globbing desired
IFS=$'\n'
servers=(
blue
red
)
parseDate() {
grep 'deploy_date:' $file | \
sed ... | \
# much more in here...
}
getOldFiles() {
local #all vars
currentDateInSecs=$(date +%s)
twoMonthsInSecs=526000
for server in ${servers[@]}; do
oldfile=$(
ssh $server "
$(declare -f parseDate)
for file in /dir/$server/file*; do
dateInSecs=$(date -jf '%b/%e/%Y' $(parseDate) +%s)
timeDiff=$((\$currentDateInSecs - \$dateInSecs))
((\$timeDiff >= \$twoMonthsInSecs)) &&
cat \$file
done
"
)
[ -n $oldFile ] &&
cat $oldFile ~/oldFiles/${server}-${file}.txt
done
Problema:
O problema atual é com dateInSecs=$(date -jf '%b/%e/%Y' $(parseDate \$file) +%s)
.
Quando parseDate \$file
está na $()
variável $file
não está expandido, funciona bem sem substituição de comando, mas eu preciso disso.
Como faço para corrigir isso?
Informações:
Este não é um script, eles estão no meu ~/.bash_profile
Este é um script (entre outros scripts) em um repositório git que é originado de ~/bash_profile
(eu tenho um script de instalação que define fontes usando $PWD
) para que as pessoas possam usar esses comandos diretamente em vez de fazer cd para o repositório git (que tem muitas outras coisas não aplicável a eles).
Funciona de servidores Macos a CentOS.
Tudo o que pode ser expandido dentro da sua
oldfile=$(...)
substituição de comando está sendo expandido antes do ssh. Você precisa escapar dos vários internos$()
se quiser que eles sejam executados no controle remoto em vez do local. Qualquer coisa que você queira que seja avaliada remotamente precisa ser escapada. Tentar:Além disso, embora o BSD
date
tenha essa-j
opção, o GNUdate
não. Como você está se conectando a uma máquina CentOS, provavelmente desejará alterarpara
Mas precisaríamos ver o formato exato que você obtém
parseDate
para ter certeza.Tenha cuidado com suas aspas duplas e simples. Onde você usa aspas duplas, todas
$variables
as$( … )
expressões e serão avaliadas antes da execução do comando. Por exemplo:Aqui, se
$server
estiverremoteHost
, isso será preparado algo assim antes de ser passadossh
para o controle remoto$server
:E no próprio remoteHost, você tentará executar algo assim:
Se você puder alterar sua pergunta para incluir uma explicação do que você está tentando alcançar, juntamente com exemplos de entrada e saída, alguém aqui poderá sugerir como reescrever seu código para atender aos requisitos.