
다른 명령의 출력 역할을 하는 명령이 있습니다. 이 출력을 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)