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