
Ich habe diesen Einzeiler erhalten, um zu wissen, wie viel Speicher meine Prozesse verbrauchen.
$ ps -u $USER -o pid,rss,command | \
awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
Jetzt möchte ich einen Alias für diesen Befehl erstellen, habe aber ein Problem mit dem Escape '
-Zeichen:
$ alias mm=ps -u $USER -o pid,rss,command | \
awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
bash: alias: -u: not found
bash: alias: myuser: not found
bash: alias: -o: not found
bash: alias: pid,rss,command: not found
Total 0 MB
Ich habe versucht, die einfachen Anführungszeichen zu umgehen, aber es funktioniert immer noch nicht.
$ alias mm='ps -u $USER -o pid,rss,command | \
awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
>
Können Sie mir erklären, wie ich diesen Alias erstelle?
Antwort1
Um daraus einen Alias zu machen, was möglich ist, müssen Sie den gesamten Wert für den Alias in Anführungszeichen setzen. Sie müssen daher auch einige Dinge innerhalb des Alias maskieren und Sie müssen alle Feldargumente maskieren, da awk
diese von Bash ebenfalls als Argumente interpretiert werden, wenn Sie den Alias festlegen.
Das hat bei mir funktioniert:
$ alias mm="ps -u $USER -o pid,rss,command | \
awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"
Oben habe ich Folgendes getan:
Doppelte Anführungszeichen um den Alias-Wert
alias mm="ps -u ...."
Doppelte Anführungszeichen von awk entkommen
awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
Aus awk's Feldern entkommen
awk '{print \$0}{sum+=\$2} END
Würde ich das verwenden?
Wahrscheinlich nicht, ich würde dies stattdessen auf eine Bash-Funktion umstellen, da diese einfacher zu verwalten und zu verstehen ist, was vor sich geht, aber hier ist der Alias, falls Sie ihn trotzdem möchten.
Antwort2
Können Sie mir erklären, wie ich diesen Alias erstelle?
Darf ich Ihnen raten, eine Funktion zu erstellen, wenn Sie Bash verwenden, und sie in .bashrc einzufügen?
mm() {
ps -u "$USER" -o pid,rss,command |
awk '{print $0}{sum+=$2}
END {print "Total", sum/1024, "MB"}'
}
Wenn dies der Fall ist bash
, müssen Variablen in Anführungszeichen gesetzt werden. In einer Funktion muss nicht alles in eine Zeile geschrieben werden.
Antwort3
Hier ist der Escape-Befehl:
alias mm='ps -u $USER -o pid,rss,command | \
awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'
Beispiel für das Escapen von Anführungszeichen in der Shell:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Dies geschieht ganz einfach, indem man ein bereits geöffnetes beendet ( '
), ein maskiertes platziert ( \'
) und dann ein weiteres öffnet ( '
).
Alternative:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Dies geschieht, indem ein bereits geöffnetes Zitat beendet wird ( '
), ein Zitat in ein anderes Zitat eingefügt wird ( "'"
) und dann ein weiteres geöffnet wird ( '
).
Verwandt:Wie entkommt man einfachen Anführungszeichen innerhalb von Zeichenfolgen, die in einfachen Anführungszeichen stehen?bei stackoverflow SE