Costumo escrever scripts de shell KSH que seguem o mesmo padrão:
- (1) recuperar a saída de um ou mais comandos
- (2) formate-o usando grep | cut | awk | sed e imprima-o na tela ou em um arquivo
Para fazer isso, costumo armazenar a saída de (1) em um arquivo temporário e, em seguida, faço a formatação em (2) nesse arquivo.
Tome esse código, por exemplo:
TMPFILE=file.tmp
# If tmpfile exists rm it.
[ -f $TMPFILE ] && rm -f $TMPFILE
for SERVICE in $(myfunc); do
getInfo $SERVICE > $TMPFILE # Store raw output in the TMPFILE
# I retrieve the relevant data from the TMPFILE
SERV_NAME=$(head -1 $TMPFILE | sed -e 's/ $//')
SERV_HOSTNAME=$(grep HOSTNAME $TMPFILE | cut -d "=" -f2)
SERV_ARGS=$(grep Arguments $TMPFILE | cut -d ":" -f2)
print $SERV_NAME $SEP $SERV_HOSTNAME $SEP $SERV_ARGS
rm -f $TMPFILE #rm the TMPFILE in vue of next iteration
done
Existe uma maneira, usando pipes, redirecionamentos e outras coisas, para evitar gravar um arquivo no disco a cada vez?
Se ajudar, estou usando a versão ksh M-11/16 / 88i
PATH
outras shell ou variáveis de ambiente.TMPFILE
pode ser bom, masTMPDIR
é especial, então você realmente quer andar nessa corda bamba?Respostas:
Seu código parece um exemplo inteiramente justificado de usar tempfiles para mim. Eu ficaria: fique com essa abordagem. A única coisa que realmente precisa ser alterada é a maneira como você cria o arquivo temporário. Use algo como
ou
ou pelo menos
Dessa forma, você não permitirá que o nome seja facilmente previsto (segurança) e exclua a interferência entre várias instâncias do script em execução ao mesmo tempo.
fonte
var=$(echo lots of spaces); echo "$var"
é bom e deve produzirlots of spaces
como saída. A verdadeira advertência que ninguém mencionou é a substituição de comando retira todas as novas linhas finais. Isso não é um problema aqui, e só importa, por exemplo, se você quebroumktemp
o sistema e criou nomes de arquivos com novas linhas à direita. A solução usual, se necessário, évar=$(echo command with trailing newline; echo x); var=${var%x}
.Você poderia usar uma variável:
De
man ksh
:As vantagens incluem:
fonte
man
da página (não havia nenhuma menção do número de versão na página web: /)<<<
é bash 'aqui string'. Acho que não aparece em nenhuma outra concha. (Oh,zsh
talvez ...)man ksh
. Certamente foi mencionado lá.sleep 3 <<<"here string" & lsof -p $! | grep 0r
→sleep 30251 anthony 0r REG 253,0 12 263271 /tmp/sh-thd-7256597168 (deleted)
- sim, ele usa um arquivo temporário.Você tem duas opções:
Você recupera os dados uma vez (no seu exemplo com
getInfo
) e os armazena em um arquivo como faz.Você busca os dados a cada vez e não os armazena localmente, ou seja, liga
getInfo
sempreNão vejo o problema ao criar um arquivo temporário para evitar o reprocessamento / nova busca.
Se você estiver preocupado em deixar o arquivo temporário em algum lugar, sempre poderá
trap
excluí-lo, caso o script seja interrompido / interrompidoe use
mktemp
para criar um nome de arquivo exclusivo para seu arquivo temporário.fonte
Em vez de gerar um arquivo, construa instruções de atribuição de shell e avalie essa saída.
Ou se você quiser apenas imprimir as informações:
fonte