쉘 스크립트에서 이 조각을 얻었으며 Solaris 환경에서 완벽하게 작동합니다.
grep -h '??.*??' $1/{CT,{MYDIR{85,97}}{,_E}}/R*txt
하지만 우분투에서 쉘 스크립트를 실행하려고 하면 다음 오류가 발생합니다.
grep: ./{MYDIR85}/R*txt: No such file or directory
grep: ./{MYDIR85}_E/R*txt: No such file or directory
약간의 편집 후에는 잘 작동하고 MYDIR의 중괄호를 제거했습니다.
grep -h '??.*??' $1/{CT,MYDIR{85,97} {,_E}} /R*txt
문제가 어디에 있는지 알고 싶습니다. linux 명령과 Solaris 명령이 호환되지 않습니까?
참고 - MYDIR85, MYDIR97 및 CT 세 개의 디렉토리가 있습니다. 우분투에서 쉘은 /bin/bash입니다. - 솔라리스에서는 쉘 유형을 모르지만 쉘 스크립트의 첫 번째 줄은 #!/bin/bash입니다.
답변1
bash
매뉴얼 페이지 에 따르면
적절하게 구성된 중괄호 확장에는 따옴표가 없는 열고 닫는 중괄호가 포함되어야 합니다.따옴표가 없는 하나 이상의 쉼표 또는 유효한 시퀀스 표현. 잘못 형성된 중괄호 확장은 변경되지 않습니다.
당신의 표현에 {MYDIR{85,97}}
,밖의중괄호에는 따옴표가 없는 쉼표나 시퀀스 표현식이 없으므로 확장되지 않습니다 {MYDIR85} {MYDIR97}
. 예를 들어 설명을 위해 후행 쉼표를 추가하면 원하는 동작을 얻을 수 있습니다.
bash $ echo {MYDIR{85,97},}
MYDIR85 MYDIR97
이는 _E
복합 표현식에 추가(아마도 원치 않는) 요소를 도입합니다 {CT,{MYDIR{85,97}}{,_E}}
.
Solaris에서 왜 다른 동작이 나타나는지 모르겠지만 주목해야 할 점은csh
하다이 경우 외부 중괄호를 제거합니다(물론 후행 쉼표 형식도 허용하지만 ksh
당연히 그렇습니다 zsh
).
csh % echo {MYDIR{85,97}}
MYDIR85 MYDIR97
csh % echo {MYDIR{85,97},}
MYDIR85 MYDIR97