
Мне дали эту однострочную команду, чтобы узнать, сколько памяти потребляют мои процессы.
$ ps -u $USER -o pid,rss,command | \
awk '{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'
Теперь я хотел бы создать псевдоним для этой команды, но у меня возникла проблема с экранированием '
символов:
$ 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
Я пробовал экранировать одинарные кавычки, но это все равно не работает.
$ alias mm='ps -u $USER -o pid,rss,command | \
awk \'{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}\''
>
Можете ли вы помочь мне понять, как создать этот псевдоним?
решение1
Чтобы сделать это псевдонимом, что возможно, вам нужно использовать двойные кавычки вокруг всего значения псевдонима. Вам также нужно будет экранировать несколько вещей в псевдониме в результате, и вам нужно экранировать все аргументы поля, так awk
как они будут интерпретироваться как аргументы Bash, когда вы устанавливаете псевдоним.
Мне это помогло:
$ alias mm="ps -u $USER -o pid,rss,command | \
awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}'"
Выше я сделал следующее:
Двойные кавычки вокруг значения псевдонима
alias mm="ps -u ...."
Экранированные двойные кавычки awk
awk '{print \$0}{sum+=\$2} END {print \"Total\", sum/1024, \"MB\"}
Сбежавшие поля awk
awk '{print \$0}{sum+=\$2} END
Буду ли я это использовать?
Вероятно, нет. Я бы вместо этого переключил это на функцию Bash, так как ее будет проще поддерживать и понимать, что происходит, но вот псевдоним, если он вам все еще нужен.
решение2
Можете ли вы помочь мне понять, как создать этот псевдоним?
Могу ли я посоветовать вам создать функцию, если вы используете bash, и поместить ее в .bashrc?
mm() {
ps -u "$USER" -o pid,rss,command |
awk '{print $0}{sum+=$2}
END {print "Total", sum/1024, "MB"}'
}
Если это bash
, переменные нужно заключать в кавычки. В функции не нужно размещать все в одной строке.
решение3
Вот экранированная команда:
alias mm='ps -u $USER -o pid,rss,command | \
awk '\''{print $0}{sum+=$2} END {print "Total", sum/1024, "MB"}'\'
Пример экранирования кавычек в оболочке:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
Это делается просто: завершаем уже открытый ( '
), помещаем экранированный ( \'
), а затем открываем еще один ( '
).
Альтернативно:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
Это делается путем завершения уже открытой цитаты ( '
), помещения цитаты в другую цитату ( "'"
), а затем открытия еще одной цитаты ( '
).
Связанный:Как экранировать одинарные кавычки внутри строк, заключенных в одинарные кавычки?на stackoverflow SE