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 ASRNota: 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 TerminalEmbora 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 comandoO 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ãoQuando 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 437A página de código Latin-1 define o conjunto de caracteres usados pelos idiomas baseados em latim:
Página de código Latin-1Em 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 EmojiQuando 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-DOSWindows 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
Xenix —
Unix 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 :
- Windows
- Linux Windows
Microsoft :
- Windows Console , Windows Console
- 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, … … « », .
, , , , , :
- , , . . ( )
- /IO ( )
Windows Console :
- 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 … , , , !
?
, :
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. . , « / ». !
, ? … . :
- IOCTL ,
- Windows , ConHost.exe — ,
- 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 API
- IOCTL « »
- Windows «»
- Windows ANSI/VT
- UTF-8 ,
… !
, .