Ich möchte den install
Befehl verwenden, um eine neue ausführbare Datei mit vorab ausgefülltem Inhalt zu erstellen (z. B. mit einem einzelnen pwd
Befehl).
Also habe ich dieses Beispiel erweitert, das eine neue leere ausführbare Datei erstellt:
install -b -m 755 /dev/null newfile
in diesen:
install -m755 <(echo pwd) newfile
oder:
echo pwd | install -m755 /dev/stdin newfile
Wo ich erwarte, eine neue newfile
ausführbare Datei zu erstellen, die mit Inhalten pwd
darin erstellt wird.
Es funktioniert unter Linux, schlägt jedoch unter OS X mit dem folgenden Fehler fehl:
BSD
install
(/usr/bin/install
)install
/dev/fd/63
:: Unangemessener Dateityp oder FormatGNU
install
(/usr/local/opt/coreutils/libexec/gnubin/install
)install: Datei
/dev/fd/63
wird übersprungen , da sie beim Kopieren ersetzt wurde
Warum funktioniert das nicht unter Unix, aber unter Linux? Ich vermisse etwas? Gibt es eine Möglichkeit, die obige Warnung mit einer anderen Syntax zu umgehen ( ohne eine Datei in separaten Befehlen zu erstellen und chmod
danach zu verwenden)?
In beiden Umgebungen (Linux & OS X) habe ich dieselbe Version von install
:
$ install --version
install (GNU coreutils) 8.23
install -m755 <(echo pwd) newfile
auf einercentOS 7
Maschine ausprobiert und sie hat korrekt funktioniert. Die Verwendung der Syntaxinstall -m755 <(echo pwd)> newfile
führte jedoch zu dem Fehler, den Sie erhalten. Mir ist klar, dass dies Ihnen nicht implizit hilft, aber es zeigt, dass Ihre Prämisse zumindest solide ist. Es sollte funktionierenzsh
, können Sie die=(cmd)
Syntax anstelle von versuchen<(cmd)
. Vom Mann: "Wenn=(...)
anstelle von verwendet wird<(...)
, ist die als Argument übergebene Datei der Name einer temporären Datei, die die Ausgabe des Listenprozesses enthält. Dies kann anstelle des<
Formulars für ein Programm verwendet werden, das dies erwartetlseek
(siehelseek(2)
) in der Eingabedatei. " Ansonstenmkfifo
ist Ihre beste Wahl.cp
. Dies ist nur ein Beispiel: permalink.gmane.org/gmane.os.cygwin/129935install
Versionen.Antworten:
Die auf OpenBSD-Systemen gefundene BSD-Installation enthält diesen Code (von
src/usr.bin/xinstall/xinstall.c
):Dies gibt den Fehler aus
Wenn festgestellt wird, dass
/dev/df/4
es sich nicht um eine reguläre Datei handelt. (Es gibt eine separate frühere Prüfung für/dev/null
)Das war ziemlich einfach.
GNU
install
hat diesen Code (src/install.c
incoreutils
):Der Code, der den Fehler ausgibt, stammt von
src/copy.c
:(ein paar Zeilen weggelassen)
Hier wird
copy_reg()
eine reguläre Datei kopiert. DasSAME_INODE
Makro wird als falsch ausgewertet, da sich die Inodes in den beidenstat
Strukturen*src_sb
und unterscheidensrc_open_sb
. Das*src_sb
kommt von einemstat()
oderlstat()
Anruf auf dem Quelldateinamen undsrc_open_sb
vonfstat()
oben gesehen, auf einen neu geöffneten Descriptor.Ich kann sehen, warum das Öffnen eines neuen Dateideskriptors und der Vergleich seines Inodes mit dem des von der Shell angegebenen Dateideskriptors (
/dev/fd/4
in meinem Fall) fehlschlägt, aber ich kann ihn leider nicht in bestimmte Worte fassen.quelle