проанализируйте файл `.hidden`, чтобы исключить его содержимое из `ls`

проанализируйте файл `.hidden`, чтобы исключить его содержимое из `ls`

Я хочу, чтобы он lsигнорировал (исключал из вывода) все имена файлов, перечисленные в .hiddenфайле.

Я нашел функцию bash, которая, похоже, переопределяет lsэто...

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

...но когда я source .bashrcэто верну

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

Я не могу сам определить синтаксическую ошибку (я немного поработал над скриптами на bash, но эта declare GLOBIGNOREстрока мне незнакома). Строка 121 выглядит так: ls () {что само по себе кажется правильным.

Видите ли вы ошибку в этой функции?

Можно ли использовать другой подход?


обновления:

Удаление alias ls='ls --color=auto'from .bashrcне решает unexpected tokenошибку. Согласно совету, давайте откажемся от этого подхода, используя globignore.

Когда @rkhff указал на -I--ignore=), у меня возникла мысль попробовать что-то вроде этого (сначала в функции, а затем поместить в bashrc)

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

но это дает это загадочно /home/alec/bin/ls.sh: line 7: +=: command not found.... почему не удалось +=найти? Я не видел других случаев в моих веб-поисках, где +=оператор выдает "команда не найдена". Закомментированная строка только с =также выдает ошибку команда не найдена. Может кто-нибудь сказать, что может быть причиной этого?

решение1

Ошибка, скорее всего, связана с тем, что у вас более ранняя версияпсевдонимопределение для ls. Для демонстрации:

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

Однако, я не думаю, что вы сможете делать с ним то, что хотите GLOBIGNORE, поскольку это влияет только на то, какоболочкарасширяет глобусы, и ваша оболочка будет расширять любые глобальные выражениядоВаша lsкоманда выполнена.

Однако , по крайней мере, с реализацией GNU Coreutils lsвы можете использовать ключ -Iили --ignoreex.

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

Связанный контент