단일 명령에 대해 nproc을 설정하는 방법은 무엇입니까?

단일 명령에 대해 nproc을 설정하는 방법은 무엇입니까?

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이제 두 가지 옵션이 있습니다.

  1. 요청 시:

    PATH="/special/directory:$PATH" nproc=1 ./test.sh
    
  2. 영구적인. 수정하면 항상 첫 번째 항목 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.shbash 스크립트인 경우 다른 방법은 다음과 같은 함수를 내보내는 것입니다 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

관련 정보