Bash 명령줄에 다음 코드 조각을 입력해 보세요.
$ echo $(( $(wc -l letter.txt | cut -c1-4)/66 + 1))
존재하고 66*4 줄이 있다고 가정하면 letter.txt
명령줄에 문자열 5가 입력됩니다. 지금 이해할 수 없는 것은 명령줄 처리에 대해 내가 알고 있는 지식을 바탕으로 어떻게 이러한 결론이 도출되었는지입니다.
내 책(소벨의Linux 실용 가이드,4e) 말한다
Bourne Again Shell은 다양한 유형의 확장 및 대체에 대해 다음 순서로 각 토큰을 스캔합니다. 이러한 프로세스의 대부분은 단어를 단일 단어로 확장합니다. 중괄호 확장, 단어 분할 및 경로 이름 확장만 명령의 단어 수를 변경할 수 있습니다(변수 "$@" 확장 제외 - 474페이지 참조).
- 지원 확장(다음 페이지)
- 물결표 확장(368페이지)
- 매개변수 및 변수 확장(368페이지)
- 산술 확장(369페이지)
- 명령 대체(371페이지)
- 분사 (페이지 372)
- 경로명 확장(372페이지)
- 프로세스 교체(374페이지)
- 견적 삭제(374페이지)
위 내용에 따르면 산술 확장이 먼저 평가되는 것으로 보이며, 그렇다면 토큰은 $(wc -l letter.txt | cut -c1-4)
bash에서 처리하는 정수 산술에 대한 유효한 피연산자가 아닙니다. 탈출구는 무엇입니까/이해가 안 되는 것은 무엇입니까?
답변1
귀하의 책은 완전히 정확하지 않습니다. man bash
구체적인 순서는 다음을 참조하세요.
확장 순서는 중괄호 확장, 매개변수 및 변수 확장, 산술 확장, 명령 대체(왼쪽에서 오른쪽으로 수행됨)입니다.
쉼표 사용에 주의하세요.세미콜론. 인수, 변수 및 산술 확장 및 명령 대체는 모두 동일한 순서로 발생합니다.
매뉴얼에 나오는 연산 확장에 대한 설명은 다음과 같습니다.
표현식의 모든 토큰은 매개변수 및 변수 확장, 명령 대체 및 따옴표 제거를 거칩니다.
명령 대체는 다음과 같이 설명됩니다.
...서브셸 환경에서 명령 실행
이는 모든 확장이 내부에서 외부로 중첩될 때 발생함을 의미합니다.
$ echo $((1 + $(echo $((2+$(printf %s 3))))))
6