Como faço para aninhar aspas quatro profundas?

1

Eu tenho um comando complexo que estou executando para que os usuários saiam de um sistema de arquivos quando preciso desmontá-lo. O seguinte está trabalhando

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\'''

Mas agora eu gostaria de definir um alias para ele, e não consigo descobrir como "contar aspas" como o respondente de Envolvendo um comando que inclui aspas simples e duplas para outro comando diz. O shell acaba tentando executar partes do texto de eco.

    
por Jeff 24.07.2015 / 20:27

1 resposta

1

É mais fácil se você espalhar um pouco:

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[97;101m%s[31;49m%s[97;101m%s[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\'''

É muito difícil para mim entender exatamente o que está acontecendo aqui. Mas se você quiser colocar isso em um alias, é bem simples: basta adicionar outro ' . Aqui está um truque:

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[97;101m%s[31;49m%s[97;101m%s[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\'''
IN
)"

O documento aqui é outra forma de citação shell. E todas as citações podem estar contidas em hardquotes, exceto em hardquotes. Então você pode ir a tantos níveis quanto quiser, encontrando todas as ocorrências de um disco rígido e escapando dele. Com isso quero dizer transformar cada ' em '\'' . Depois de fazer isso, você pode envolver a instrução inteira em outra camada de aspas. E, de fato, alias faz isso para você:

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[97;101m%s[31;49m%s[97;101m%s[39;49m\n" \
               "GET OUT OF UNFS" " cd ~ " "NOW!" >/dev/terms'\''\'\'\'\'
    
por 24.07.2015 / 22:15