Configurar bash globbing

4

Depois de vir do cygwin, estou bastante confuso sobre o bash (versão 4.1.5) globbing no meu Ubuntu 10.4. Eu adoraria uma das duas possibilidades a seguir:

  • ignore . e .. , corresponda a todo o resto
  • ignorar nomes de arquivos que começam com um ponto, a menos que sejam explicitamente

O comportamento atual é bem estranho:

cd; ls .*

diz "ls: cannot access. *: Nenhum arquivo ou diretório", embora eu tenha solicitado explicitamente nomes de arquivos que começam com um ponto.

cd; ls .gnupg/*.gpg

também se queixa, embora eu esteja pedindo arquivos que não estão começando com um ponto (é apenas o nome do diretório que começa com um ponto).

Saída de shopt -p

(removido)

A solução

Eu alterei shopt para valores de outro usuário (não tendo esse problema) e isso não ajudou. Então cheguei à ideia de dividir meu .bashrc e encontrar a linha ofensiva que continha algo como GLOBIGNORE='.[!/.]*:..[!/]*:*/.[!/.]*:*/..[!/]*: ...

Eu o substitui por GLOBIGNORE='.:..' , que faz quase o que eu quero e funciona.

    
por maaartinus 12.03.2012 / 22:04

3 respostas

2

Infelizmente, devo responder minha própria pergunta. Foi GLOBIGNORE . Na página do manual:

Uma lista separada por vírgulas de padrões que definem o conjunto de nomes de arquivos a serem ignorados pela expansão do nome do caminho. Se um nome de arquivo correspondido por um padrão de expansão de nome de caminho também corresponder a um dos padrões em GLOBIGNORE, ele será removido da lista de correspondências.

    
por 13.03.2012 / 07:32
1

O erro "ls: cannot access. *: No file or directory" parece ter problemas de permissões com o diretório atual. Eu posso reproduzi-lo com:

$ mkdir -p ~/tmp/tmp
$ cd ~/tmp/tmp
$ ls .*
.:

..:
tmp
$ chmod u-r .
$ ls .*
ls: cannot access .*: No such file or directory
$ ls -ldn .
d-wxr-xr-x 2 1000 1000 4096 2012-03-12 18:31 .
$ chmod u+r .
$ ls .*
.:

..:
tmp

Eu sugeriria executar chmod +r . e tentar o ls .* novamente.

    
por 12.03.2012 / 23:35
0

É mais do que provável que você não tenha arquivos sendo correspondidos pelos globs. Se nenhum arquivo for correspondido, bash por padrão interpreta * literalmente. Você pode querer definir nullglob usando shopt -s nullglob para evitar isso (embora isso deixe o comando estéril de argumentos se nenhum arquivo for correspondido).

    
por 12.03.2012 / 22:57