significado de “'” (apóstrofo) nos comandos do terminal

11

Por algum motivo estranho, tentei "'" como separador de palavras nos identificadores, como em:

$ export foo'bar=1
> 
> ^C
$ 

O resultado é, como mostrado acima, id est o prompt muda para ">" eo sistema, obviamente, aguarda mais informações da minha parte. Como você vê, eu tive que pressionar Ctrl-C para escapar. O mesmo acontece com outros comandos, como

$ ls foo'bar
$ mkdir foo'bar

Estou curioso sobre o sentido de tudo isso, é isso que o significado especial "'" tem nos comandos do terminal (tão especial que é desmontado mesmo dentro dos IDs).

Extra: Como um aparte, eu também gostaria de saber o conjunto de caracteres especiais ou inválidos nos nomes de arquivos e pastas, nos sistemas Unix e Windows (para obter o subconjunto comum dos seguros) (em particular, o que acontece com todos não ASCII?).

Obrigado Denis

denis 63
fonte
No mundo Linux, todos os caracteres, exceto \ 0 (nulo) e / são permitidos. No entanto, isso não significa que todos sejam aconselháveis. Muitas pessoas consideram melhor evitar caracteres que tenham um significado especial para o shell. Se você deseja saber sobre o Windows, consulte uma referência do Windows.
21812 Scott Severance

Respostas:

15

O caractere 'é um caractere muito poderoso sempre que usado em qualquer comando do shell. Basicamente, o '(marcas de apóstrofo) desativa todos os tipos de transformações ou modificações. Consideraria o que estiver incluído nas marcas 'como uma única entidade, ou seja, um único parâmetro. Absolutamente nenhum tipo de substituição ou expansão aconteceria.

Exemplo:

 $ echo '$HOME'

produziria na saída a $HOMEprópria string e não imprimiria o caminho para o diretório inicial. Como as aspas simples impedem qualquer tipo de expansão, a substituição e o simples consideram o que quer que esteja presente como um simples parâmetro em si.

Se você deseja usar o apóstrofo como ele é, precisa escapar:

 $ mkdir foo\'bar

 $ cd foo\'bar

Se não for escapado, ele aguardará o fechamento do par, como aconteceu no seu primeiro exemplo.

Então, corrigido, seu comando será:

 $ export foo\'bar=1

NOTA: Como Milan Todorovic notou, isso não será válido, porque você não pode usar apóstrofo neste caso.

Frantique
fonte
1
@ denis63 por favor, aceite a resposta se é o que você precisava ver :)
Rinzwind
7

Personagem 'é um personagem especial. Você o usa para marcar parte da entrada da linha de comando que não será alterada (por exemplo, nenhum substituto para caracteres curinga). Por exemplo:

$ ls 'bla*'
ls: cannot access bla*: No such file or directory

Isso significa que o argumento para lswas bla*e não tudo o que começa com bla.

A razão pela qual você obtém um >personagem é porque você deve usar um 'para abrir e outro 'para fechar a parte que não será alterada.

Se você quiser usar 'em nomes de pastas que você deve escapar assim: \'. Portanto, se você deseja listar a pasta com o nome foo'bar, digite ls foo\'bar.

Ah, e não tenho certeza se é possível usar 'em nomes de variáveis ​​de ambiente. Eu acho que você não pode usar export foo\'bar=1,

Espero que isto ajude.

Milan Todorovic
fonte
Voto positivo para sua observação sobre a restrição de nome de variável de ambiente.
Frantique
Ainda não posso votar (novo no askubuntu), mas o sentimento está lá. Verificado sobre os nomes env var, é exatamente como você diz. (Eu me sinto um pouco estúpido por não ter pensado em abrir / fechar delimitadores, mas depois considerei "'" um apóstrofo real, não uma citação). Denis
denis 63