Wie gebe ich unter Nix einen Pfad zu einer ausführbaren Datei für eine Systemd-Unit-Datei an?

Wie gebe ich unter Nix einen Pfad zu einer ausführbaren Datei für eine Systemd-Unit-Datei an?

Ich versuche, eine systemd-Unit-Datei zu schreiben.

Wie gebe ich den Pfad zu einer ausführbaren Datei an? Wie kann ich bestimmen, was verwendet werden soll?

In diesem speziellen Fall versuche ich, zu verwenden mkdir.

ExecStartPre = "/bin/mkdir -p %h/.config/example/pending/";

Dies führt allerdings zu einem Fehler beim Starten der Unit-Datei:

Jan 16 08:46:11 nixos systemd[19577]: example.service: Failed at step EXEC spawning /bin/mkdir: No such file or directory

Ich nehme an, ich könnte einfach verwenden, whichum den Pfad zu mkdir zu finden – aber ich sehe ein ${pkgs.nameOfPackage}in der Nix-Konfiguration von anderen – sollte ich also möglicherweise stattdessen dies verwenden?

which mkdir
/run/current-system/sw/bin/mkdir

Antwort1

Im Allgemeinen ${pkgs.nameOfPackage}ist dies die bevorzugte Syntax.

Für Ihr konkretes Beispiel mkdirist m Teil des Coreutils-Pakets; das (Wortspiel beabsichtigt) können Sie mit dem Befehl ermitteln readlink $(which mkdir). Ihre Zeile sollte also lauten:

ExecStartPre=${pkgs.coreutils}/bin/mkdir BLAH BLAH BLAH

Während coreutils immer AFIK installiert wird, besteht ein schöner Vorteil der ${pkgs.nameOfPackage}Syntax darin, dass Sie das Paket nicht installieren müssen nameOfPackage; Nix lädt es für Sie herunter.

Antwort2

Erstens brauchen Sie diese Leerzeichen und Anführungszeichen nicht.

ExecStartPre=/run/current-system/sw/bin/mkdir -p %h/.config/example/pending

Zweitens, haben Sie den Befehl auf Ihrem System so ausprobiert, wie er geschrieben ist? In Ihrer Shell:

mkdir -p ~/.config/example/pending

Und schließlich bezieht sich %h auf das Home-Verzeichnis des Benutzers. Aber vielleicht zielt Ihr System auf einen anderen Ort ab, da der Befehl mkdir nicht an der richtigen Stelle steht. echo ~um Ihr Home-Verzeichnis anzuzeigen.

verwandte Informationen