`.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。アドバイスに従って、globignore を使用するアプローチを放棄しましょう。

-I@rkhff が(および)を指摘したとき、--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.... なぜ+=見つからないのでしょうか? Web 検索では、演算子の結果が「コマンドが見つかりません」となる他のケースは見たことがありません+=。 だけのコメント行で=も、コマンドが見つからないというエラーが発生します。これの原因は何なのか、誰か教えてもらえますか?

答え1

エラーは、以前のエイリアスの定義ls。例を挙げると:

$ alias foo='echo foobar'
$ foo
foobar
$ foo () { echo barfoo; }
-bash: syntax error near unexpected token `('

しかし、あなたが望むことをすることはできないと思いますGLOBIGNORE。なぜなら、それは、シェルグロブを展開し、シェルはグロブ表現を展開します前にコマンドlsが呼び出されます。

ただし、少なくとも の GNU Coreutils 実装では、またはスイッチ exlsを使用できる場合があります。-I--ignore

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

関連情報