解析“.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错误。根据建议,我们放弃使用 globigore 的方法。

当@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,因为它只会影响扩展 glob,并且您的 shell 将扩展任何 glob 表达式您的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

相关内容