ls
file 에 나열된 모든 파일 이름을 무시(출력에서 생략) 하고 싶습니다 .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