analisar um arquivo `.hidden` para omitir seu conteúdo de `ls`

analisar um arquivo `.hidden` para omitir seu conteúdo de `ls`

Quero ignorar ls(omitir de sua saída) todo e qualquer nome de arquivo listado em um .hiddenarquivo.

Encontrei uma função bash que parece substituir lspara fazer isso ...

ls () {
  if [ -f .hidden ]; then
    declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
    ls "$@"
  fi
}

...mas quando eu source .bashrcretorno

-bash: .bashrc: line 121: syntax error near unexpected token `('
-bash: .bashrc: line 121: `ls () {'

Não consigo identificar o erro de sintaxe (fiz alguns scripts bash, mas a declare GLOBIGNORElinha é estranha para mim). A linha 121 é apenas isso: ls () {o que parece bom por si só.

Você vê um erro nesta função?

Existe outra abordagem que poderia ser usada?


atualizações:

Excluir alias ls='ls --color=auto'from .bashrcnão resolve o unexpected tokenerro. Seguindo o conselho, vamos abandonar essa abordagem usando globignore.

Quando @rkhff apontou o -I(e --ignore=), pensei em tentar algo assim (em uma função antes de colocar no bashrc)

PARAM=''
if [ -f .hidden ]; then
  IGN=' -I '
  while read p; do
    $PARAM+=$IGN$p
    #$PARAM="${PARAM}${IGN}${p}"
  done < .hidden
fi
ls$PARAM

mas isso dá isso misteriosamente /home/alec/bin/ls.sh: line 7: +=: command not found....por que não foi +=encontrado? Não vi nenhum outro caso em minhas pesquisas na web em que o +=operador resultasse em "comando não encontrado". A linha comentada apenas com =também produz um erro de comando não encontrado. Alguém poderia dizer o que poderia estar causando isso?

Responder1

O erro é provavelmente porque você tem uma versão anteriorapelidodefinição para ls. Para demonstrar:

$ alias foo='echo foobar'
$ foo
foobar
$ foo () { echo barfoo; }
-bash: syntax error near unexpected token `('

No entanto, não acho que você será capaz de fazer o que quiser GLOBIGNORE, pois isso afeta apenas como oconchaexpande globs, e seu shell expandirá quaisquer expressões globantesseu lscomando é invocado.

Pelo menos com a implementação do GNU Coreutils ls, você poderá usar o -Iou --ignoreswitch ex.

hidls () 
{ 
    declare -a args;
    local pat;
    local patfile=".hidden";
    [[ -r $patfile ]] || { 
        command ls "$@";
        return
    };
    while IFS= read -r pat; do
        args+=("-I");
        args+=("$pat");
    done < "$patfile";
    command ls "${args[@]}" "$@"
}
alias ls=hidls

informação relacionada