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 / computer / Perguntas / 1620933
Accepted
Io-oI
Io-oI
Asked: 2021-01-27 06:40:14 +0800 CST2021-01-27 06:40:14 +0800 CST 2021-01-27 06:40:14 +0800 CST

Isso seria um bug? Fechamento imediato da janela cmd atual ao executar: move nul 2>&0

  • 772

Eventualmente, eu uso move nul 2>&0em meus scripts para fechar "abruptamente" a corrente da janela cmd e, assim, abortar/fechar imediatamente o bat em execução.

Não posso dizer que funciona como um suicídio no roteiro, mas costumo chamar assim.

Na verdade, isso resulta em um auto-kill que estende/alcança o efeito também na janela cmd atual.

É algo diferente de apenas fechar/terminar um morcego em execução.

Basicamente uso para alguns batches onde o valor da variável "%cmdcmdline%"para uma resposta executando invocado por click, ao invés de simplesmente fechar o bat, fechando também a janela que foi ativada/carregada clicando no bat.

O que eu me pergunto é:

  1. O que explica esse comportamento?
  2. É um bug?
  3. No futuro pode não se comportar da mesma forma?

Alguns exemplos de códigos:

@echo off 

title <nul 
title to kill or not to kill?

mode 50,05

echo\%cmdcmdline%|find "%~0" >nul && (
     echo\
     echo\ so sorry bro, I'll kill myself
     echo\ and this CMD.exe window too!
     
     timeout 5 /nobreak 
     move nul 2>&0 
   )

echo/ will run this code bro!
echo/
echo/ keep itself alive: %date% %time:~0,5%
echo/
pause
windows command-line
  • 1 1 respostas
  • 1411 Views

1 respostas

  • Voted
  1. Best Answer
    dbenham
    2021-01-27T11:22:22+08:002021-01-27T11:22:22+08:00

    Eu luto com sua frase "janela cmd atual" - não tenho certeza do que você quer dizer. Na minha cabeça você está combinando dois conceitos distintos

    • Existe o processo do console - análogo, mas não exatamente o mesmo que um terminal
    • E há o processo cmd.exe que está sendo executado na janela do console

    Seu comando está travando o processo cmd.exe e seu processo de console é encerrado corretamente porque não tem mais um processo em execução dentro dele.

    Isso é fácil de provar se você executar seu comando em um processo cmd.exe filho extra - o cmd.exe filho falha, mas o pai permanece válido, então a janela do console também permanece em execução. Aqui está um exemplo a partir de um novo processo cmd.exe em execução no console.

    Microsoft Windows [Version 10.0.18363.1256]
    (c) 2019 Microsoft Corporation. All rights reserved.
    
    P:\>set context=outer
    
    P:\>cmd
    Microsoft Windows [Version 10.0.18363.1256]
    (c) 2019 Microsoft Corporation. All rights reserved.
    
    P:\>set context=inner
    
    P:\>move nul 2>&0
    
    P:\>set context
    context=outer
    
    P:\>
    

    O fato de contexto = externo no final prova que o ambiente interno foi perdido, a razão é que o processo interno caiu. Se eu emitir o comando EXIT, o processo cmd.exe externo será encerrado e o console será fechado.

    Agora, por que seu comando trava cmd.exe. Não há nada de especial no uso do MOVEcomando ou do nuldispositivo. A parte crítica é que o cmd.exe está tentando escrever uma mensagem de erro para stderr depois de ter sido redirecionado para stdin. Obviamente, isso não pode funcionar, então a gravação falha - este é o gatilho que faz com que o cmd.exe falhe.

    O mesmo efeito pode ser obtido com a divisão por erro zero via SET /A 1/0 2>&0.

    É importante observar que o redirecionamento realmente é bem-sucedido. O redirecionamento não se importa que o stdin não possa aceitar a saída, ele realiza o redirecionamento cegamente. A falha ocorre somente quando a rotina de gravação de erro cmd.exe tenta realmente gravar no stderr redirecionado.

    É fácil demonstrar que o redirecionamento é bem-sucedido se você simplesmente redirecionar um comando que não grava em stderr. Por exemplo, echo Hello world 2>&0executa o redirecionamento sem sentido e grava com êxito a mensagem em stdout.

    Em algum lugar no DosTips, tenho alguns posts onde investiguei como o cmd.exe lida com erros de E/S. Eu gostaria de encontrar esse post. Acredito que meu teste envolveu redirecionar stdout ou stderr para um dispositivo removível e, em seguida, pausar. Durante a pausa, eu removia o dispositivo e continuava. Eu observaria o comportamento quando tentasse gravar no dispositivo ausente via stdout ou stderr. Pelo que me lembro, todas as gravações com falha no stderr travam imediatamente o cmd.exe.

    Isso é um bug ou falha de projeto? Não tenho certeza. Pode-se argumentar que talvez a coisa mais segura a fazer se o relatório de erros falhar é encerrar. Mas não estou convencido de que foi um "recurso" planejado porque quando as gravações em stdout falham, não há mensagem de erro ou erro retornado de qualquer maneira! A saída simplesmente desaparece no éter, cmd.exe continua alegremente como se nada de ruim tivesse acontecido. É impossível para o lote detectar falhas ao gravar em stdout. Acho isso atroz. Só posso supor que os desenvolvedores do cmd.exe nunca se preocuparam em considerar essa possibilidade. Então, se isso for verdade, então o fato de as falhas do stderr falharem poderia facilmente ser um (feliz?) acidente.

    Houve algumas outras diferenças entre o comportamento stdout e stderr. Ambos são armazenados em buffer, mas se comportam de maneira diferente se houver um estouro de buffer. Eu gostaria de lembrar qual era essa diferença :-(

    Atualizar

    Encontrei algumas das minhas investigações em https://www.dostips.com/forum/viewtopic.php?t=6881

    Escrever para stdout é um pouco mais complicado do que o meu writeup acima implica. Cmd.exe tem várias rotinas internas que tentam gravar em stdout. Por exemplo:

    • Comando ECHO
    • SET /P mensagem (pedido de entrada)
    • O prompt da linha de comando e o eco da linha de comando em lote (quando ECHO está ativado)
    • Saída de comandos como DIR, etc.

    Alguns desses pontos de entrada que gravam em stdout podem ter seu próprio comportamento quando há uma falha de gravação. Meu link acima descreve as diferenças entre ECHO e SET /P, por exemplo.

    Não tenho certeza, mas acredito que as mensagens de erro para stderr sejam diferentes. Acredito que todos os relatórios de erros são canalizados por meio de uma única rotina interna que trava quando há um erro de gravação. Meu link acima realmente não investiga isso. Ainda estou procurando as postagens muito posteriores que investigaram melhor os erros de E/S (e problemas de buffer)

    • 11

relate perguntas

  • Qual seria o equivalente em lote do argumento "pass" do Python?

  • Não é possível ativar o Microsoft Print to PDF depois de desativado

  • Comunique-se com o daemon do Docker no Windows

  • atalho do shell da área de trabalho no painel lateral do explorer

Sidebar

Stats

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

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

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