별칭을 만들기 위해 작은 따옴표를 올바르게 이스케이프 처리하는 방법

별칭을 만들기 위해 작은 따옴표를 올바르게 이스케이프 처리하는 방법

내 프로세스가 소비하는 메모리 양을 알기 위해 이 줄을 얻었습니다.

$ 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\"}'"

위에서 나는 다음을 수행했습니다.

  1. 별칭 값은 큰따옴표로 묶입니다.

    alias mm="ps -u ...."
    
  2. awk에 대한 큰따옴표를 이스케이프하세요

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

이는 열어 놓은 인용문( ')을 완성하고, 그 인용문을 다른 인용문( "'")에 넣은 다음, 다른 인용문( )을 열어서 '수행 됩니다.

관련된:작은따옴표로 묶인 문자열에서 작은따옴표를 이스케이프 처리하는 방법은 무엇입니까?스택오버플로우 SE에서

관련 정보