Ubuntu: Makefile에서 터미널 출력 실행

Ubuntu: Makefile에서 터미널 출력 실행

다른 명령의 출력 역할을 하는 명령이 있습니다. 이 출력을 makefile 스크립트에서 실행하고 싶습니다.

재현할 수 있는 더 간단한 명령은 다음과 같습니다.

awsecrpush:
    VAR=$$( sudo echo "ls -lah" ) | bash -c "sudo -s $$VAR"

내 결과는 무엇입니까?

  • 달리기만들다
    $만들다
    VAR=$( sudo echo "ls -lah" ) | VAR=$( sudo echo "ls -lah" ) |
    에코 $VAR
    {빈 출력}
  • 하지만 달리고 있어LS 풀, 예상대로 작동합니다. 이것이 내가 원하는 Makefile 콘텐츠입니다.
$ls-lah
합계 405
-rw-rw-r-- 1 GaryGary405 7월 22일 10:59 Makefile

실행해야 할 복잡한 명령이 있으므로 이는 문제를 단순화하기 위한 것입니다.

앞에 SUDO를 추가해야 하기 때문에 이 접근 방식이 필요합니다.LS 풀

답변1

문제는 를 사용하면 |별도의 하위 쉘에서 두 개의 명령(할당 VAR및 이를 사용하는 명령)을 실행하므로 sudo한 쉘에서 변수를 설정하는 동시에 다른 쉘에서 사용하려고 한다는 것입니다.

또한 첫 번째 명령의 출력을 두 번째 명령의 표준 입력으로 실제로 파이프하지 않기 때문에 실제로 파이프가 필요하지 않습니다( ls실제로 표준 입력에서는 아무것도 얻지 못합니다).

이 작업을 수행하려면 |a로 바꾸십시오 . ;( 변수의 내용을 생성한 명령이 성공한 경우에만 해당 부분을 실행하므로 &&사용하기에도 좋습니다 .)sudo

make쉘은 일반적으로 레시피의 각 라인에 대해 생성되므로 두 가지를 같은 라인에 배치해야 합니다 . 둘 다 동일한 셸에서 실행되어야 합니다. 그렇지 않으면 VAR한 셸에서 설정하고 다른 셸에서 사용하려고 하면 다시 작동하지 않습니다.

awsecrpush:
        VAR=$$( sudo echo "ls -lah" ) && bash -c "sudo -s $$VAR"

또 다른 가능성은 Make 변수를 사용하는 것입니다. 서브쉘에 대해 너무 많이 걱정할 필요가 없기 때문에 이것은 더 유연합니다.

GNU make가 있다고 가정하면 다음을 사용할 수 있습니다.쉘 기능첫 번째 명령을 실행하고 해당 출력을 Make 변수에 저장합니다.

awsecrpush:
        VAR := $(shell sudo echo "ls -lah")
        sudo -s $(VAR)

관련 정보