L'héritage grave du passé. Problèmes de ligne de commande Windows

Avant-propos de Microsoft Rich Turner de Microsoft. Cet article concerne la ligne de commande: de son apparence et de son évolution aux plans de révision de la console Windows et de la ligne de commande dans les futures versions de Windows. Que vous soyez un professionnel expérimenté ou un débutant en informatique, nous espérons que vous trouverez l'article intéressant.

Il était une fois dans un serveur très éloigné ...


Dès les premiers jours du développement de l'informatique, les gens avaient besoin d'un moyen efficace pour transférer des commandes et des données vers un ordinateur et voir le résultat de ces commandes / calculs.

L'une des premières interfaces homme-machine vraiment efficaces a été la télé-machine à écrire, ou télétype. Il s'agit d'une machine électromécanique avec un clavier pour l'entrée de données et une sorte de périphérique de sortie - d'abord une imprimante a été utilisée, puis un écran.

Les caractères saisis par l'opérateur sont mis en mémoire tampon localement et envoyés du téléscripteur à un ordinateur ou un ordinateur central voisin sous la forme d'une série de signaux via un câble électrique (par exemple, RS-232) à une vitesse de 10 caractères par seconde (110 bauds, bits par seconde, bps):


Télétype modèle 33 ASR

Remarque: David Hesswaine maintient un excellent site Web PDP-8 où vous pouvez trouver plus d' informations sur ASR33 (et la technologie PDP-8 connexe), y compris des photos, des vidéos, etc.

Le programme sur l'ordinateur reçoit les caractères saisis, décide quoi faire avec eux et, éventuellement, envoie de manière asynchrone une réponse au téléscripteur. Le télétype peut imprimer / montrer à l'opérateur les caractères reçus.

Ensuite, la technologie s'est améliorée, la vitesse de transmission est passée à 19 200 bps, et les imprimantes bruyantes et coûteuses ont été remplacées par des écrans CRT (un type d'affichage répandu dans les années 80 et 90), comme sur le terminal DEC VT100 populaire:


Terminal DEC VT100

Bien que la technologie se soit améliorée, ce modèle - le terminal envoie des caractères au programme sur l'ordinateur, et il donne le texte à l'utilisateur - reste aujourd'hui le modèle fondamental pour l'interaction de toutes les lignes de commande et consoles sur toutes les plateformes!


Architecture du terminal et de la ligne de commande

Le modèle est élégant à sa manière. L'une des raisons est la simplicité et l'intégrité de chaque composant: le clavier produit des caractères qui sont mis en mémoire tampon sous forme de signaux électriques. Le périphérique de sortie affiche simplement les caractères reçus de l'ordinateur sur l'écran (papier / écran).

À chaque étape, seul un flux de caractères est transmis dans le système, il s'agit donc d'un processus relativement simple pour mettre en œuvre diverses infrastructures de communication. Par exemple, pour ajouter des modems pour transmettre des flux de caractères d'entrée et de sortie sur de longues distances sur les lignes téléphoniques.

Encodage de texte


Il est important de se rappeler que les terminaux et les ordinateurs échangent des données via des flux de caractères. Lorsqu'une touche est enfoncée sur un clavier de terminal, une valeur représentant le caractère saisi est envoyée à l'ordinateur connecté. Appuyez sur la touche «A» - et la valeur 65 (0x41) est envoyée. Appuyez sur 'Z' et 90 (0x5a) est envoyé.

Encodage ASCII 7 bits


La liste des caractères et leur signification est définie dans l' American Standard Code for Information Interchange (ASCII) , alias ISO / IEC 646 / ECMA-6 - «7-bit Coded Character Set», qui définit:

  • 128 valeurs représentant les caractères latins imprimés A - Z (65-90), a - z (97−122), 0−9 (48−57)
  • De nombreux signes de ponctuation courants
  • Plusieurs codes de contrôle non imprimables (0−31 et 127):


Caractères ASCII 7 bits standard

