추적 옵션 -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는 와일드카드 문자를 확장할 수 없으며 확장하지 않습니다 [...]
.