
test.sh
함유 하고 있는 경우
make -j$(nproc)
의 라인을 따라 nproc을 일시적으로 어떻게 조정할 수 있습니까 nproc=1 ./test.sh
?
답변1
다음을 인쇄하는 래퍼를 만듭니다 $nproc
.
#!/bin/sh
[ -z "$nproc" ] && exec /usr/bin/nproc "$@"
printf '%s\n' "$nproc"
이름을 으로 지정 nproc
하고 실행 가능하게 만들고( ) 사용자 정의 래퍼용 chmod +x nproc
으로 배치합니다 . /special/directory
이제 두 가지 옵션이 있습니다.
요청 시:
PATH="/special/directory:$PATH" nproc=1 ./test.sh
영구적인. 수정하면 항상 첫 번째 항목
PATH
이/special/directory
됩니다. 그럼 넌 그냥 할 수 있어nproc=1 ./test.sh
노트:
- 스크립트가 해당 을 변경(재설정, 삭제)하면
PATH
솔루션이 작동하지 않을 수 있습니다. - 변수가 비어 있거나 설정되지 않은 경우 래퍼는 실제를 사용합니다
nproc
(자기 자신을 재귀적으로 호출하지 않도록 전체 경로를 통해). 이 방법은nproc
변수를 비어 있지 않은 값으로 설정하지 않는 한 이전과 똑같이 작동합니다. 귀하의 예에서는
$(nproc)
인용되지 않았습니다. 이는 변수를 통해 추가 옵션을 주입할 수 있음을 의미합니다(예nproc="2 -i"
: 래퍼는 이 문자열을 인쇄하고 스크립트에서는 두 단어로 분할되어-i
에 전달됩니다make
). 당신은 할 수있다- 이것을 활용하고 변수를 사용하여 실제로 옵션을 주입하십시오(해키, 권장되지 않음).
- 항상 변수가 올바른지 확인하세요.
래퍼에 일부 로직을 구현하여 출력이 분할될 가능성을 줄입니다. 예:
set -- $nproc printf '%s\n' "$1" # word splitting done in the wrapper, only the first word is printed
(적절한 해결책) 스크립트를 수정하십시오.
make -j"$(nproc)" # if the wrapper prints unexpected string, make will comply
답변2
test.sh
bash 스크립트인 경우 다른 방법은 다음과 같은 함수를 내보내는 것입니다 nproc
.
bash-5.0$ cat foo.sh
#! /bin/bash
echo make -j $(nproc)
bash-5.0$ ./foo.sh
make -j 8
함수 생성 및 내보내기:
bash-5.0$ nproc() { echo function 10; }
bash-5.0$ (export -f nproc; ./foo.sh)
make -j function 10