Solaris와 Linux 셸의 명령 차이점

Solaris와 Linux 셸의 명령 차이점

쉘 스크립트에서 이 조각을 얻었으며 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

관련 정보