[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.