analizar un archivo `.hidden` para omitir su contenido de `ls`

analizar un archivo `.hidden` para omitir su contenido de `ls`

Quiero lsignorar (omitir de su salida) todos y cada uno de los nombres de archivo que figuran en un .hiddenarchivo.

Encontré una función bash que parece anularse lspara hacer esto...

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

...pero cuando source .bashrcregresa

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

No puedo identificar el error de sintaxis por mí mismo (he hecho un pequeño script bash, pero la declare GLOBIGNORElínea me resulta extraña). La línea 121 es solo esto: ls () {lo cual parece estar bien en sí mismo.

¿Ves un error en esta función?

¿Existe otro enfoque que podría utilizarse?


actualizaciones:

Eliminar el alias ls='ls --color=auto'de .bashrcno resuelve el unexpected tokenerror. Siguiendo el consejo, abandonemos ese enfoque usando globignore.

Cuando @rkhff señaló -I(y --ignore=) se me ocurrió probar algo como esto (primero en una función antes de colocarla en bashrc)

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

pero eso da esto misteriosamente /home/alec/bin/ls.sh: line 7: +=: command not found.... ¿por qué no se pudo +=encontrar? No he visto ningún otro caso en mis búsquedas web en el que el +=operador dé como resultado "comando no encontrado". La línea comentada con solo =también produce un error de comando no encontrado. ¿Alguien podría decir qué podría estar causando esto?

Respuesta1

Es probable que el error se deba a que tienes una versión anterior.aliasdefinición para ls. Demostrar:

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

Sin embargo, no creo que puedas hacer lo que quieras con GLOBIGNORE, ya que solo afecta la forma en quecaparazónexpande globos, y su shell expandirá cualquier expresión globanteslsse invoca tu comando.

Al menos con la implementación GNU Coreutils de ls, es posible que pueda utilizar -Io --ignorecambiar 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

información relacionada