解析“.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

相關內容