?" рдЪрд╛рд╣реЗ рд╡рд╣ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрдХреНрд░реЙрд▓ less рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп grep рдпрд╛ sed рдЙрдкрдХрд░рдг, рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ ...">

рд╣рдо PowerShell рдФрд░ WSL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╡рд▓рдкрд░ рд╕рд╡рд╛рд▓: "рдпрд╣ рдЕрднреА рднреА рдпрд╣рд╛рдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ < LINUX> ?" рдЪрд╛рд╣реЗ рд╡рд╣ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрдХреНрд░реЙрд▓ less рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп grep рдпрд╛ sed рдЙрдкрдХрд░рдг, рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ рдЗрди рдХрдорд╛рдВрдбреЛрдВ рддрдХ рдЖрд╕рд╛рди рдкрд╣реБрдВрдЪ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рд╕рдмрд╕рд┐рд╕реНрдЯрдо (WSL) рдиреЗ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдХрджрдо рдЙрдард╛рдпрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛрдЬ рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ wsl.exe (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, wsl ls ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ wsl.exe ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рд╣реИ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрдИ рдиреБрдХрд╕рд╛рдиреЛрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред

  • wsl рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рдЬреЛрдбрд╝ рдердХрд╛рдК рдФрд░ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд╣реИред
  • рддрд░реНрдХреЛрдВ рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдкрде рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреИрдХрд╕реНрд▓реИрд╢ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдкрд▓рд╛рдпрди рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рди рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреАред
  • рддрд░реНрдХ рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдкрде рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрд▓ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдЙрдВрдЯ рдмрд┐рдВрджреБ рдкрд░ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  • WSL рдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдВ рдПрд▓рд┐рдпрд╛рд╕ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред
  • рд▓рд┐рдирдХреНрд╕ рдкрде рдкреВрд░реНрдгрддрд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
  • рдХрдорд╛рдВрдб рдкреВрд░реНрдгрддрд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
  • рддрд░реНрдХ рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирддреАрдЬрддрди, рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рджреНрд╡рд┐рддреАрдп рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдЧрд░рд┐рдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдФрд░ рд╡реЗ рдореВрд▓ рдЯреАрдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИрдВред рдЙрдирдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдмрд░рд╛рдмрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреЙрд╡рд░рд╢реЗрд▓ рд╢реИрд▓


PowerShell рдлрд╝рдВрдХреНрд╢рди рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрдорд╛рдВрдб рдкреВрд░реНрдгрддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ WSL рдкрдереЛрдВ рдореЗрдВ Windows рдкрдереЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдХреЗ wsl рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреЛрд▓реЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ:

  • рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╢реЗрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╢реЗрд▓ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╡рд┐рдВрдбреЛрдЬ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрд▓ рдкрдереЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╢реЗрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде wsl рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЪреВрдВрдХрд┐ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд┐рд╕реА рднреА рдХрдорд╛рдВрдб рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рдо рдЗрди рдЧреЛрд▓реЗ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрдорд╛рдВрдб рдХреА рд╕реВрдЪреА рд╕реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 # The commands to import. $commands = "awk", "emacs", "grep", "head", "less", "ls", "man", "sed", "seq", "ssh", "tail", "vim" # Register a function for each command. $commands | ForEach-Object { Invoke-Expression @" Remove-Alias $_ -Force -ErrorAction Ignore function global:$_() { for (`$i = 0; `$i -lt `$args.Count; `$i++) { # If a path is absolute with a qualifier (eg C:), run it through wslpath to map it to the appropriate mount point. if (Split-Path `$args[`$i] -IsAbsolute -ErrorAction Ignore) { `$args[`$i] = Format-WslArgument (wsl.exe wslpath (`$args[`$i] -replace "\\", "/")) # If a path is relative, the current working directory will be translated to an appropriate mount point, so just format it. } elseif (Test-Path `$args[`$i] -ErrorAction Ignore) { `$args[`$i] = Format-WslArgument (`$args[`$i] -replace "\\", "/") } } if (`$input.MoveNext()) { `$input.Reset() `$input | wsl.exe $_ (`$args -split ' ') } else { wsl.exe $_ (`$args -split ' ') } } "@ } 

$command рд╕реВрдЪреА рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред рдлрд┐рд░ рд╣рдо рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ Invoke-Expression рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЖрд╡рд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рдЙрдкрдирд╛рдо рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдЧрд╛)ред

