shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] quem eh o hifen ?


From: Gustavo Chaves
Subject: Re: [shell-script] quem eh o hifen ?
Date: 18 May 2005 10:47:38 -0300
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.4

>>>>> On Wed, 18 May 2005 03:03:15 -0300 (ART), "{Lopes, Ivan}" 
>>>>> <address@hidden> said:

  > pergunta: Como vimos o "-" (hífen) é usado para substituir nomes
  > de argumentos. mas como eh a regra de utilização do mesmo ? ele é
  > uma pilha de execução onde é guardada a saída da shell pai [tipo
  > vai um da matemática] ?

Isso é um tanto confuso porque não se trata de uma função da shell
(como a de expandir globs) e nem de uma regra geral.  É comum alguns
comandos (mas nem todos) entenderem o hífen como uma representação do
stdin.

Mas vamos aos seus exemplos:

  > % cd -          

Neste caso é a shell que entende o hífen como o diretório em que você
estava antes de mudar pra este.  É conveniente verificar no manpage da
sua shell, pois pode haver diferenças entre elas.  No man da bash
temos o seguinte:

  Shell Variables ...
       OLDPWD The previous working directory as set by the cd command.

  SHELL BUILTIN COMMANDS ...
       cd [-L|-P] [dir]
               ... An argument of - is equivalent to $OLDPWD...

  > % tar cvf - arquivo| gzip -9 > arquivo.tar.gz  

O hífen funciona como stdin quando usado como argumento da opção '-f'
do tar.  Do manpage:

       -f, --file [HOSTNAME:]F
              use archive file or device F (default "-", meaning stdin/stdout)

  > % gunzip -9c arquivo.tar.gz | tar xvf - 

Idem.

  > % bzip2 -dc arquivo.tar.bz2 | tar xvf -

Ibidem.

  > % tar cf - . | (cd /work/bkup/ivan && tar xvf -)

Ibibidem.

  > #!/bin/sh 
  > PAGER="col -b | view -c 'set ft=man nomod nolist' - " 
  > export PAGER 
  > man $* 

O comando view (parente do vim e do vi) entende o '-' como
stdin/stdout.  Do manpage:


       -           The file to edit is read from stdin.  Commands are read from 
stderr, which should be a tty.

  > % man assunto | col -b | vim -

Idem.

  > !!!!!!!!!!!1seguindo o raciocínio isso deveria valer!!!!!!!!1
  > % tar xzvf - prog.c.tar.gz |gcc - -.o

Não.  O gcc não entende o hífen como especial.

  > % tar xzvf - .screenrc.tar.gz | cat  - | sed "139,157!d"

Esse não funciona por um motivo mais sutil.  Primeiro, a menos que
você queira ganhar o "Useless Use of Cat Award"
(http://laku19.adsl.netsonic.fi/era/unix/award.html), remova o cat.
Ele também entende o hífen como stdin, mas, nesse pipe tudo o que ele
faz é ler a saída do tar e jogar pro sed.  Você pode bem jogar direto:

  % tar xzvf - .screenrc.tar.gz | sed "139,157!d"

Pra entender a sutileza do problema é preciso atentar para a função do
tar.  Neste caso ele está extraindo o conteúdo do arquivo
.screenrc.tar.gz e criando os arquivos novos no disco.  Mas o que ele
joga no stdout é a lista dos nomes dos arquivos que ele está
extraindo.  Portanto, o que o sed vê não é o conteúdo dos arquivos,
mas sim os seus nomes.

Sacou?

Gustavo.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]