따옴표를 4단계로 중첩하는 방법은 무엇입니까?

따옴표를 4단계로 중첩하는 방법은 무엇입니까?

마운트 해제해야 할 때 파일 시스템을 종료하도록 사용자에게 경고하기 위해 watch에서 실행하는 복잡한 명령이 있습니다. 다음은 작동 중입니다

watch -ben5 $'lsof /mnt/unfs && ps --no-headers -o tty -p `lsof -F p0 /mnt/unfs | sed -e "s/p//"` | xargs -I terms sudo sh -c \'echo -ne "\\n\\e[97;101mGET OUT OF UNFS\\e[31;49m cd ~ \\e[97;101mNOW!\\e[39;49m\\n" >/dev/terms\''`

하지만 이제 별칭을 정의하고 싶은데 답변으로 "따옴표 계산" 방법을 알 수 없는 것 같습니다.작은따옴표와 큰따옴표가 포함된 명령을 다른 명령으로 묶습니다.설명하다. 쉘은 결국 에코된 텍스트의 일부를 실행하려고 시도합니다.

답변1

조금 퍼뜨려 놓으면 더 쉽습니다.

watch -ben5 '
    lsof /mnt/unfs &&
    ps    -o tty= -p "$(lsof -F p0 /mnt/unfs | sed -e "s/p//")" |
    xargs -I terms sudo sh -c '\''
        printf "\n\33[97;101m%s\33[31;49m%s\33[97;101m%s\33[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\'''

여기서 무슨 일이 일어나고 있는지 정확히 이해하는 데 어려움을 겪고 있습니다. 그러나 이를 별칭에 추가하려면 매우 간단합니다. '다음은 다른 별칭을 추가하기만 하면 됩니다.

alias myalias="$(cat <<\IN
watch -ben5 '
    lsof /mnt/unfs &&
    ps    -o tty= -p "$(lsof -F p0 /mnt/unfs | sed -e "s/p//")" |
    xargs -I terms sudo sh -c '\''
        printf "\n\33[97;101m%s\33[31;49m%s\33[97;101m%s\33[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\'''
IN
)"

여기에 있는 문서는 또 다른 형태의 쉘 인용문입니다. 큰 따옴표를 제외한 모든 따옴표는 큰 따옴표로 묶일 수 있습니다. 따라서 하드 참조가 나타나는 모든 항목을 찾아서 이스케이프 처리하여 모든 수준으로 드릴다운할 수 있습니다. 내 말은 그들 모두 ''\''. 이 작업을 완료한 후에는 전체 문장을 다른 따옴표로 묶을 수 있습니다. 실제로 alias다음과 같은 작업이 수행됩니다.

alias myalias

myalias='    watch -ben5 '\''
    lsof /mnt/unfs &&
    ps    -o tty= -p "$(lsof -F p0 /mnt/unfs | sed -e "s/p//")" |
    xargs -I terms sudo sh -c '\''\'\'\''
        printf "\n\33[97;101m%s\33[31;49m%s\33[97;101m%s\33[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\''\'\'\'\'

관련 정보