Quand 7 bits ne suffisent pas: pages de codes


Cependant, 7 bits ne fournissent pas suffisamment d'espace pour coder de nombreux signes diacritiques, signes de ponctuation et caractères utilisés dans d'autres langues et régions. Ainsi, avec l'ajout d'un bit supplémentaire, vous pouvez étendre la table de caractères ASCII avec des ensembles supplémentaires de «pages de codes» pour 128–255 caractères (et la redéfinition possible de plusieurs caractères ASCII non imprimables).

Par exemple, IBM a introduit la page de code 437 avec plusieurs caractères graphiques tels que ╫ (215) et ╣ (185) et mathématiques, y compris π (227) et ± (241), ainsi que des caractères imprimables redéfinis pour les caractères généralement non imprimés 1 à 31:


Page de codes 437

La page de codes Latin-1 définit le jeu de caractères utilisé par les langues latines:


Page de code Latin-1

Dans de nombreux environnements et shells de ligne de commande, vous pouvez modifier la page de codes actuelle afin que le terminal affiche différents caractères (en fonction des polices disponibles), en particulier pour les caractères d'une valeur de 128 à 255. Mais une page de codes mal spécifiée entraînera l'affichage d'un escroc . Et oui, "krakozyabry" est un vrai terme ! Qui aurait pensé? ;)

Lorsque 8 bits ne suffisent pas: Unicode


Les pages de codes ont temporairement résolu le problème, mais elles présentent de nombreuses lacunes, par exemple, elles ne permettent pas d'afficher simultanément le texte de plusieurs pages de codes / langues. Ainsi, il était nécessaire d'introduire un nouvel encodage qui affiche avec précision chaque caractère et alphabet pour toutes les langues connues de l'humanité, laissant ainsi beaucoup d'espace libre! Présentation d' Unicode .

Unicode est une norme internationale ( ISO / IEC 10646 ) qui définit actuellement 137 439 caractères de 146 scripts modernes et historiques, ainsi que de nombreux caractères et glyphes, y compris de nombreux émoticônes largement utilisés dans presque toutes les applications, plates-formes et appareil. Unicode est régulièrement mis à jour avec des systèmes d'écriture supplémentaires, des émoticônes nouvelles / corrigées, des symboles, etc.

Unicode définit également des caractères de formatage «non imprimables» qui permettent, par exemple, de combiner des caractères et / ou d'affecter des caractères précédents ou suivants! Ceci est particulièrement utile dans des scripts tels que l'arabe, où la ligature d'un symbole particulier est déterminée par d'autres. Les émojis peuvent utiliser le menuisier de largeur nulle pour combiner plusieurs caractères en un seul glyphe visuel. Par exemple, les emojis de chat ninja Microsoft sont formés en connectant le chat avec d'autres emojis:


Microsoft Cat Ninja Emoji

Lorsqu'il y a trop d'octets: UTF-8!


La présentation unique et systématique de tous les caractères nécessite un grand espace, jusqu'à plusieurs octets par caractère.

Par conséquent, pour économiser de l'argent, plusieurs nouveaux encodages Unicode ont été développés. Les plus populaires sont UTF-32 (4 octets par caractère), UTF-16 / UCS-2 (2 octets) et UTF-8 (1-4 octets par caractère).

En grande partie grâce à la rétrocompatibilité avec ASCII et à l'économie d'espace, UTF-8 est devenu le codage Unicode le plus populaire sur Internet. Il a connu une croissance explosive depuis 2008, date à laquelle il a dépassé ASCII et d'autres encodages populaires en popularité:


La popularité croissante de l'encodage UTF-8 (source: Wikipedia)

Ainsi, au départ, les terminaux prenaient en charge le texte ANSI 7 bits puis 8 bits, mais la plupart des terminaux modernes prennent en charge le texte Unicode / UTF-8.

Alors qu'est-ce qu'une ligne de commande et qu'est-ce qu'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-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/fr417679/


All Articles