Bash 토큰 교체의 제한 사항 이해

Bash 토큰 교체의 제한 사항 이해

$()bash는 구문 이나 구문을 통해 토큰을 대체합니다 ``. 예를 들면 다음과 같습니다.

$ $(echo "echo hi")
hi

AFAIK, 작동 방식은 다음과 같습니다.

  • 먼저 내부 명령인 을 평가합니다. echo "echo hi"그 출력은 다음과 같습니다.echo hi
  • 결과 문자열은 다음을 echo hi생성하는 명령으로 실행됩니다.hi

그렇다면 다음을 hi파일 에 쓰고 싶습니다./tmp/hi

$ $(echo "echo hi > /tmp/hi")

대신, 파일 및 출력에 아무것도 쓰지 않습니다.

hi > /tmp/hi

여기서 무슨 일이 일어나고 있는 걸까요? 처음에는 문자열에 공백이 있기 때문이라고 생각했지만 다음 내용은 그 이론을 반증합니다.

$ $(echo "echo hi bob")
hi bob

답변1

bash귀하의 경우에 적용되는 매뉴얼 섹션은 다음과 같습니다.

간단한 명령 확장

간단한 명령을 실행할 때 셸은 왼쪽에서 오른쪽으로 다음과 같은 확장, 할당 및 리디렉션을 수행합니다.

  1. 파서가 변수 할당(명령 이름 앞에 오는 단어) 및 리디렉션으로 표시한 단어는 다음과 같습니다.나중에 처리하기 위해 저장.

  2. 변수 할당이나 리디렉션이 아닌 단어는 확장됩니다. 확장 후 남은 단어가 있는 경우 첫 번째 단어는 명령 이름으로 처리되고 나머지 단어는 인수로 처리됩니다.

  3. 리디렉션은 위의 "리디렉션"에 설명된 대로 수행됩니다.

  4. 각 변수 할당에서 = 뒤에 오는 텍스트는 변수에 할당되기 전에 물결표 확장, 매개변수 확장, 명령 대체, 산술 확장 및 따옴표 제거를 거칩니다.

명령 $(echo "echo hi > /tmp/hi")대체는 지점 2에서 확장되며 >지점 1에서는 나중에 처리하도록 리디렉션을 표시할 수 없으므로(명령 대체의 결과로만 나타나기 때문에) 지점 3에 따라 실행되지 않습니다.

확장하기 전에 리디렉션을 사전 처리하지 않으면 다음과 같습니다.

to='>'; echo foo $to bar

그대로 에코되는 대신 foo파일에 에코됩니다 .barfoo > bar

bash리디렉션 연산자 다음의 단어에 대해서도 분할 + 글로빙을 수행한다는 점에서 다른 쉘과 다릅니다(여러 단어로 확장되면 "모호한 리디렉션"으로 인해 종료됨) . 예를 들어, 이

var='a b'; echo > $var

다른 쉘과 마찬가지로 bash이름이 지정된 파일을 손상시키는 대신 오류가 발생합니다 .a b

관련 정보