рдлрд╝рдВрдХреНрд╢рди рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рддрд░реНрдХреЛрдВ рдкрд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, Split-Path рдФрд░ Test-Path рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдВрдбреЛрдЬ рдкрде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрд▓ рдкрдереЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди Format-WslArgument рдорд╛рдзреНрдпрдо рд╕реЗ рдкрде рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдХреЛрд╖реНрдардХ, рдЬреЛ рдЕрдиреНрдпрдерд╛ рдЧрд▓рдд рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рд╣рдо wsl рдЗрдирдкреБрдЯ рдФрд░ wsl рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдкрд╛рд╕ wsl ред

рдЗрди рд░реИрдкрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдбреЛрдВ рдХреЛ wsl рдЙрдкрд╕рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдФрд░ рдмрд┐рдирд╛ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдХрд┐ рд░рд╛рд╕реНрддреЗ рдХреИрд╕реЗ wsl рдЬрд╛рддреЗ рд╣реИрдВ:

  • man bash
  • less -i $profile.CurrentUserAllHosts
  • ls -Al C:\Windows\ | less
  • grep -Ein error *.log
  • tail -f *.log

рдореВрд▓ рдХрдорд╛рдВрдб рд╕реЗрдЯ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рд╕реА рднреА рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рд╢реЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ PowerShell рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпреЗ рдЖрджреЗрд╢ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ PowerShell рд╕рддреНрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓ рдЖрджреЗрд╢реЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛!

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдк


рд▓рд┐рдирдХреНрд╕ рдкрд░, рдпрд╣ рдкреНрд░реЛрдлрд╛рдЗрд▓ (рд▓реЙрдЧрд┐рди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓) рдореЗрдВ рдЙрдкрдирд╛рдореЛрдВ рдФрд░ / рдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░рдирд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, alias ls=ls -AFh рдпрд╛ export LESS=-i )ред рдЧреИрд░-рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ wsl.exe рд╢реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ wsl.exe рдХреЗ рдиреБрдХрд╕рд╛рди рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд▓реЛрдб рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпреЗ рд╡рд┐рдХрд▓реНрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ (рдЬреИрд╕реЗ, WSL рдореЗрдВ ls рдФрд░ wsl ls рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрдкрдирд╛рдо рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗ)ред

