O grave legado do passado. Problemas de linha de comando do Windows

Prefácio de Microsoft Rich Turner da Microsoft. Este artigo é sobre a linha de comando: desde sua aparência e evolução até os planos para a revisão do console do Windows e a linha de comando em versões futuras do Windows. Seja você um profissional experiente ou novo em TI, esperamos que você ache o artigo interessante.

Era uma vez em um servidor distante, distante ...


Desde os primeiros dias do desenvolvimento da ciência da computação, as pessoas precisavam de uma maneira eficaz de transferir comandos e dados para um computador e ver o resultado desses comandos / cálculos.

Uma das primeiras interfaces homem-máquina verdadeiramente eficazes foi a Tele-Typewriter, ou Teletype. Esta é uma máquina eletromecânica com teclado para entrada de dados e algum tipo de dispositivo de saída - primeiro uma impressora foi usada, depois uma tela.

Os caracteres digitados pelo operador são armazenados em buffer localmente e enviados do teletipo para um computador ou mainframe vizinho como uma série de sinais via cabo elétrico (por exemplo, RS-232) a uma velocidade de 10 caracteres por segundo (110 baud, bits por segundo, bps):


Teletipo Modelo 33 ASR

Nota: David Hesswaine mantém um excelente site PDP-8, onde você pode encontrar mais informações sobre o ASR33 (e a tecnologia PDP-8 relacionada), incluindo fotos, vídeos, etc.

O programa no computador recebe os caracteres inseridos, decide o que fazer com eles e, possivelmente, envia assincronamente uma resposta ao teletipo. O teletipo pode imprimir / mostrar ao operador os caracteres recebidos.

Então, a tecnologia melhorou, a velocidade de transmissão aumentou para 19.200 bps e as impressoras barulhentas e caras foram substituídas por monitores CRT (um tipo generalizado de monitores nas décadas de 80 e 90), como no popular terminal DEC VT100:


DEC VT100 Terminal

Embora a tecnologia tenha melhorado, esse modelo - o terminal envia caracteres para o programa no computador e fornece o texto ao usuário - permanece hoje como o modelo fundamental para a interação de todas as linhas de comando e consoles em todas as plataformas!


Arquitetura de terminal e linha de comando

O modelo é elegante à sua maneira. Uma das razões é a simplicidade e a integridade de cada componente: o teclado produz caracteres que são armazenados em buffer como sinais elétricos. O dispositivo de saída simplesmente exibe os caracteres recebidos do computador no visor (papel / tela).

Em cada estágio, apenas um fluxo de caracteres é transmitido no sistema, portanto, esse é um processo relativamente simples para implementar várias infra-estruturas de comunicação. Por exemplo, para adicionar modems para transmitir fluxos de caracteres de entrada e saída a longas distâncias através de linhas telefônicas.

Codificação de texto


É importante lembrar que terminais e computadores trocam dados através de fluxos de caracteres. Quando uma tecla é pressionada no teclado do terminal, um valor que representa o caractere digitado é enviado ao computador conectado. Pressione a tecla 'A' - e o valor 65 (0x41) é enviado. Pressione 'Z' e 90 (0x5a) são enviados.

Codificação ASCII de 7 bits


A lista de caracteres e seus significados está definida no Código Padrão Americano para Intercâmbio de Informações (ASCII) , também conhecido como ISO / IEC 646 / ECMA-6 - “Conjunto de Caracteres Codificados de 7 bits”, que define:

  • 128 valores representando caracteres latinos impressos A - Z (65-90), a - z (97-122), 0−9 (48−57)
  • Muitos sinais de pontuação comuns
  • Vários códigos de controle não imprimíveis (0-31 e 127):


Caracteres ASCII de 7 bits padrão

Quando 7 bits não são suficientes: páginas de código


No entanto, 7 bits não fornecem espaço suficiente para codificar muitos sinais diacríticos, sinais de pontuação e caracteres usados ​​em outros idiomas e regiões. Portanto, com a adição de um bit adicional, você pode expandir a tabela de caracteres ASCII com conjuntos adicionais de "páginas de código" para 128 a 255 caracteres (e a possível redefinição de vários caracteres ASCII não imprimíveis).

Por exemplo, a IBM introduziu a página de código 437 com vários caracteres gráficos como ╫ (215) e ╣ (185) e matemáticos, incluindo π (227) e ± (241), e também redefiniu caracteres imprimíveis para caracteres geralmente não imprimíveis 1–31:


Página de código 437

A página de código Latin-1 define o conjunto de caracteres usados ​​pelos idiomas baseados em latim:


Página de código Latin-1

Em muitos ambientes de linha de comando e shells, você pode alterar a página de código atual para que o terminal exiba caracteres diferentes (dependendo das fontes disponíveis), especialmente para caracteres com um valor de 128 a 255. Mas uma página de código especificada incorretamente levará à exibição de um bandido . E sim, "krakozyabry" é um termo real ! Quem teria pensado? ;)

Quando 8 bits não são suficientes: Unicode


As páginas de código resolveram temporariamente o problema, mas têm muitas deficiências, por exemplo, não permitem exibir texto de várias páginas / idiomas simultaneamente. Assim, foi necessário introduzir uma nova codificação que exibisse com precisão cada caractere e alfabeto para todos os idiomas conhecidos pela humanidade, deixando muito espaço livre! Apresentando o Unicode .

Unicode é um padrão internacional ( ISO / IEC 10646 ) que atualmente define 137.439 caracteres de 146 scripts modernos e históricos, além de muitos caracteres e glifos, incluindo numerosos emoticons amplamente utilizados em quase todos os aplicativos, plataformas e dispositivo O Unicode é atualizado regularmente com sistemas de gravação adicionais, emoticons / símbolos novos / corrigidos

O Unicode também define caracteres de formatação “não imprimíveis” que permitem, por exemplo, combinar caracteres e / ou afetar caracteres anteriores ou subsequentes! Isso é especialmente útil em scripts como o árabe, onde a ligadura de um símbolo específico é determinada por outros. Os emojis podem usar o marceneiro de largura zero para combinar vários caracteres em um único glifo visual. Por exemplo, os emojis de gato ninja da Microsoft são formados conectando o gato a outros emojis:


Microsoft Cat Ninja Emoji

Quando há muitos bytes: UTF-8!


A apresentação exclusiva e sistemática de todos os caracteres requer um grande espaço, até vários bytes por caractere.

Portanto, para economizar dinheiro, várias novas codificações Unicode foram desenvolvidas. Entre os mais populares estão UTF-32 (4 bytes por caractere), UTF-16 / UCS-2 (2 bytes) e UTF-8 (1-4 bytes por caractere).

Em grande parte devido à compatibilidade com versões anteriores de ASCII e economia de espaço, o UTF-8 se tornou a codificação Unicode mais popular da Internet. Ele mostrou um crescimento explosivo desde 2008, quando ultrapassou o ASCII e outras codificações populares em popularidade:


A crescente popularidade da codificação UTF-8 (fonte: Wikipedia)

Portanto, a princípio, os terminais suportavam texto ANSI de 7 e 8 bits, mas a maioria dos terminais modernos suporta texto Unicode / UTF-8.

Então, o que é uma linha de comando e o que é um shell?


« » CLI (/ ) , : CLI .

