Bash가 내 tr 문을 변경하고 있습니다

Bash가 내 tr 문을 변경하고 있습니다

추적 옵션 -v 및 -x를 사용하여 bash(4.1.2) 스크립트 실행

for Option in "$@"; do
OptName=$(echo $Option | tr [:lower:] [:upper:])

밝혀지다

+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr '[:lower:]' '[:upper:]'
+ OptName=-DEBUG

이것이 바로 제가 기대했던 것입니다. 그러나 동일한 호스트에서 동일한 bash 버전을 실행하는 다른 사용자는

+ for Option in '"$@"'
echo $Option | tr [:lower:] [:upper:]
++ echo -debug
++ tr r r
+ OptName=-debug

번역 명령이 "tr rr"로 변경되었습니다. 지금까지는 사용자가 한 명뿐이므로 환경에 있는 것이어야 합니다(맞죠?).

이 문제의 원인에 대한 제안 사항이 있습니까?

답변1

r[:upper:]확장자 가 r.

노력하다

tr '[:lower:]' '[:upper:]' 

(편집) 내 테스트

%_ ls
%_ echo [:upper:]
[:upper:]
%_ touch r
%_ echo [:upper:]
r
%_

bash는 여러 단계로 명령줄을 구문 분석합니다. 그 중 하나는 파일 이름 확장이라고도 알려진 "globbing"입니다. 그래서 bash가 그것을 볼 때 tr [:lower:] [:upper:]tr 바이너리를 찾은 다음 괄호를 보고 [ ... ]"아, 그러면 다음 문자 중 하나로 이름이 지정된 파일을 일치시키려는 것입니다: :, l, o, w, e또는 . 이름이 - - 인 r파일을 이해합니다. r당신을 위한!

r 파일이 없으면 bash는 와일드카드 문자를 확장할 수 없으며 확장하지 않습니다 [...].

관련 정보