単一のコマンドに対して 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。ここで、2 つのオプションがあります。

  1. オンデマンド:

    PATH="/special/directory:$PATH" nproc=1 ./test.sh
    
  2. 永続的。常に最初のエントリとして表示されるように変更します。その後PATH/special/directory

    nproc=1 ./test.sh
    

ノート:

  • スクリプトが を変更 (リセット、サニタイズ) するとPATH、ソリューションが機能しない可能性があります。
  • 変数が空であるか設定されていない場合、ラッパーは実数を使用しますnproc(再帰的に呼び出されないように完全なパスで使用します)。この方法はnproc、変数を空でない値に設定しない限り、以前とまったく同じように動作します。
  • あなたの例では は$(nproc)引用符で囲まれていません。つまり、変数を介して追加のオプションを挿入することができます(たとえばnproc="2 -i"、ラッパーはこの文字列を出力し、スクリプトでは2つの単語に分割されて-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

が bash スクリプトの場合test.sh、別の方法として、 という名前の関数をエクスポートすることもできます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

関連情報