"ls"의 콘텐츠를 무시하도록 ".hidden" 파일을 구문 분석합니다.

"ls"의 콘텐츠를 무시하도록 ".hidden" 파일을 구문 분석합니다.

lsfile 에 나열된 모든 파일 이름을 무시(출력에서 생략) 하고 싶습니다 .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'에서 제거해 도 오류가 .bashrc해결되지 않습니다 . unexpected token제안한 대로 우리는 글로비고어를 사용하는 방법을 포기합니다.

@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을 확장하고 쉘은 모든 glob 표현식을 확장합니다.앞으로귀하의 ls명령이 호출됩니다.

최소한 GNU Coreutils 구현의 경우 ex를 사용 하거나 전환 ls할 수 있습니다 .-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

관련 정보