• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pedrotuga

[BASH] Dúvida - como usar um pipe para inserir o parametro no meio de um comando

10 mensagens neste tópico

Ora bem... usando um pipe é possivel enviar a saída de um comando para a entrada de outro.

Mas neste momento o que eu preciso é de enviar a saída de um comando para uma parte específica da entrada de outro.

em concreto isto, para fazer uma tarball com um timestamp, estou a pensar numa coisa deste tipo

date "+%Y.%m.%d-%H.%M" | tar -cvzf  tarname.tgz foldername 

Agora, a ideia era mesmo que o 'tarname' fosse construido automaticamente a partir do timestamp vindo do primeiro comando e tambem do foldername.

Se algem conseguir fazer isto assim numa linha era porreiro, se não já estou a ver que mais vale escrever um pequeno script.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta algo semelhante isto:

date +%Y | xargs -I {} echo {} "x"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mmmm ora bem já estamos mais perto, isso já me permite passar a data do date para outro comando, mas depos preciso de passar tambem um parametro manualmente, que é o nome do ficheiro.

Entretanto tinha escrito isto:

#!/bin/bash

datestring=date "+%Y.%m.%d-%H.%M_"
foldername=$1
tarballname="${datestring}${foldername}.tar.gz"

#tar -cvvzf "$tarballname" $1
echo $tarballname

só que não funciona porque a variável datestring não é preenchida com o output do comando date.

Esta pergunta é básica, mas como é que se atribui o output de um comando a uma variável?

Em principo já não será possível ir por aí porque uma coisa tipo isto deve funcionar:

#!/bin/bash

date "+%Y.%m.%d-%H.%m" | xargs -I {} tar -cvvzf  {}$1.tar.gz  $1

Não usei o geshi porque este passa-se com as chavetas

EDIT: yay! funciona... mas já agora...se alguem tiver a resposta à minha pergunta...

Obrigado rui carlos... aprendi um uso do xargs que ainda é um comando bastante oculto para mim.

A shell é divertimento puro ;)

EDIT2: como é que torno este pequeno scrip acessível a partir de qualquer path?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Esta pergunta é básica, mas como é que se atribui o output de um comando a uma variável?

Usa o caracter `.

Tipo:

VAR=`date +%Y`

PS: Pensei que quisesses fazer isso directamente no Terminal. Aí não consegui fazer com variáveis. Numa script, o melhor é mesmo usar uma variável.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esqueci-me deste tópico.

Rui, sim, a ideia era fazer directamente no terminal, só usaria um script se não desse para fazer no terminal.

Mas acabei por fazer as duas coisas!

Afixei o snippet no wiki:

http://wiki.portugal-a-programar.org/linux:timestamped_tarball

Isto funciona 5 estrelas mesmo. É o meu sistema de controlo de versões preferido para projectos individuais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já tive uma script que fazia mais ou menos isso, só que para várias pastas de uma vez (se há coisa que me irrita no tar, é ter que escrever o nome da pasta que quero arquivar, e depois ainda ter que escrever o nome que vou dar ao ficheiro). Depois acabei por a converter para Perl.

O problema da barra no fim do nome de uma pasta pode ser resolvido com a função basename.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já tive uma script que fazia mais ou menos isso, só que para várias pastas de uma vez (se há coisa que me irrita no tar, é ter que escrever o nome da pasta que quero arquivar, e depois ainda ter que escrever o nome que vou dar ao ficheiro). Depois acabei por a converter para Perl.

O problema da barra no fim do nome de uma pasta pode ser resolvido com a função basename.

Podes crer. Isso tambem me irrita profundamente no tar, e não percebo porque é que não vem já com uma funcionalidade para usar timestamps no nome.

Eu estou ciente desse 'bug' ou limitação, mas não quis perder muito tempo com este script pelo que deixei mesmo assim.

Já tenho usado PHP, python e mais recentemente perl, para este tipo de coisas, mas agora queria mesmo fazer isto em shellscript, quero ir aprendendo um pouco de shellscript, não pesco nada daquilo :s.

Olha, podes fazer melhoramentos, por exemplo esse da barra e outras coisas como parsar uma path, incluir documentação no proprio script, etc. Fica à vontade para ir editando a página do wiki. Eu todos os dias vejo as novidades no wiki e aprendo qq coisa nova. Estarei certamente atento a esta página em particular.

EDIT:

ok mais umas perguntas,

Qual é o melhor (o típico) sítio para colocar este tipo de scripts? a Minha PATH tem isto

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

basename, dirname... acabei de ler essas manpages, boas funções,  xiça, o número de vezes que já implementei essa porra à mão grrrrrr :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
PS: Pensei que quisesses fazer isso directamente no Terminal. Aí não consegui fazer com variáveis. Numa script, o melhor é mesmo usar uma variável.

Consegue-se:

export DATESTRING=`date +%Y.%m.%d-%H.%M_` FOLDERNAME=stuff
tar cjvf "$DATESTRING$FOLDERNAME.tar.bz2" $FOLDERNAME

Por acaso, pensava que podia pôr as variaveis sem o export, na mesma linha do comando. Mas afinal não dá: só para o programa aceder é que isso serve. Mas a substituição, neste caso, é feita na shell antes de executar o comando, e não dentro do programa tar propriamente dito.

Também se pode limpar as variaveis no final:

unset FOLDERNAME DATESTRING

E obviamente também se pode pôr ponto-e-vírgulas entre os comandos.

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já percebi qual foi o meu erro... Estava a usar uma plica para terminar o comando (hábitos do LaTeX), quando devia ter usado outro assento grave.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Já percebi qual foi o meu erro... Estava a usar uma plica para terminar o comando (hábitos do LaTeX), quando devia ter usado outro assento grave.

Sim. Quando redireccionamos o stdout de um programa para o argv de outro, usamos acentos graves dos dois lados.

Honestamente, quando vi o teu post, achei estranho teres posto um acento no final. Mas pensei que também funcionasse.

JJ

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora