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 / 410550
Accepted
rubystallion
rubystallion
Asked: 2017-12-13 22:43:56 +0800 CST2017-12-13 22:43:56 +0800 CST 2017-12-13 22:43:56 +0800 CST

é canalizado ls o mesmo que ls -1?

  • 772

lsretorna a saída em várias colunas, enquanto ls|catretorna a saída de bytes idênticos ls -1aos diretórios que tentei. Ainda vejo ls -1canalizado em respostas, como ls -1|wc -l. Existe alguma razão para preferir ls -1? Por que ...|catalterar a saída de ls?

shell ls
  • 3 3 respostas
  • 3324 Views

3 respostas

  • Voted
  1. Best Answer
    John1024
    2017-12-13T22:58:17+08:002017-12-13T22:58:17+08:00

    lstesta se a saída está indo para um terminal. Se a saída não for para um terminal, então -1é o padrão. (Isso pode ser substituído por uma das opções -C, -mou -x.)

    Assim, quando lsé usado em um pipeline e você não o substituiu por outra opção, lsusará -1. Você pode confiar nisso porque esse comportamento é exigido pelo POSIX

    Especificação POSIX

    O POSIX requer -1como padrão sempre que a saída não for para um terminal:

    A especificação POSIX :

    O formato padrão será listar uma entrada por linha na saída padrão; as exceções são para terminais ou quando uma das opções -C, -m ou -x é especificada. Se a saída for para um terminal, o formato é definido pela implementação.

    Essas três opções que substituem o formato de coluna única padrão são:

    -C
    Grava a saída de várias colunas de texto com entradas classificadas nas colunas, de acordo com a sequência de agrupamento. O número de colunas de texto e os caracteres separadores de colunas não são especificados, mas devem ser adaptados à natureza do dispositivo de saída. Esta opção desativa a saída de formato longo.

    -m
    Formato de saída do fluxo; listar nomes de caminhos na página, separados por um caractere <vírgula> seguido por um caractere <espaço>. Use um caractere <nova linha> como terminador de lista e após a sequência separadora quando não houver espaço em uma linha para a próxima entrada da lista. Esta opção desativa a saída de formato longo.

    -x
    O mesmo que -C, exceto que a saída de coluna de texto múltiplo é produzida com entradas classificadas nas colunas, em vez de abaixo delas. Esta opção desativa a saída de formato longo.

    Documentação GNU

    Do manual do GNU ls :

    '-1'
    '--format=single-column'
    Lista um arquivo por linha. Este é o padrão para ls quando a saída padrão não é um terminal . Consulte também as opções -b e -q para suprimir a saída direta de caracteres de nova linha em um nome de arquivo. [Enfase adicionada]

    Exemplos

    Vamos criar três arquivos:

    $ touch file{1..3}
    

    Quando a saída vai para um terminal, o GNU lsescolhe usar um formato de várias colunas:

    $ ls
    file1  file2  file3
    

    Quando a saída vai para um pipeline, a especificação POSIX exige que a coluna única seja o padrão:

    $ ls | cat
    file1
    file2
    file3
    

    As três exceções que substituem o comportamento padrão de coluna única são -mpara colunas separadas por vírgula, -Cpara colunas classificadas e -xpara colunas classificadas:

    $ ls -m | cat
    file1, file2, file3
    $ ls -C | cat
    file1  file2  file3
    $ ls -x | cat
    file1  file2  file3
    
    • 28
  2. G-Man Says 'Reinstate Monica'
    2017-12-13T23:13:46+08:002017-12-13T23:13:46+08:00
    • Por que canalizar a saída padrão altera o comportamento de ls? Porque foi projetado assim. A Especificação POSIX diz:

      O formato padrão será listar uma entrada por linha na saída padrão; as exceções são para terminais ou quando uma das opções -C, -mou -xé especificada. Se a saída for para um terminal, o formato é definido pela implementação.

      que é realmente ambíguo sobre o comportamento padrão (quando não especificado por uma opção como -lou -1) com saída para um terminal, e a documentação do GNU Coreutils diz

      Se a saída padrão for um terminal, a saída será em colunas (classificadas verticalmente) e os caracteres de controle serão exibidos como pontos de interrogação; caso contrário, a saída é listada uma por linha e os caracteres de controle são exibidos como estão.

      Assim, você pode ver que a saída para um arquivo funcionará da mesma forma que a saída para um pipe; ou seja, uma entrada por linha, como se -1tivesse sido especificada.

    • Por que foi projetado dessa forma? Pode não ser possível saber com certeza (a menos que alguém encontre algumas notas de design), mas acho que:
      • Quando lsestá escrevendo em um terminal, espera que um ser humano esteja olhando para a saída. As pessoas vão preferir obter informações no mínimo necessário de linhas, para que as coisas não rolem da tela.
      • Quando lsestá gravando em um pipe, espera que outro programa esteja lendo a saída. É muito mais fácil para um programa ler dados com um valor por linha do que tentar analisar colunas (já que nomes de arquivos podem conter espaços).
    • Existe algum motivo para preferir ls -1 quando você está gravando em um arquivo ou pipe? Não.
    • 9
  3. caylee
    2017-12-13T22:53:23+08:002017-12-13T22:53:23+08:00

    Ao canalizar ls, ls não pode determinar quantas colunas o console realmente possui (independente do comando do lado direito). So ls apenas faz isso por sua própria escolha, ou seja, esse comportamento é instável e pode mudar em versões futuras.

    Por outro lado, ls -1foi criado com a finalidade de contagem ou script em geral, portanto, seu comportamento é estável.

    • -4

relate perguntas

  • Como funciona este comando? mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/f

  • FreeBSD's sh: funções de lista

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • o que grep -v grep faz

  • Como salvar um caminho com ~ em uma variável?

Sidebar

Stats

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

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

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

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +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
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +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
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +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