So umgehen Sie einfache Anführungszeichen richtig, indem Sie einen Alias ​​erstellen

So umgehen Sie einfache Anführungszeichen richtig, indem Sie einen Alias ​​erstellen

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 awkdiese 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:

  1. Doppelte Anführungszeichen um den Alias-Wert

    alias mm="ps -u ...."
    
  2. Doppelte Anführungszeichen von awk entkommen

    awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
    
  3. 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

verwandte Informationen