mk, sed 및 임베디드 환경 변수 [닫기]

mk, sed 및 임베디드 환경 변수 [닫기]

그것을 사용할 때MK, GNU sed, 변수가 전혀 확장되지 않는 것을 발견했습니다.

문제의 코드:

VAR=qux
...
build:
    sed -i "s|FOO = .*|FOO = $VAR|" bar.file

이것은 다음을 실행하는 것 같습니다:

sed -i "s|FOO = .*|FOO = $VAR|" bar.file

내가 실행하고 싶을 때

sed -i "s|FOO = .*|FOO = qux|" bar.file

다른 스택 교환 게시물에서 언급했듯이 작은따옴표와 큰따옴표를 사용해 보았습니다. 확장할 수 있는 유일한 경우 $VAR는 주위에 따옴표가 없는 경우입니다. 이는 물론 sed표현이 더 이상 표현으로 간주되지 않음을 의미합니다.

답변1

이것은 Makefile의 일부처럼 보입니다.

파일에 두 가지 오류가 있습니다.

  1. 바꾸기 명령은 구분 기호로 sed사용되지만 |중간 구분 기호는 입니다 /.

  2. Makefile 변수는 ORed 가 아닌 VAR역참조됩니다 .$VAR$(VAR)${VAR}

Makefile은 쉘 스크립트가 아닙니다. 따라서 다음 Makefile은 완전히 유효하며 qux world터미널에서 출력으로 문자열을 생성합니다 .

VAR=    qux                                        

build:                                             
        @echo 'hello world' | sed 's|hello|$(VAR)|' 

Unix Makefile에서는 $VAR변수 값으로 확장되고 V그 뒤에 문자가 옵니다 AR. 달리 명시하지 않는 한 변수 이름은 단일 문자이기 때문입니다. 다중 문자 변수 이름이 있는 경우 전체 이름을 $(...)또는 로 묶어야 합니다 ${...}.

분명히 Plan9 Makefile은 이와 관련하여 다를 수 있습니다.


고쳐 쓰다:

2.0을 사용하는 경우 다음은 mkfile올바른 값을 출력합니다.mkhello = qux

VAR=qux

all:
        echo "hello = bar" | sed "s/= bar/= $VAR/"

그래서 질문의 인용문이 나에게 맞는 것 같습니다.

답변2

이전에 이스케이프를 시도했지만 실수로 다음과 같이 큰따옴표를 넣었습니다.

sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file

그것을로 바꾸다

sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file

일하다.

관련 정보