, echo Hello «Hello» (, ). dir (Cmd) ls (PowerShell/*NIX) ..

, . , , «» (shell).

Unix/Linux Unix (sh) , Korn shell (ksh), C shell (csh) Bourne Shell (sh). , Bourne Again Shell (bash) ..

Microsoft:


Windows, , , , /, .


« » (, Windows, Linux, macOS) (GUI). GUI / .


Cmd, PowerShell Ubuntu Linux WSL

, / , , - , .

, , : , , , () — . TTY Pseudo Teletype (PTY) .




, . , , . «» — , , *NIX.


: MS-DOS


. Unix, CP/M, DR-DOS . MS-DOS - IBM PC :


MS-DOS 6.0

, «» MS-DOS , batch- (.bat).

MS-DOS , ! Batch- , / , , ..

, , , . Windows!

, , . . , , - .

.


(GUI), Xerox Alto.

GUI Lisa Macintosh Apple, Commodore Amiga (Workbench), Atari ST (DRI GEM), Acorn Archimedes (Arthur/RISC OS), Sun Workstation, X11/X Windows , Microsoft Windows.

Windows 1.0 1985 MS-DOS, GUI , :


Windows 1.01 MS-DOS

Windows 2.x, 3.x, 95 98 MS-DOS. Windows MS-DOS Windows (, ), MS-DOS.

: Windows ME (Millennium Edition) . - MS-DOS Windows ( Gaming & Media). Windows 2000 (, TCP/IP), , NT.

Microsoft , MS-DOS Windows. .

Microsoft — Unix! , !


MS-DOS, Microsoft XenixUnix 7 — , Z8000, 8086/80286 68000.

1984 Xenix Microsoft Unix !

Bell Labs — Unix — AT&T, Unix System V .

Microsoft , . Xenix: 1987 Microsoft Xenix Santa Cruz Operation (SCO), Xenix .

Microsoft + IBM == OS/2…


1985 Microsoft IBM OS/2. « DOS» 32- CPU , IBM OEM.

OS/2 . 1990 Microsoft IBM . , IBM Microsoft, , Windows 3.1. IBM OS/2 2006 .

1988 Microsoft , , . , , .

Microsoft: Windows NT


1988 Microsoft , VAX/VMS DEC. — , , , Microsoft , .

Windows NT: , Windows 2000, Windows XP, Windows Vista, Windows 7, Windows 8 Windows 10, Windows Server, Windows Phone 7+, Xbox HoloLens!

Windows NT . Intel i860, MIPS R3000, Intel 80386+, DEC Alpha PowerPC. Windows NT IA64 Itanium, x64 ARM/ARM64, .

Windows NT Windows Console Command Prompt (cmd.exe). Cmd MS-DOS, .

PowerShell


Cmd Windows (, , ). — , Cmd . « » , «» MS-DOS Windows!

2000- Cmd : Microsoft . PowerShell ( « » ).

PowerShell — - , /, *NIX: PowerShell . ( sed/grep/awk/lex/.).

.NET Framework Common Language Runtime (CLR), PowerShell .NET , … … . :)

PowerShell, «PowerShell » (Manning Press), — PowerShell. , .

PowerShell Microsoft, Windows, Exchange Server, SQL Server, Azure . Windows / .

PowerShell Core — PowerShell , Windows Linux, BSD macOS.

POSIX NT, Interix UNIX


NT NT - .

1993 Windows NT 3.1, : Ѕ-DOS, Windows, OS/2 POSIX v1.2. , — !

POSIX Windows NT , . Microsoft Softway Systems POSIX- Interix NT. Interix , Services For Unix (SFU) Windows Server 2003 R2 Windows Vista. SFU Windows 8, , - .



Windows 10 — Windows!


Windows 10 UserVoice , . Microsoft :

  1. Windows
  2. Linux Windows

Microsoft :

  1. Windows Console , Windows Console
  2. Windows Subsystem for Linux (WSL)

, , !

Windows Linux (WSL)


GNU/Linux «» ( Linux ) , . Windows POSIX- , SFU Linux - Unix/POSIX.

Windows, Microsoft, , Windows Linux!

2014 Microsoft , Windows Linux (WSL). WSL Build 2016, Windows 10 Insider.

WSL Anniversary Update 2016 . , WSL: , Linux. ( !) WSL, Linux.

( 2018 ) WSL Linux, , , , .. , IT-, DevOps , , , Linux . ., Linux Windows , .

WSL WSL Linux, Windows.

Windows Console


2014 Windows Linux (WSL) , , Windows .

, , *NIX- , ANSI/VT, *NIX UI.

WSL, Linux?

, Windows 7 Windows 10: , Windows 7 () VT, tmux, htop, Midnight Commander cowsay, Windows 10 ():


Windows 7 Windows 10

, 2014 « Windows Console». , Windows Console… 28 — , , .

, - , , , . . Windows, , , , , , , « ». ;)

, . , 1−2% , Windows Build, … … « », .

, , , , , :

  1. , , . . ( )
  2. /IO ( )

Windows Console :


    • , , .. STL
    • , ( ), « »
  • ANSI/VT, *NIX
  • 24- 16 !
  • : Narrator
  • /

! .

?

, , , Microsoft.

Microsoft , // .

Microsoft Windows, , , !

MS-DOS, Unix, OS/2 Windows , , . , , ! Visual Studio (VS) . Exchange Server SQL Server PowerShell .

Windows Console


Windows NT 1989 , . , MS-DOS. Windows, GUI — Windows Console! Windows NT , , Windows, - !

Windows ( 2018 ) 30 … , , , !

?


, :


    • , , , .
    • / ANSI/VT
    • //
  • :
    • /
    • , (, , , ..)
  • :
    • / / ..

Windows :

Windows Console


Windows — Win32. C, C++ , .

: , Windows C C++. : - NT, , Windows C! ? C++ . C++ , 1990-, $60/ (… $60 !), vtables . , C++. , C++ . , , … C++!

Windows?


Windows 7 Windows Client Server Runtime Subsystem (CSRSS)! Windows 7 CSRSS :

  • conhost.exe — Windows UX
  • condrv.sys — Windows, conhost //

:



( ):

  • ConDrv.sys
  • ConHost.exe — Win32 GUI:
    • ConHost Core
      • API: IOCTL, , API
      • API: API Win32 ,
      • : ,
      • VT Parser: , VT, API
      • : , . , 2D- CHAR_INFO, ( )
      • : / / ..
    • Console UX App Services — UX UI

Windows Console API


, NIX, / API / IO Control (IOCTL), ! ANSI/VT ( Linux), , API!

*NIX Windows: *NIX « », Windows « »!

, , . , Windows *NIX!

*NIX


Unix 1960- 1970- , , ( ) . : , .

: *NIX, / , , «» , .

, Linux , /proc/cpuinfo:



: / , sed, awk, perl, python .. , , . , — , / , , , .

Windows


Windows NT, «» : «-» , : Simula Smalltalk , C++ . - , Python, Eiffel, Objective-C, ObjectPascal/Delphi, Java, C# .

. , - ( 1989 ) Windows NT , « ». NT !

Windows NT Win32 API / . Win32 API , *NIX, . , , , . , .

, Windows: NT «», *NIX :

  • Console API: , ANSI/VT-, , Windows API
  • : (, , ), Console API

Windows


API , API , .

Windows


Console API.

? Windows.

, (, ..), Windows *NIX .

- Windows , , . , Windows , , .., *NIX — .

: Windows bash iTerm2 — , Windows Cmd/PowerShell.

, Cygwin, GNU Windows, , Linux. , Ruby, Python, Node Linux / *NIX.

, Microsoft Windows, Linux Windows Linux (WSL). WSL Linux , apt/zypper/npm/gem/. Linux Windows.

, , : , Windows Console command-history command-alias, ( ) .


, , . : //. / .

*NIX- , /. - (TTY, PTY ..), .

Windows API , . . API ? , Console API, Mac Linux?!

, , .

… !


*NIX , . /. Pseudo TTY (PTY).

Windows : Windows (conhost.exe) — , , Cmd.exe, PowerShell.exe, wsl.exe . Windows ( ) .

#SAYWHATNOW?

, Windows , .

, Windows .exe . Windows , .

: , « ». , ! Win32. . , « / ». !

, ? … . :

  1. IOCTL ,
  2. Windows , ConHost.exe — ,
  3. Windows «» (pipes),

. Windows? / , , ?

, . Windows (, ConEmu/Cmder, Console2/ConsoleZ, Hyper, Visual Studio Code, OpenSSH . .), , !

, , , (-32000, -32000). , — !

- , ?! , — .

, . .

Windows Console VT


, Windows API. Console API , , .. API ANSI/VT, .

, Windows 10 Windows ANSI/VT:



2014 , Microsoft Windows Console. ANSI/VT *NIX, Windows Linux (WSL) *NIX.

Windows 10 ANSI/VT, Windows Linux.

VT , GitHub. ;)


, Windows API !

Windows ( ) UCS-2 . 65536  ,  0 (Basic Multilingual Plane, BMP).

Console API. , : / , W (wchar)/ .

, WriteConsoleOutputCharacter WriteConsoleOutputCharacterA() ASCII WriteConsoleOutputCharacterW() . ...A ...W, .

: W API UCS-2, , A/W, , . W API UTF-16 .

W API UTF-16, UCS-2.

, , (zero width joiner), , .

- / ? , !

API ( NinjaCat 8 !), UCS-2 . , GDI- , !

… legacy-.

— . !

, ?


, , , — Windows, , , , , ! !

:

  • Windows:
    • Condrv.sys —
    • ConHost. — UX :
      • API — API IOCTL, /
      • API —
      • — , , , /
      • VT — ANSI/VT API
      • UX — UI , ,
      • — , .

  • *NIX
    • NIX: « / »
    • Windows: « , API»

    • API , IOCTL
    • API Windows
      • / Windows
    • Windows API
      • Windows
    • IOCTL « »
      • -Windows
    • Windows «»
      • ConHost.exe
      • ,
    • Windows ANSI/VT
      • Windows 10
    • UTF-8 ,

… !

, .

Source: https://habr.com/ru/post/pt417679/


All Articles