我想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