AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 437965
Accepted
iconoclast
iconoclast
Asked: 2018-04-16 13:58:06 +0800 CST2018-04-16 13:58:06 +0800 CST 2018-04-16 13:58:06 +0800 CST

Por que o alias foo='echo "Esta é uma citação: \'"' não funciona? [duplicado]

  • 772
Essa pergunta já tem resposta aqui :
Envolvendo um comando que inclui aspas simples e duplas para outro comando (1 resposta)
Fechado há 4 anos .

Para me lembrar quando tento usar shoptem Zsh em vez de setopt, criei o seguinte alias, testando-o primeiro em um prompt de shell:

$ alias shopt='echo "You\'re looking for setopt. This is Z shell, man, not Bash."'

Apesar da correspondência das aspas simples externas e das aspas duplas internas, e do apóstrofo sendo escapado, fui solicitado a terminar de fechar as aspas com:

dquote > _

O que está acontecendo?

Parecia que o escape estava sendo ignorado ou que precisava ser escapado duas vezes por causa de vários níveis de interpretação... Então, apenas para testar essa teoria, tentei escapar duas vezes (e escapar três vezes, e ligado) todo o caminho até:

alias shopt='echo "You\\\\\\\\\\\\\\\\\\\\\\'re looking for setopt. This is Z shell, man, not Bash." '

e nunca vi nenhum comportamento diferente. Isso não faz sentido para mim. Que tipo de voodoo estranho está impedindo o shell de se comportar como eu esperava?

A solução prática é não usar aspas para echo, já que realmente não precisa de nenhuma, e usar aspas duplas para alias, e escapar do apóstrofo para que seja ignorado quando o texto for echoeditado. Então todos os problemas práticos desaparecem.

Pode me ajudar? Eu preciso de resolução para este problema desconcertante.

zsh quoting
  • 5 5 respostas
  • 8053 Views

