Prólogo de Microsoft Rich Turner de Microsoft. Este artículo trata sobre la línea de comandos: desde su apariencia y evolución hasta los planes para la revisión de la consola de Windows y la línea de comandos en futuras versiones de Windows. Si usted es un profesional experimentado o nuevo en TI, esperamos que el artículo le resulte interesante.
Érase una vez en un servidor muy, muy lejano ...
Desde los primeros días del desarrollo de la informática, las personas necesitaban una forma efectiva de transferir comandos y datos a una computadora y ver el resultado de estos comandos / cálculos.
Una de las primeras interfaces hombre-máquina verdaderamente efectivas fue Tele-Typewriter, o Teletype. Esta es una máquina electromecánica con un teclado para la entrada de datos y algún tipo de dispositivo de salida: primero se utilizó una impresora, luego una pantalla.
Los caracteres ingresados por el operador se almacenan localmente en el búfer y se envían desde el teletipo a una computadora o mainframe vecina como una serie de señales a través de un cable eléctrico (por ejemplo, RS-232) a una velocidad de 10 caracteres por segundo (110 baudios, bits por segundo, bps):
Teletipo Modelo 33 ASRNota: David Hesswaine mantiene un excelente sitio web PDP-8 donde puede encontrar más información sobre ASR33 (y la tecnología PDP-8 relacionada), incluidas fotos, videos, etc.
El programa en la computadora recibe los caracteres ingresados, decide qué hacer con ellos y, posiblemente, envía una respuesta asincrónica al teletipo. El teletipo puede imprimir / mostrar al operador los caracteres recibidos.
Luego, la tecnología mejoró, la velocidad de transmisión aumentó a 19.200 bps y las impresoras CRT (un tipo extendido de pantallas en los años 80 y 90) reemplazaron las impresoras ruidosas y caras, como en el popular terminal DEC VT100:
Terminal DEC VT100Aunque la tecnología ha mejorado, pero este modelo, el terminal envía caracteres al programa en la computadora y le entrega el texto al usuario, ¡sigue siendo hoy el modelo fundamental para la interacción de todas las líneas de comando y consolas en todas las plataformas!
Arquitectura de terminal y línea de comandoEl modelo es elegante a su manera. Una de las razones es la simplicidad e integridad de cada componente: el teclado produce caracteres que se almacenan en búfer como señales eléctricas. El dispositivo de salida simplemente muestra los caracteres recibidos de la computadora en la pantalla (papel / pantalla).
En cada etapa, solo se transmite una secuencia de caracteres en el sistema, por lo que este es un proceso relativamente simple para implementar diversas infraestructuras de comunicación. Por ejemplo, para agregar módems para transmitir secuencias de caracteres de entrada y salida a largas distancias a través de líneas telefónicas.
Codificación de texto
Es importante recordar que las terminales y las computadoras intercambian datos a través de secuencias de caracteres. Cuando se presiona una tecla en un teclado de terminal, se envía un valor que representa el carácter ingresado a la computadora conectada. Presione la tecla 'A' y se envía el valor 65 (0x41). Presione 'Z' y se envía 90 (0x5a).
Codificación ASCII de 7 bits
La lista de caracteres y sus significados se define en el
Código Estándar Americano para el Intercambio de Información (ASCII) , también conocido como
ISO / IEC 646 /
ECMA-6 - "Conjunto de caracteres codificados de 7 bits", que define:
- 128 valores que representan caracteres latinos impresos A - Z (65-90), a - z (97−122), 0−9 (48−57)
- Muchos signos de puntuación comunes
- Varios códigos de control no imprimibles (0−31 y 127):
Caracteres ASCII estándar de 7 bitsCuando 7 bits no son suficientes: páginas de códigos
Sin embargo, los 7 bits no proporcionan suficiente espacio para codificar muchos signos diacríticos, signos de puntuación y caracteres utilizados en otros idiomas y regiones. Entonces, con la adición de un bit adicional, puede expandir la tabla de caracteres ASCII con conjuntos adicionales de "páginas de códigos" para 128–255 caracteres (y la posible redefinición de varios caracteres ASCII no imprimibles).
Por ejemplo, IBM introdujo la página de códigos 437 con varios caracteres gráficos como ╫ (215) y ╣ (185) y matemáticos, incluidos π (227) y ± (241), y también redefinió los caracteres imprimibles para los caracteres comúnmente no impresos 1–31:
Código Página 437La página de códigos Latin-1 define el conjunto de caracteres utilizados por los idiomas latinos:
Página de códigos Latin-1En muchos entornos de línea de comandos y shells, puede cambiar la página de códigos actual para que el terminal muestre diferentes caracteres (dependiendo de las fuentes disponibles), especialmente para caracteres con un valor de 128–255. Pero una página de códigos especificada incorrectamente conducirá a la visualización de un
estafador . ¡Y sí, "krakozyabry" es un
término real ! ¿Quién lo hubiera pensado? ;)
Cuando 8 bits no son suficientes: Unicode
Las páginas de códigos resolvieron temporalmente el problema, pero tienen muchas deficiencias, por ejemplo, no permiten mostrar texto de varias páginas de códigos / idiomas simultáneamente. Por lo tanto, fue necesario introducir una nueva codificación que muestre con precisión cada carácter y alfabeto para todos los idiomas conocidos por la humanidad, ¡dejando mucho espacio libre! Presentamos
Unicode .
Unicode es un estándar internacional (
ISO / IEC 10646 ) que actualmente define 137,439 caracteres de 146 scripts modernos e históricos, así como muchos caracteres y glifos, incluidos numerosos emoticones que se utilizan ampliamente en casi todas las aplicaciones, plataformas y dispositivo Unicode se actualiza regularmente con sistemas de escritura adicionales, emoticones nuevos / corregidos, símbolos, etc.
¡Unicode también define caracteres de formato "no imprimibles" que permiten, por ejemplo, combinar caracteres y / o afectar caracteres anteriores o posteriores! Esto es especialmente útil en scripts como el árabe, donde otros determinan la ligadura de un símbolo en particular. Los emojis pueden usar la combinación de
ancho cero para combinar varios caracteres en un solo glifo visual. Por ejemplo, los emojis de gato ninja de Microsoft se forman conectando el gato con otros emojis:
Microsoft Cat Ninja EmojiCuando hay demasiados bytes: ¡UTF-8!
La presentación única y sistemática de todos los caracteres requiere un gran espacio, hasta varios bytes por carácter.
Por lo tanto, para ahorrar dinero, se desarrollaron varias nuevas codificaciones Unicode. Entre los más populares están UTF-32 (4 bytes por carácter), UTF-16 / UCS-2 (2 bytes) y UTF-8 (1-4 bytes por carácter).
En gran parte debido a la compatibilidad con ASCII y al ahorro de espacio, UTF-8 se ha convertido en la codificación Unicode más popular en Internet. Ha mostrado un crecimiento explosivo desde 2008, cuando superó a ASCII y otras codificaciones populares en popularidad:
La creciente popularidad de la codificación UTF-8 (fuente: Wikipedia)Por lo tanto, al principio los terminales admitían texto ANSI de 7 bits y luego 8 bits, pero la mayoría de los terminales modernos admiten texto Unicode / UTF-8.
Entonces, ¿qué es una línea de comando y qué es un 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 ,
… !
, .