如何将引号嵌套四层?

如何将引号嵌套四层?

我有一个复杂的命令,在 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\''`

但现在我想为它定义一个别名,而且我似乎无法弄清楚如何“计算引号”作为答案将包含单引号和双引号的命令包装到另一个命令中说。 shell 最终尝试执行部分回显文本。

答案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
)"

这里的文档是 shell-quote 的另一种形式。除硬引号外,所有引号都可以包含在硬引号内。因此,您可以通过查找每个出现的硬引用并转义它来深入任意级别。我的意思是把每一个'都变成'\''。完成此操作后,您可以将整个语句用另一层引号括起来。事实上,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'\''\'\'\'\'

相关内容