
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