Wie stelle ich nproc für einen einzelnen Befehl ein?

Wie stelle ich nproc für einen einzelnen Befehl ein?

Wenn Sie eine test.shenthaltene

make -j$(nproc)

Wie könnten Sie nproc vorübergehend anpassen, etwa in etwa wie folgt nproc=1 ./test.sh?

Antwort1

Erstellen Sie einen Wrapper, der Folgendes druckt $nproc:

#!/bin/sh
[ -z "$nproc" ] && exec /usr/bin/nproc "$@"
printf '%s\n' "$nproc"

Geben Sie ihm einen Namen nproc, machen Sie es ausführbar ( chmod +x nproc) und platzieren Sie es in Ihren /special/directorybenutzerdefinierten Wrappern. Jetzt haben Sie zwei Möglichkeiten:

  1. Auf Anfrage:

    PATH="/special/directory:$PATH" nproc=1 ./test.sh
    
  2. Permanent. Ändern Sie Ihre PATHso /special/directoryist immer da als erster Eintrag. Dann können Sie einfach

    nproc=1 ./test.sh
    

Anmerkungen:

  • Wenn das Skript seine ändert (zurücksetzt, bereinigt) PATH, funktioniert die Lösung möglicherweise nicht.
  • Wenn die Variable leer oder nicht gesetzt ist, verwendet der Wrapper den tatsächlichen Wert nproc(durch seinen vollständigen Pfad, um einen rekursiven Aufruf zu vermeiden). Auf diese Weise nprocverhält sich das Programm genauso wie zuvor, es sei denn, Sie setzen die Variable auf einen nicht leeren Wert.
  • In Ihrem Beispiel $(nproc)ist nicht in Anführungszeichen gesetzt. Das bedeutet, dass Sie über die Variable zusätzliche Optionen einfügen können (z. B. nproc="2 -i", der Wrapper druckt diesen String, im Skript wird er in zwei Wörter aufgeteilt und -ian übergeben make). Sie können

    • nutzen Sie dies aus und verwenden Sie die Variable, um tatsächlich Optionen einzufügen (hacky, nicht empfohlen);
    • Stellen Sie immer sicher, dass die Variable sinnvoll ist.
    • Implementieren Sie eine Logik in den Wrapper, sodass die Wahrscheinlichkeit einer Aufteilung der Ausgabe geringer ist. Beispiel:

      set -- $nproc
      printf '%s\n' "$1"
      # word splitting done in the wrapper, only the first word is printed
      
    • (richtige Lösung) Korrigieren Sie das Skript:

      make -j"$(nproc)"
      # if the wrapper prints unexpected string, make will comply
      

Antwort2

Wenn test.shes sich um ein Bash-Skript handelt, könnte eine andere Möglichkeit darin bestehen, eine Funktion mit dem Namen zu exportieren nproc:

bash-5.0$ cat foo.sh
#! /bin/bash

echo make -j $(nproc)
bash-5.0$ ./foo.sh
make -j 8

Erstellen und Exportieren einer Funktion:

bash-5.0$ nproc() { echo function 10; }
bash-5.0$ (export -f nproc; ./foo.sh)
make -j function 10

verwandte Informationen