
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 つのオプションがあります。
オンデマンド:
PATH="/special/directory:$PATH" nproc=1 ./test.sh
永続的。常に最初のエントリとして表示されるように変更します。その後
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