5 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-04-16T14:06:07+08:002018-04-16T14:06:07+08:00

    Isso é zsh, cara, nãofish .

    Em zsh, como em todo shell do tipo Bourne (e também em csh), as aspas simples são aspas fortes, não há como escapar dentro delas (exceto usando as rcquotesopções sugeridas por @JdeBP, onde zshemula rcas aspas¹). Você não pode ter uma aspa simples dentro de uma string com aspas simples, você precisa primeiro fechar a string com aspas simples e inserir as aspas simples literais usando outro mecanismo de aspas (como \ou "):

    alias shopt='echo "You'\''re looking for setopt. This is Z shell, man, not Bash."'
    

    Ou:

    alias shopt='echo "You'"'"'re looking for setopt. This is Z shell, man, not Bash."'
    

    Embora você também possa fazer:

    alias shopt="echo \"You're looking for setopt. This is Z shell, man, not Bash.\""
    

    ( "..."são aspas mais fracas dentro das quais vários caracteres, inclusive \(aqui usado para escapar do embutido ") ainda são especiais).

    Ou:

    alias shopt=$'echo "You\'re looking for setopt. This is Z shell, man, not Bash."'
    

    ( $'...'é ainda outro tipo de citação de ksh93, onde o 'pode ser escapado com \').

    (e BTW, você também pode usar o padrão set -ono lugar de setoptin zsh. bash, por razões históricas, tem dois conjuntos de opções, um que você define com set -ooutro com shopt; zshcomo a maioria dos outros shells, tem apenas um conjunto de opções).


    ¹ Em rc, o shell do Plan9, com uma versão para unix-like também disponível, as aspas simples são o único mecanismo de aspas (barra invertida e aspas duplas são caracteres comuns ali), a única maneira de inserir uma aspa simples literal é com ''dentro aspas simples, então com zsh -o rcquotes, você poderia fazer:

    alias shopt='echo "Você está procurando por setopt. Aqui é Z shell, cara, não Bash."'

    • 44
  2. JdeBP
    2018-04-16T14:15:47+08:002018-04-16T14:15:47+08:00
    shopt='echo "Você\'

    Isso não é vodu. Esta é a citação normal do shell POSIX em ação. Não há mecanismo de escape dentro de strings com aspas simples . Eles sempre terminam na próxima aspa simples. Existe uma extensão do shell Z que faz com que duas strings sucessivas com aspas simples recebam uma aspa simples entre elas, que você pode empregar. Ou você pode simplesmente encerrar a string com aspas simples, usar uma aspa simples com escape (ou mesmo sem aspas simples) e, em seguida, iniciar uma segunda string com aspas simples.

    Ou você não poderia usar contrações em suas mensagens. ☺

    Leitura adicional

    • "Aspas simples" . Linguagem de comando do shell . Especificações básicas. IEEE 1003.1:2017. O Grupo Aberto
    • "Citando" . Shell Gramática . O manual do Z Shell.
    • 13
  3. Kevin
    2018-04-17T08:20:12+08:002018-04-17T08:20:12+08:00

    As outras respostas explicam bem por que você está vendo esse comportamento. Mas se eu puder fazer uma sugestão de como realmente resolver esse problema:

    Não use pseudônimos para nada nem remotamente complicado.

    Claro, você pode amarrar seu cérebro em nós tentando descobrir como aninhar N camadas de aspas, mas raramente vale a pena para um alias. Quando um alias é complicado o suficiente para que suas aspas se tornem não triviais, apenas mude para uma função shell:

    shopt(){
        echo "You're looking for setopt. This is Z shell, man, not Bash."
    }
    

    Isso remove toda uma camada de aspas, permite que você adicione mais código à função shell posteriormente e geralmente é muito mais fácil de ler. Ele também permite um controle muito mais preciso sobre como e onde os argumentos são inseridos, em vez da abordagem de alias de "apenas substitua o início da linha e deixe as palavras restantes caírem onde puderem". Por exemplo, com seu alias (corrigido), se você digitar isto:

    shopt -s some_opt
    

    ... então você obterá esta saída:

    You're looking for setopt. This is Z shell, man, not Bash. -s some_opt
    

    Provavelmente não é isso que você queria. A função shell consumirá todos os argumentos que você passar para ela e os descartará silenciosamente.

    • 13
  4. Zanna
    2018-04-16T23:50:28+08:002018-04-16T23:50:28+08:00

    Nos dias em que você não quiser lutar contra as aspas, use outro caractere como Unicode U+2019 em vez de 'apóstrofes.

    Pressione e segure Ctrl+ Shifte digite u2019e este caractere aparecerá ’(er... dependendo da sua localidade?).

    % alias shopt='echo You’re looking for setopt. This is a Z shell, woman, not Bash.'
    % shopt -s dotglob
    You’re looking for setopt. This is a Z shell, woman, not Bash. -s dotglob
    

    Tal uso de ’(U+2019) está correto porque este caractere é oficialmente destinado a ser usado como apóstrofo. O padrão Unicode, versão 10.0 , recomenda explicitamente esse uso. O padrão reconhece que '(U+0027) é comumente usado como apóstrofo devido à sua presença em ASCII e em teclados, e parece permitir isso. Mas então afirma que ’(U+2019) é o preferido para apóstrofos usados ​​como pontuação (e dá uma contração como exemplo). Os únicos apóstrofos para os quais ’(U+2019) não são preferidos são aqueles usados ​​como sinais diacríticos em vez de sinais de pontuação; esses são melhor escritos ʼ(U+02BC). De Apóstrofes (p. 276) na seção 6.2 do padrão:

    Apóstrofes

    U+0027 APOSTROFE é o caractere mais comumente usado para apóstrofe. Por razões históricas, U+0027 é um caractere particularmente sobrecarregado. Em ASCII, é usado para representar um sinal de pontuação (como aspas simples à direita, aspas simples à esquerda, pontuação de apóstrofe, linha vertical ou plica) ou uma letra modificadora (como modificador de apóstrofe ou acento agudo). Os sinais de pontuação geralmente quebram as palavras; letras modificadoras geralmente são consideradas parte de uma palavra.

    Quando o texto é definido, U+2019 DIREITO ASPA ÚNICA é preferido como apóstrofo, mas apenas U+0027 está presente na maioria dos teclados. O software geralmente oferece um recurso para converter automaticamente o APOSTROFO U+0027 em um glifo de citação curvo selecionado contextualmente. Nesses sistemas, um U+0027 no fluxo de dados é sempre representado como uma linha reta vertical e nunca pode representar um apóstrofo curvo ou uma aspa correta.

    Carta apóstrofe. U+02BC CARTA MODIFICADOR APOSTROFO é preferido quando o apóstrofo representa uma letra modificadora (por exemplo, em transliterações para indicar uma oclusiva glotal). Neste último caso, também é referido como uma apóstrofe de carta .

    Apóstrofo de pontuação. U+2019 ASSINATURA ÚNICA DIREITA é preferida quando o caractere representa um sinal de pontuação, como para contrações: “ Já estivemos aqui antes. ” Neste último caso, U+2019 também é referido como um apóstrofo de pontuação .

    Uma implementação não pode assumir que o texto dos usuários sempre adere à distinção entre esses caracteres. O texto pode vir de fontes diferentes, incluindo mapeamento de outros conjuntos de caracteres que não fazem essa distinção entre a apóstrofe da letra e a apóstrofe de pontuação/aspas simples direitas. Nesse caso, todos eles geralmente serão representados pelo U+2019.

    A semântica de U+2019 é, portanto, dependente do contexto. Por exemplo, se cercado por letras ou dígitos em ambos os lados, ele se comporta como um caractere de pontuação no texto e não separa palavras ou linhas.

    • 5
  5. iconoclast
    2018-04-16T14:04:55+08:002018-04-16T14:04:55+08:00

    Um comentário agora excluído me deu uma dica e me deixou no meio do caminho para a resposta.

    É impossível escapar de uma aspa simples dentro de uma string de aspas simples .

    Essa limitação não está presente em strings com aspas duplas, pois certamente estou escapando de uma aspa simples dentro de uma string com aspas duplas em minha solução final:

    alias shopt="echo You\'re looking for setopt. This is Z shell, man, not Bash."
    
    • 4

relate perguntas

  • Symlinking para todos os arquivos de ponto e diretórios

  • Por que o comando ecoa `echo \\\z` como saída \z?

  • Como incrementar uma variável nomeada dinamicamente em `zsh`

  • Por que não consigo definir uma variável somente leitura chamada path no zsh?

  • Sintaxe abreviada para argumentos U-Boot

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve