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

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

Re: [shell-script] if [diretorio vazio]


From: Felipe Kellermann
Subject: Re: [shell-script] if [diretorio vazio]
Date: Fri, 12 Mar 2004 02:28:50 -0300 (BRT)

On Thu, 11 Mar 2004 5:28pm  -0300, Rodolfo Villanova - TmS Brasil wrote:

> Normalmente eu uso o comando set somente para modificar (ativar/desativar)
> funções de ambiente do Korn Shell.

E colocar parâmetros posicionais.  Que aliás, a korn shell faz muito bem.
Garanto que esta segunda característica é mais importante.  Aliás, esta é
uma questão que (não deveria) envolver tipos de shell.


> Como não tenho Linux na plataforma onde trabalho, não consegui testar com
> sucesso a solução do Felipe.
>
> Nos ambientes SunOs e OSF1 (True64) não aconteceu nada, nem mensagem de
> erro.
> No man deles encontrei duas funções diferentes.
>
> No SunOs, o significado que eu já estava acostumado:
>
> User Commands                                              set(1)
>
> NAME
>      set, unset, setenv, unsetenv, export - shell built-in  func-
>      tions  to  determine  the  characteristics for environmental
>      variables of the current shell and its descendents

Está faltando mais detalhes na sinopse.
Para não esquecer:  É uma questão que não deveria envolver sistemas.


> Já no True64:
>                             Standard C++ Library
>                  Copyright 1996, Rogue Wave Software, Inc.
>
> NAME
>
>   set  - An associative container that supports unique keys.  A set supports
>   bidirectional iterators.

Está olhando na seção certa?  Eu acho que não...


> Como funciona no Linux essa linha de comando que propuseste, Felipe?
>

Como em qualquer outro sistema...
Bom, eu já estava preparando uma resposta elegante, animada e bonita.  Eu
infelizmente acabei me decepcionando, mais uma vez.  E mais uma vez é por
causa de um padrão estúpido, burro.  Eu não consegui acreditar!

ZSH:
% echo /dir/vazio/*

% echo $ZSH_VERSION
4.1.1


BASH:
$ echo /dir/vazio/*

$ echo $BASH_VERSION
2.05b.0(1)-release


KSH (Para a minha surpresa):
$ echo /dir/vazio/*
/dir/vazio/*
$ echo $KSH_VERSION
@(#)PD KSH v5.2.14 99/07/13.2


Um erro?  Não, é este o resultado esperado, apesar de... deixa pra lá.
Mas qual foi a razão de a minha shell `bash' e `zsh' tomarem a atitude
óbvia de não expandir nada?  Simples:  São duas opções que já uso como
padrão há muito tempo:  'NULL_GLOB' da `zsh' e `nullglob' da `bash'.

A idéia... que eu só testei na `zsh' e `bash'.
Qual é a idéia da minha sugestão?  Muito simples.  Felizmente nós temos
algumas certezas:  No teste `[' (ou `test') nós sabemos que se testarmos
strings, vamos ter verdadeiro se não for uma string `zero'.  Nós também
sabemos que `set' com parâmetros vai colocar os parâmetros posicionais,
sem parâmetros vai mostrar todas as variáveis de ambiente de uma forma
reusável.  Se juntarmos tudo isto e mais a idéia lógica de não expandir
nada quando há algum globbing que não faz nenhum match, está ai:

$ [ "$(set /diretório/*)" ] && echo vazio

1. `[': Vamos fazer um teste, `test';
2. `"': Precisa ser um argumento.  O `test' é incapaz o suficiente para
        não conseguir fazer uma lista de verificações;
3. `$': Precisamos substituir um comando;

O resto funcionaria bem.  Eu espero que tu tenha percebido.  Mas ainda
haveria aqui uma possibilidade, facilmente implementável e que eu posso
garantir que ficaria `100% portável'.  Simples:  Se nós fizermos esta
expansão inválida, mesmo que não expanda para um valor `zero', nós ainda
podemos saber qual vai ser o valor.  E fazer a verificação.  Bom, mas há
outras alternativas, por exemplo:

$ echo $KSH_VERSION
@(#)PD KSH v5.2.14 99/07/13.2
$ vazio() { [ "$(echo $1/*)" = "$1/*" ]; }
$ vazio /tmp && echo sim
$ vazio /tmp/vazio && echo sim
sim

Mas continuo decepcionado...

-- 
Felipe Kellermann


reply via email to

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