
Я хочу, чтобы он 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
или --ignore
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