Uso de ^ como um metacaractere de casca

19

Eu escrevi um pequeno roteiro hoje que continha

grep -q ^local0 /etc/syslog.conf

Durante a revisão, um colega de trabalho sugeriu que ^local0 fosse citado porque ^ significa "cano" no Bourne shell. Surpreso com esta afirmação, tentei rastrear qualquer referência que mencionasse isso. Nada que encontrei na internet sugeriu que isso era um problema.

No entanto, verifica-se que a implementação de bsh (que afirma ser o shell Bourne) no AIX 7, na verdade, tem esse comportamento:

> bsh
$ ls ^ wc
      23      23     183
$ ls | wc
      23      23     183

Nenhuma das outras implementações "Bourne shell" que tentei se comportar dessa maneira (isto é, ^ não é considerado um metacaractere de shell). Eu tentei sh no CentOS (que é realmente bash), e sh no FreeBSD (que não é bash). Eu não tenho muitos outros sistemas para tentar.

Esse comportamento é esperado? Quais shells consideram ^ um metacaractere de pipe?

    
por Greg Hewgill 09.12.2013 / 01:43

3 respostas

18

O caractere ^ como sinônimo de | data do shell Thompson . Eles foram apresentados ao mesmo tempo no Unix v4 e são mencionados juntos na página do manual . Sven Mascheck menciona que ^ foi “provavelmente [introduzido] por razões de conveniência no início de maiúsculas somente terminais ", onde digitar | foi" um pouco doloroso ".

A casca de Thompson desapareceu há muito tempo, mas o seu sucessor Bourne shell manteve a mesma sintaxe (apesar de sua man page menciona apenas | ).

Shells sucessores como ash, bash e ksh entendem apenas | como o caractere de pipe. Você não encontrará um shell Bourne real em variantes unix de código-fonte aberto, já que há muito tempo não havia nenhum release de código aberto do shell Bourne. (Eu acho que o OpenSolaris incluiu um, mas não foi adotado em outro lugar, já que por esse tempo ele ficou obsoleto por novas implementações).

A especificação Unix única não menciona ^ como um caractere especial, que efetivamente significa que os shells POSIX devem interpretá-lo literalmente. Eu acho que nunca houve uma variante totalmente compatível com POSIX do shell Bourne (apenas implementações independentes).

^ é especial em zsh quando a opção extendedglob está ativada, mas não em seu modo de compatibilidade sh. Em seu modo padrão, ele se afasta do POSIX de várias maneiras.

Eu recomendo citar ^ em uma expressão regular de qualquer forma para maior clareza. Cite a expressão regular em um script, independentemente de quais caracteres aparecem nela.

¹ Exceto como o primeiro caractere de uma expressão de colchetes em um padrão curinga, em que ! é o caractere de negação padrão, mas as implementações também podem interpretar ^ da mesma maneira.

    
por 09.12.2013 / 03:00
3

Acontece que ^ parece ser um recurso não documentado do shell do SVR 4.2. De GNU Bash Apêndice B Principais Diferenças da Bourne Shell :

  • The SVR4.2 shell treats ‘^’ as the undocumented equivalent of ‘|’.
    
por 09.12.2013 / 02:57
2

Sim, o OpenSolaris inclui a fonte Bourne Shell, mas essa fonte não é portátil.

Uma versão mantida e altamente portátil da fonte Bourne Shell pode ser encontrado aqui nos arquivos schily-*.tar.bz2 .

Aqui está a parte relacionada da fonte em cmd.c :

/* 
* ^ is a relic from the days of UPPER CASE ONLY tty model 33s 
*/ 
if ((t = item(TRUE)) != 0 && (wdval == '^' || wdval == '|')) 

Você vê, isso não está relacionado a um shell específico (por exemplo, o shell Thompson) mas para o fato de que na década de 1970 ainda só havia maiúsculas terminais ao redor.

    
por 25.06.2015 / 11:23