[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