Comportamento diferente usando conclusão de tabulação de executar 'ls'

1

Eu notei essa pergunta no ServerFault:

FreeBSD: Directory called ^C (really!) - how to remove?

Eu sabia sobre a parte ^V há muito tempo. O que me interessa nessa postagem é que o OP pode ver o caractere ^C como ^C (circunflexo seguido por C ) na conclusão da tabulação, mas não em ls . Então eu pesquiso a página de manual um pouco, e eu posso encontrar ls -b que gera ls -N3 , ^C que não faz nada de especial para ls --show-control-chars e ls que mostra um caractere Unicode na tela.

Minha primeira pergunta é, existe uma forma simples de ^C gerar o mesmo tipo de saída que a conclusão de Tabulação, ou seja, C (omissão seguido por cat -v )? ( $LANG behavior).

Minha segunda pergunta é como as variáveis ambientais $LC_* e complete afetam a saída gerada pela conclusão da tabulação (acho que está documentada em bash e talvez a seção 8 do manual Bash, mas não parece encontrar algo relevante)?

Estou usando %code% 4.3, mas soluções para outras camadas também são bem-vindas.

    
por Weijun Zhou 21.01.2018 / 20:39

1 resposta

2

Esse comportamento não é o mesmo em todos os shells.

O shell Bourne Again se comporta como você descreve, exibindo o nome do arquivo em uma notação que não corresponde a como esses caracteres são inseridos no shell. O shell TENEX C faz o mesmo. Em nenhum deles a sequência de dois caracteres ^C corresponde ao nome de arquivo de um caractere.

O shell Almquist e Korn apenas escreve o caractere de controle, que não faz nada em muitos terminais, e inclui uma largura de 1, que é assim errônea, em seus cálculos de largura de coluna ao exibir a lista de conclusão. Isso elimina o alinhamento da coluna.

O shell Z é o único shell que faz algo relacionado ao uso de entrada de comando. Sua conclusão de tabulação baseada em menu exibe o nome do arquivo como $'rm3' . Isso é exatamente o que alguém escreve com (digamos) o comando rm , e é exatamente qual preenchimento de tabulação do ZLE preencherá o comando -w , para remover o arquivo com o shell Z:

rm $'
rm $'%pre%3'
3'

Pode-se combinar com as munições de Korn e Almquist.

Isso é trivial.

A opção ls simplesmente faz com que o caractere de controle seja enviado como está, o que novamente não faz nada em muitos terminais. Mas pelo menos ls tem o nous para perceber que tem uma largura de 0 e não obtém os cálculos de alinhamento da coluna errados.

Sim, isso é FreeBSD / TrueOS ls .

E não há configuração para -B para corresponder ao comportamento dos outros.

Tanto -b como $'…' fazem com que uma seqüência octal de escape simples seja impressa, não havendo uma seqüência especial de escape C para esse caractere. Mas nenhum shell apresenta uma sequência de escape octal sem adulteração na lista de conclusão. O shell Z é o mais próximo, mas usa %code% ao redor da sequência de escape octal em suas conclusões.

Não há nada que corresponda ao modo como as camadas Bourne Again e TENEX C exibem o nome do arquivo.

Localidades

As localidades são em grande parte irrelevantes aqui. Esse caractere é um caractere de controle não imprimível, praticamente independente do local. A gama C0 (pace EBCDIC fans) é universalmente considerada como sendo de controlo.

    
por 23.01.2018 / 14:02