Por que o 'ls' quebra de repente itens com espaços entre aspas simples?

149

Eu notei que em uma das minhas máquinas (rodando o Debian Sid) sempre que eu digito ls , qualquer nome de arquivo com espaços tem aspas simples ao redor dele.

Eu imediatamente verifiquei meus aliases, apenas para encontrá-los intactos.

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$

(foto)

Outro teste, com arquivos contendo aspas simples em seus nomes (também respondendo a uma solicitação de jimmij):

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\'''  test1.txt
'test 1.txt'          'thishasasinglequotehere'\''.txt'

(foto)

atualize com a nova saída coreutils-8.26 (que é reconhecidamente muito menos confusa, mas ainda irritante de ter por padrão). Graças a Pádraig Brady por esta impressão:

$ ls
"'test 1.txt'"   test1.txt
'test 1.txt'    "thishasasinglequotehere'.txt"

$ ls -N
'test 1.txt'  test1.txt
test 1.txt    thishasasinglequotehere'.txt

Por que isso está acontecendo? Como faço para parar corretamente?

para esclarecer, eu mesmo defini ls para colorir automaticamente a saída. Nunca colocou aspas nas coisas antes.

Estou executando bash e coreutils 8.25.

EDITAR: Aparece que os desenvolvedores de coreutils pensavam que (link) seria uma boa idéia fazer disso um padrão global apesar de quebrar o princípio do menor espanto , bem como 46+ anos de tradição UNIX.

Qualquer maneira de corrigir isso sem uma recompilação?

ATUALIZAÇÃO - Outubro de 2017 - O Debian Sid reativou o recurso de escape do shell por padrão. Isso está ficando ridículo. link

E na parte inferior da cadeia de respostas ao relatório de erros anterior, "a alteração foi intencional e permanecerá". link

Eu pensei que isso estava resolvido. Aparentemente não.

Atualização: o Android toybox ls agora está fazendo algo semelhante a isso, mas com barras invertidas, em vez de citações. Usar a opção -q faz com que os espaços sejam renderizados como caracteres de ponto de interrogação, portanto, a única correção que encontrei até agora sem fazer o root do dispositivo em questão é adicionar isso a um script e fornecê-lo ao iniciar um shell. Essa função faz com que ls use colunas se estiver em um terminal e, caso contrário, imprima uma por linha, enquanto engana ls em espaços de impressão textualmente porque está sendo executado em um canal.

ls() {
    # only way I can stop ls from escaping with backslashes
    if [ -t 1 ]; then
        /system/bin/ls -C "$@" |cat
    else
        /system/bin/ls "$@" |cat
    fi
}
    
por Wyatt8740 30.01.2016 / 07:43

3 respostas

108

Prefácio : Embora possa ser bastante satisfatório angariar uma resposta como essa e chamá-la por um dia, tenha certeza de que os desenvolvedores GNU não se importam com votos de resposta, & Se você realmente quiser incentivá-los a alterar , será preciso enviá-los por e-mail conforme essa resposta for descrita.

" Por que isso está acontecendo? "

Vários desenvolvedores de coreutils decidiram que sabiam melhor do que décadas de padrões de fato.

" Como posso pará-lo corretamente? "

link :

Bug Reports

If you think you have found a bug in Coreutils, then please send as complete a bug report as possible to <[email protected]>, and it will automatically be entered into the Coreutils bug tracker. Before reporting bugs please read the FAQ. A very useful and often referenced guide on how to write bug reports and ask good questions is the document How To Ask Questions The Smart Way . You can browse previous postings and search the bug-coreutils archive.

Distros que já reverteram esta alteração:

Distros não afetados:

  • openSUSE (já usado -N)

" Qualquer maneira de corrigir isso sem uma recompilação? "

Os proponentes querem você ...

get back to the old format by adding -N to their ls alias

... em todas as suas instalações, em qualquer lugar, pelo restante da eternidade.

    
por 14.02.2016 / 06:45
66

Você pode escolher o estilo de citação :

ls --quoting-style=literal

O mesmo que:

ls -N

ou:

QUOTING_STYLE=literal ls

Crie um alias ou defina export QUOTING_STYLE=literal no seu .bashrc para obter um comportamento anterior à 8.25.

    
por 30.01.2016 / 08:40
29

Alguns pontos sobre a mudança.

  • Foi introduzido no coreutils v8.25 e o alinhamento melhorado na v8.26
  • Isso só acontece quando a saída para terminais não quebra scripts
  • Ele desambigua a saída dos usuários para arquivos que contêm espaço em branco
  • Ele limpa a saída, por isso é seguro copiar e colar
  • A saída agora é sempre válida para copiar e colar de volta ao shell
  • Os usuários podem voltar ao formato antigo adicionando -N ao alias ls
por 30.01.2016 / 09:54