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 / 766570
Accepted
aviro
aviro
Asked: 2024-01-10 18:43:55 +0800 CST2024-01-10 18:43:55 +0800 CST 2024-01-10 18:43:55 +0800 CST

O comportamento de bash -c "<comando único>" está documentado?

  • 772

É bem sabido que ao executar bash -c "COMMAND"(pelo menos nas versões comuns do Linux) quando há um único comando sem nenhum metacaractere (exceto space , tab ou newline ), o bash -cprocesso não irá bifurcar, mas sim substituir-se executando COMMANDdiretamente com execvea chamada do sistema para otimização, então o resultado será apenas um processo.

$ pid=$$; bash -c "pstree -p $pid"
bash(5285)───pstree(14314)

Se houver algum metacaractere (como redirecionamento) ou mais de um comando (que requer um metacaractere de qualquer maneira), bashserá bifurcado para cada comando executado.

$ pid=$$; bash -c ":; pstree -p $pid"
bash(5285)───bash(28769)───pstree(28770)

$ pid=$$; bash -c "pstree -p $pid 2>/dev/null"
bash(5285)───bash(14403)───pstree(14404)

Este é um recurso de otimização não documentado (o que significa que não é garantido) ou está documentado em algum lugar e garantido?


Nota: Presumo que nem todas as versões bashse comportem assim e que em algumas versões que o fazem, é apenas considerado um detalhe de implementação e não garantido, mas gostaria de saber se talvez existam pelo menos algumas bashversões que suportem explicitamente isso e documentem a condição por esta. Por exemplo, se houver um único ;caractere após o comando, sem nenhum segundo comando, bashainda execvenão haverá bifurcação.

$ pid=$$; bash -c "pstree -p $pid ; "
bash(17516)───pstree(17658)

Antecedentes da minha pergunta

Como mencionei, esse comportamento é bastante conhecido 1 2 por bashusuários experientes e estou familiarizado com ele há muito tempo.

Alguns dias atrás, encontrei o seguinte comentário no shell bash interativo: Defina o diretório de trabalho por meio de opções de linha de comando onde @dave_thompson_085 escreveu:

bashexecuta automaticamente (ou seja, substitui-se por) o último (ou único) comando em -c.

Eu respondi que isso só é verdade se houver um único comando. Mas então me perguntei: existem algumas versões em bashque talvez o último comando seja exec ed e não bifurcado, mesmo que haja outro comando antes dele? E em geral, há casos em que esse comportamento é garantido? Certas bashversões expõem (e elaboram) esse recurso fora do código-fonte?

Referências adicionais

  • 1 Por que não há clone ou fork aparente no comando bash simples e como isso é feito?
  • 2 Por que o bash não gera um subshell para comandos simples?
bash
  • 1 1 respostas
  • 1112 Views

1 respostas

  • Voted
  1. Best Answer
    Chris Down
    2024-01-10T21:05:16+08:002024-01-10T21:05:16+08:00

    O uso execé um detalhe de implementação - se não estiver documentado, o comportamento não será garantido em nenhuma versão. Talvez seja útil explicar um pouco por que tendemos a não documentar esse tipo de coisa com base na minha experiência no desenvolvimento de outro software amplamente utilizado (o kernel Linux).

    Em geral, para qualquer software amplamente utilizado, geralmente tenta-se descrever apenas os recursos, a operação e os comportamentos padrão. Normalmente evita-se aprofundar as especificidades das otimizações internas por medo de criar dependências posteriores nesse comportamento.

    Como um exemplo da minha própria área de trabalho, trabalho no gerenciamento de memória do kernel e não procuramos documentar detalhadamente (por exemplo) exatamente como funcionam os internos de priorização de recuperação ou exatamente quando coisas como a verificação de LRU são executadas. Documentar isso tornaria as decisões futuras sobre otimizações e outras mudanças muito mais complicadas de serem tomadas, porque agora temos que considerar se estamos quebrando alguma dependência downstream intangível e desconhecida.

    Da mesma forma, no caso do bash ou de qualquer outro sistema de software complexo, mecanismos internos como a decisão de usar execem vez de bifurcar um novo processo podem estar sujeitos a alterações, mesmo com um aviso muito curto. Imagine se houver novas otimizações de desempenho, considerações de segurança ou problemas de compatibilidade que exijam o não uso repentino do exec. Queremos realmente estar vinculados por contrato para continuar a operar dessa forma? Claro que não.

    No bash, e na maioria dos outros projetos amplamente utilizados, há uma forte ênfase na manutenção de uma interface externa estável e bem definida que contenha apenas as coisas consideradas necessárias para serem expostas, permitindo que a implementação interna evolua conforme necessário. Esta abordagem garante que o software permaneça robusto, seguro e eficiente, sem sacrificar a capacidade de inovar e melhorar.

    Então, para responder à sua pergunta, não, isso não está documentado e você não deve confiar nisso. Também é altamente improvável que este ou outros casos semelhantes sejam documentados, porque adicionar restrições internas tornaria o desenvolvimento muito mais rígido.

    • 16

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

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

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +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

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