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

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

내 프로세스가 얼마나 많은 메모리를 소비하는지 알기 위해 이 한 줄짜리 정보가 제공되었습니다.

$ 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에서

관련 정보