source

Makefile targets에서 Bash 구문을 사용하려면 어떻게 해야 합니까?

lovecheck 2023. 4. 27. 22:33
반응형

Makefile targets에서 Bash 구문을 사용하려면 어떻게 해야 합니까?

나는 종종 Bash 구문이 매우 유용하다고 생각합니다. 예를 들어, 다음과 같은 프로세스 대체가 있습니다.diff <(sort file1) <(sort file2).

Makefile에서 이러한 Bash 명령을 사용할 수 있습니까?저는 다음과 같은 것을 생각하고 있습니다.

file-differences:
    diff <(sort file1) <(sort file2) > $@

나의 GNU Make 3.80에서 이것은 사용하기 때문에 오류를 줄 것입니다.sh대신에bash명령을 실행합니다.

GNU Make 설명서에서 볼 수 있습니다.

5.3.2 Choosing the Shell
------------------------

The program used as the shell is taken from the variable `SHELL'.  If
this variable is not set in your makefile, the program `/bin/sh' is
used as the shell.

그래서 넣어요SHELL := /bin/bash당신의 메이크파일 맨 위에, 그리고 당신은 가도 좋을 것입니다.

BTW: 적어도 GNU Make에 대해서는 하나의 대상에 대해서도 이 작업을 수행할 수 있습니다.각 대상에는 다음과 같은 고유한 변수 할당이 있을 수 있습니다.

all: a b

a:
    @echo "a is $$0"

b: SHELL:=/bin/bash   # HERE: this is setting the shell for b only
b:
    @echo "b is $$0"

인쇄됩니다.

a is /bin/sh
b is /bin/bash

자세한 내용은 설명서의 "대상별 변수 값"을 참조하십시오.이 줄은 Makefile에서 원하는 위치로 이동할 수 있습니다. 대상 바로 앞에 있을 필요는 없습니다.

전화할 수 있습니다.bash직접적으로, 사용-c플래그:

bash -c "diff <(sort file1) <(sort file2) > $@"

물론 $@ 변수로 리디렉션하지 못할 수도 있지만, 제가 이 작업을 시도했을 때, 저는-bash: $@: ambiguous redirect오류 메시지로, 당신은 이것에 너무 빠져들기 전에 그것을 조사하는 것이 좋을 것입니다. (그러나 나는 bash 3.2.something을 사용하고 있어서 당신의 것은 다르게 작동할 수도 있습니다.)

한 가지 방법은 대상의 첫 번째 줄에 이렇게 입력하는 것입니다.

your-target: $(eval SHELL:=/bin/bash)
    @echo "here shell is $$0"

휴대성이 중요한 경우 Makefile의 특정 셸에 의존하지 않을 수 있습니다.모든 환경에 사용 가능한 bash가 있는 것은(는)

기본 셸을 사용하는 대신 Makefile 내에서 bash를 직접 호출할 수 있습니다.

bash -c "ls -al"

다음 대신:

ls -al

SHELL 변수를 bash를 가리키도록 명시적으로 설정하지 않고 이 작업을 수행하는 방법이 있습니다.SHELL은 후속 makefile에 의해 상속되지 않거나 환경에서 가져오지 않으므로 makefile이 많은 경우 유용합니다.또한 코드를 컴파일하는 모든 사용자가 이러한 방식으로 시스템을 구성해야 합니다.

실행하는 경우sudo dpkg-reconfigure dash프롬프트에 '아니오'라고 대답하면 시스템에서 대시를 기본 셸로 사용하지 않습니다.그런 다음 적어도 Ubuntu에서는 bash를 가리킵니다.그러나 시스템 셸로 대시를 사용하는 것이 좀 더 효율적입니다.

질문에 대한 직접적인 답변이 아닙니다. 제한적이기 때문입니다. 파일을 bash 구문으로 교체하고 경우에 따라 유용할 수 있습니다(저는 작성자입니다).

  • 규칙을 bash-vlan으로 정의할 수 있습니다.
  • 자동 변환 기능

기본적인 생각은 가지고 있는 것입니다.while스크립트 끝의 루프:

while [ $# != 0 ]; do
  if [ "$(type -t $1)" == 'function' ]; then
    $1 
  else
    exit 1
  fi 
  shift
done

https://asciinema.org/a/435159

언급URL : https://stackoverflow.com/questions/589276/how-can-i-use-bash-syntax-in-makefile-targets

반응형