
Wenn Sie eine test.sh
enthaltene
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/directory
benutzerdefinierten Wrappern. Jetzt haben Sie zwei Möglichkeiten:
Auf Anfrage:
PATH="/special/directory:$PATH" nproc=1 ./test.sh
Permanent. Ändern Sie Ihre
PATH
so/special/directory
ist immer da als erster Eintrag. Dann können Sie einfachnproc=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 Weisenproc
verhä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-i
an übergebenmake
). 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.sh
es 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