Der $()
Operator führt Befehl Substitution an der Arbeit. Wenn die gesamte Befehlszeile erweitert wird, wird der Befehl innerhalb der Klammern ausgeführt, und das gesamte Konstrukt wird durch die Ausgabe des Befehls ersetzt. Nachdem alle Erweiterungen ausgeführt wurden, wird die resultierende Zeile als Befehl ausgeführt.
Betrachten wir also diese vereinfachte Version des Befehls:
$(find /etc -regex ".*\.conf") >> /home/mux/Desktop/AllFilesOfconf.txt
Auf meinem System, das
/etc/rsyslog.conf /etc/pnm2ppa.conf ... /etc/updatedb.conf >> /home/mux/Desktop/AllFilesOfconf.txt
Hinweis an dieser Stelle auf einen ginormous Befehl des Formulars erweitern, dass die Umleitung getrennt von und daher unabhängig von dem Befehl in der Befehlsersetzung. Das Erweitern der Befehlsersetzung führt daher dazu, dass nichts in die Zieldatei geschrieben wird.
Aber wir sind nicht fertig! Das war nur die Erweiterung. Bash versucht nun, das Ergebnis als Befehl auszuführen. Im obigen Beispiel wird versucht, /etc/rsyslog.conf
als Befehl auszuführen, wobei alle anderen Dateinamen als Argumente verwendet werden und die Ausgabe wie angegeben umgeleitet wird. Aber /etc/rsyslog.conf
ist nicht ausführbar, so dass dies fehlschlägt und eine Meldung "Berechtigung verweigert" erzeugt. Ich bin mir sicher, dass Sie daraus ableiten können, welche Auswirkungen verschiedene Erweiterungen haben würden.
Ich glaube nicht, dass Sie eine Befehlsersetzung überhaupt ausführen, sondern nur den Befehl ausführen und seine Ausgabe an die angegebene Datei umleiten. Das wäre einfach sein:
sudo find $root -regex ".*\.${fileExtension}" >> /home/mux/Desktop/AllFilesOf${fileExtension}.txt
Update:
Wie @CharlesDuffy beobachtet, die Umleitung wird in diesem Fall mit den Rechten des Benutzers/Prozess ausgeführt, um das Skript ausgeführt wird, so wie es ist in Ihrem ursprünglichen Beispiel. Ich nehme an, dass dies beabsichtigt und korrekt ist - dh das Skript wird vom Benutzer 'mux' oder von einem anderen Benutzer ausgeführt, der Zugriff auf das Verzeichnis Desktop
von mux hat und auf alle vorhandenen Dateien, die das Skript erstellen oder aktualisieren könnte . Wenn das nicht der Fall ist, und Sie müssen die Umleitung auch sein privilegiert, dann kann man es wie so erreichen:
sudo -s <<END
find $root -regex ".*\.${fileExtension}" >> /home/mux/Desktop/AllFilesOf${fileExtension}.txt
END
Das läuft eine interaktive Shell über sudo
mit seiner Eingabe vom heredoc umgeleitet wird . Die Variablenerweiterungen werden in der Host-Shell ausgeführt, von der sudo ausgeführt wird. In diesem Fall wird die Umleitung mit der Identität durchgeführt, die über sudo
erhalten wurde, was sich auf die Zugriffskontrolle auswirkt, sowie auf die Eigentümerschaft der Datei, wenn eine neue erstellt wird. Sie könnten einen chown
-Befehl hinzufügen, wenn Sie nicht möchten, dass die Ausgabedateien im Besitz von root sind.
"Tried' tee' "** wie **, genau? Sie müssen das 'sudo' auf den Befehl' tee' anwenden; Du kannst nicht 'sudo ... | tee outfile "und erwarte, dass es funktioniert, es muss' sudo ... | sein sudo tee outfile'. –