рдкрд╛рд╡рд░рд╢реЗрд▓ $ PSDefaultParameterValues рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рддрдВрддреНрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ cmdlets рдФрд░ рдЙрдиреНрдирдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдПред рдмреЗрд╢рдХ, рдЖрдк рд╣рдорд╛рд░реЗ рдЧреЛрд▓реЗ рд╕реЗ рдЙрдиреНрдирдд рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, -ArgumentList рдЖрдВрд╢рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, -a -ArgumentList рдореЗрд▓ -ArgumentList ), рдЬреЛ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ), рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдВрдЬреА рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рдирд╛рдо рдирд╣реАрдВ рд╣реИ)ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реЗ рдЧреЛрд▓реЗ рдореЗрдВ рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде, рд╣рдо $PSDefaultParameterValues рд╕рдорд╛рди рдПрдХ рдореЙрдбрд▓ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

 function global:$_() { тАж `$defaultArgs = ((`$WslDefaultParameterValues.$_ -split ' '), "")[`$WslDefaultParameterValues.Disabled -eq `$true] if (`$input.MoveNext()) { `$input.Reset() `$input | wsl.exe $_ `$defaultArgs (`$args -split ' ') } else { wsl.exe $_ `$defaultArgs (`$args -split ' ') } } 

рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдореЗрдВ $WslDefaultParameterValues рдХрд░рдХреЗ, рд╣рдо wsl.exe рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рднреЗрдЬрддреЗ рд╣реИрдВред рдирд┐рдореНрди рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ PowerShell рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред рдЕрдм рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

 $WslDefaultParameterValues["grep"] = "-E" $WslDefaultParameterValues["less"] = "-i" $WslDefaultParameterValues["ls"] = "-AFh --group-directories-first" 

рдЪреВрдВрдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ $PSDefaultParameterValues рдмрд╛рдж $PSDefaultParameterValues , $PSDefaultParameterValues рдЖрдк " $PSDefaultParameterValues "Disabled" рдХреБрдВрдЬреА рдХреЛ $true рд╕реЗрдЯ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдПрдХ рдЕрд▓рдЧ рд╣реИрд╢ рдЯреЗрдмрд▓ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн $WslDefaultParameterValues рдХреЛ $WslDefaultParameterValues рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рддрд░реНрдХ рдкреВрд░реНрдг рдХрд░рдирд╛


PowerShell Register-ArgumentCompleter рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд░реНрдХ рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмреИрд╢ рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдмрд▓ рдЯреВрд▓ рд╣реИрдВ ред рдбрдмреНрд▓реВрдПрд╕рдПрд▓ рдЖрдкрдХреЛ рдкрд╛рд╡рд░рд╢реЗрд▓ рд╕реЗ рдмреИрд╢ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ PowerShell рдлрд╝рдВрдХреНрд╢рди рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЯрд░реНрдорд┐рдиреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП bash рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрд╕реА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рддрд░реНрдХреЛрдВ рдХрд╛ рдкреВрд░рд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ bash рдореЗрдВ!

 # Register an ArgumentCompleter that shims bash's programmable completion. Register-ArgumentCompleter -CommandName $commands -ScriptBlock { param($wordToComplete, $commandAst, $cursorPosition) # Map the command to the appropriate bash completion function. $F = switch ($commandAst.CommandElements[0].Value) { {$_ -in "awk", "grep", "head", "less", "ls", "sed", "seq", "tail"} { "_longopt" break } "man" { "_man" break } "ssh" { "_ssh" break } Default { "_minimal" break } } # Populate bash programmable completion variables. $COMP_LINE = "`"$commandAst`"" $COMP_WORDS = "('$($commandAst.CommandElements.Extent.Text -join "' '")')" -replace "''", "'" for ($i = 1; $i -lt $commandAst.CommandElements.Count; $i++) { $extent = $commandAst.CommandElements[$i].Extent if ($cursorPosition -lt $extent.EndColumnNumber) { # The cursor is in the middle of a word to complete. $previousWord = $commandAst.CommandElements[$i - 1].Extent.Text $COMP_CWORD = $i break } elseif ($cursorPosition -eq $extent.EndColumnNumber) { # The cursor is immediately after the current word. $previousWord = $extent.Text $COMP_CWORD = $i + 1 break } elseif ($cursorPosition -lt $extent.StartColumnNumber) { # The cursor is within whitespace between the previous and current words. $previousWord = $commandAst.CommandElements[$i - 1].Extent.Text $COMP_CWORD = $i break } elseif ($i -eq $commandAst.CommandElements.Count - 1 -and $cursorPosition -gt $extent.EndColumnNumber) { # The cursor is within whitespace at the end of the line. $previousWord = $extent.Text $COMP_CWORD = $i + 1 break } } # Repopulate bash programmable completion variables for scenarios like '/mnt/c/Program Files'/<TAB> where <TAB> should continue completing the quoted path. $currentExtent = $commandAst.CommandElements[$COMP_CWORD].Extent $previousExtent = $commandAst.CommandElements[$COMP_CWORD - 1].Extent if ($currentExtent.Text -like "/*" -and $currentExtent.StartColumnNumber -eq $previousExtent.EndColumnNumber) { $COMP_LINE = $COMP_LINE -replace "$($previousExtent.Text)$($currentExtent.Text)", $wordToComplete $COMP_WORDS = $COMP_WORDS -replace "$($previousExtent.Text) '$($currentExtent.Text)'", $wordToComplete $previousWord = $commandAst.CommandElements[$COMP_CWORD - 2].Extent.Text $COMP_CWORD -= 1 } # Build the command to pass to WSL. $command = $commandAst.CommandElements[0].Value $bashCompletion = ". /usr/share/bash-completion/bash_completion 2> /dev/null" $commandCompletion = ". /usr/share/bash-completion/completions/$command 2> /dev/null" $COMPINPUT = "COMP_LINE=$COMP_LINE; COMP_WORDS=$COMP_WORDS; COMP_CWORD=$COMP_CWORD; COMP_POINT=$cursorPosition" $COMPGEN = "bind `"set completion-ignore-case on`" 2> /dev/null; $F `"$command`" `"$wordToComplete`" `"$previousWord`" 2> /dev/null" $COMPREPLY = "IFS=`$'\n'; echo `"`${COMPREPLY[*]}`"" $commandLine = "$bashCompletion; $commandCompletion; $COMPINPUT; $COMPGEN; $COMPREPLY" -split ' ' # Invoke bash completion and return CompletionResults. $previousCompletionText = "" (wsl.exe $commandLine) -split '\n' | Sort-Object -Unique -CaseSensitive | ForEach-Object { if ($wordToComplete -match "(.*=).*") { $completionText = Format-WslArgument ($Matches[1] + $_) $true $listItemText = $_ } else { $completionText = Format-WslArgument $_ $true $listItemText = $completionText } if ($completionText -eq $previousCompletionText) { # Differentiate completions that differ only by case otherwise PowerShell will view them as duplicate. $listItemText += ' ' } $previousCompletionText = $completionText [System.Management.Automation.CompletionResult]::new($completionText, $listItemText, 'ParameterName', $completionText) } } # Helper function to escape characters in arguments passed to WSL that would otherwise be misinterpreted. function global:Format-WslArgument([string]$arg, [bool]$interactive) { if ($interactive -and $arg.Contains(" ")) { return "'$arg'" } else { return ($arg -replace " ", "\ ") -replace "([()|])", ('\$1', '`$1')[$interactive] } } 

рдХреЛрдб рдХреБрдЫ рдмрд╛рд╢ рдЖрдВрддрд░рд┐рдХреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдереЛрдбрд╝рд╛ рддрдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  • рд╣рдо рдЕрдкрдиреЗ $commands рдлрдВрдХреНрд╢рди рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП $commands рдХреА рд╕реВрдЪреА -CommandName Register-ArgumentCompleter рд▓рд┐рдП -CommandName рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдХреЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрддреЗ рд╣реИрдВред
  • рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЛ рд╢реЗрд▓ рдлрдВрдХреНрд╢рди рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдСрдЯреЛрдХреЙрдореНрдкрд▓реЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдмреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдмреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ $F рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдСрдЯреЛрдХрдореНрдкреНрд▓реАрд╢рди рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, complete -F <FUNCTION> рд▓рд┐рдП рдХрдо)ред
  • $wordToComplete рддрд░реНрдХреЛрдВ рдХреЛ $wordToComplete , $commandAst рдФрд░ $cursorPosition рдХрд░реЗрдВ, рдЬреЛ рдХрд┐ рдмреИрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдлреЙрд░реНрдореЗрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреВрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред
  • рд╣рдо wsl.exe рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╣реА рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯрд┐рдВрдЧ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрдкрдпреБрдХреНрдд wsl.exe рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рдлрд┐рд░ рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде wsl рдХреЛ рдХреЙрд▓ wsl , рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд▓рд╛рдЗрди wsl рд╕рд╛рде рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП wsl рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ wsl рд╣реИрдВ рдФрд░ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдФрд░ рдмреНрд░реИрдХреЗрдЯ рдЬреИрд╕реЗ рдкрд╛рддреНрд░реЛрдВ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛ред

рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЗ рдЧреЛрд▓реЗ рдмреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рдХреЗ рдСрдЯреЛрдХрдВрдкреНрд▓реАрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ! рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • ssh -c <TAB> -J <TAB> -m <TAB> -O <TAB> -o <TAB> -Q <TAB> -w <TAB> -b <TAB>

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ рдкрд┐рдЫрд▓реЗ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдиреЛрдВ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддрд╛ рд╣реИ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдирд╛, рдЬреИрд╕реЗ рдХрд┐ рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрд▓ рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реЛрд╕реНрдЯ!

<TAB> рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрдХреНрд░ рдХрд░реЗрдЧрд╛ред <Ctrl + > рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдмреИрд╢ рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рдЕрдм рд╣рдорд╛рд░реЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдк рд╕реАрдзреЗ PowerShell рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдкрдереЛрдВ рдХреЛ рд╕реНрд╡рдд: рдкреВрд░реНрдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

  • less /etc/<TAB>
  • ls /usr/share/<TAB>
  • vim ~/.bash<TAB>

рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдмреИрд╢ рдСрдЯреЛрдХрдВрдкреНрд▓реАрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, PowerShell рд╡рд┐рдВрдбреЛрдЬ рдкрде рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдк рдПрдХ рд╕рд╛рде рдЙрди рдФрд░ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╡рд┐рд╡реЗрдХ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


PowerShell рдФрд░ WSL рдХреЗ рд╕рд╛рде, рд╣рдо рдореВрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдХреЛ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Win32 рдмрд┐рд▓реНрдб рдпрд╛ рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдпрд╛ рд▓рд┐рдирдХреНрд╕ рд╢реЗрд▓ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ WSL рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ , рдЕрдкрдиреЗ PowerShell рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдФрд░ рдЙрди рдХрдорд╛рдВрдб рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ! рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдФрд░ рдкрде рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдореГрджреНрдз рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЖрдЬ рдореВрд▓ рд╡рд┐рдВрдбреЛрдЬ рдХрдорд╛рдВрдб рдореЗрдВ рднреА рдирд╣реАрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИред

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рд╛рде рд╣реА рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред

рдХреМрди рд╕рд╛ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ? рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рдЕрдиреНрдп рдкрд░рд┐рдЪрд┐рдд рдЪреАрдЬреЗрдВ рдЧрд╛рдпрдм рд╣реИрдВ? рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдпрд╛ GitHub рдкрд░ рд▓рд┐рдЦреЗрдВ!

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


All Articles