Viele von Ihnen haben wahrscheinlich den Befehl gesehen, mit dem Sie in eine Datei schreiben können, für die Root-Berechtigungen erforderlich sind, auch wenn Sie vergessen haben, vim mit sudo zu öffnen:
:w !sudo tee %
Die Sache ist, dass ich nicht verstehe, was genau hier passiert.
Ich habe mir das schon gedacht:
wist dafür
*:w_c* *:write_c*
:[range]w[rite] [++opt] !{cmd}
Execute {cmd} with [range] lines as standard input
(note the space in front of the '!'). {cmd} is
executed like with ":!{cmd}", any '!' is replaced with
the previous command |:!|.
Daher werden alle Zeilen als Standardeingabe übergeben.
Der !sudo teeTeil ruft teemit Administratorrechten auf.
Damit alle Sinn machen, %sollte der Dateiname (als Parameter für tee) ausgegeben werden , aber ich kann keine Referenzen in der Hilfe für dieses Verhalten finden.
tl; dr Könnte mir jemand helfen sezieren diesen Befehl?
sudowird auf angewendet cat, aber nicht auf >, daher ist dies nicht zulässig. Sie könnten versuchen, den gesamten Befehl in einer sudo-Subshell auszuführen, :w !sudo sh -c "cat % > yams.txt"aber das funktioniert auch nicht, da in der Subshell %null ist. Sie werden den Inhalt Ihrer Datei ausblenden.
:w !sudo sh -c "cat >%"tatsächlich genauso gut, sudo tee %weil Vim den Dateinamen ersetzt, %bevor er jemals in die Subshell gelangt. Keiner von ihnen funktioniert jedoch, wenn der Dateiname Leerzeichen enthält. Sie müssen das tun :w !sudo sh -c "cat >'%'"oder :w !sudo tee "%"beheben.
:w !sudo cat > %nicht so gut funktionieren und die Standardausgabe nicht verschmutzen?