PowerShell рд░ WSL рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ Windows рдорд╛ рд▓рд┐рдирдХреНрд╕ рдЖрджреЗрд╢рд╣рд░реВ рдПрдХреАрдХреГрдд рдЧрд░реНрджреИ

рд╡рд┐рдиреНрдбреЛрдЬ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрдмрд╛рдЯ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди: "рдХрд┐рди рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рдЫреИрди <╨Т╨б╨в╨Р╨Т╨м╨в╨Х ╨в╨г╨в ╨Ы╨о╨С╨Ш╨Ь╨г╨о ╨Ъ╨Ю╨Ь╨Р╨Э╨Ф╨г LINUX>?ред рдЪрд╛рд╣реЗ рдпреЛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрд╡рд╛рдЗрдк рд╣реЛ less рд╡рд╛ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдХрд░рдгрд╣рд░реВ grep рд╡рд╛ sed, Windows рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ рдЖрдлреНрдиреЛ рджреИрдирд┐рдХ рдХрд╛рдордорд╛ рдпреА рдЖрджреЗрд╢рд╣рд░реВрдорд╛ рд╕рдЬрд┐рд▓реЛ рдкрд╣реБрдБрдЪ рдЪрд╛рд╣рдиреНрдЫрдиреНред

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

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

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд▓рд┐рдирдХреНрд╕ рдЖрджреЗрд╢рд╣рд░реВ Windows рдЕрдиреНрддрд░реНрдЧрдд рджреЛрд╕реНрд░реЛ-рдХрдХреНрд╖рд╛рдХрд╛ рдирд╛рдЧрд░рд┐рдХрд╣рд░реВ рдЬрд╕реНрддреИ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░рд┐рдиреНрдЫ - рд░ рдиреЗрдЯрд┐рдн рдЖрджреЗрд╢рд╣рд░реВ рднрдиреНрджрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЧрд╛рд╣реНрд░реЛ рд╣реБрдиреНрдЫред рдЙрдиреАрд╣рд░реВрдХреЛ рдЕрдзрд┐рдХрд╛рд░рд▓рд╛рдИ рд╕рдорд╛рди рдмрдирд╛рдЙрди, рд╕реВрдЪреАрдмрджреНрдз рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

PowerShell рдкреНрд░рдХрд╛рд░реНрдп рд░реИрдкрд░рд╣рд░реВ

PowerShell рдкреНрд░рдХрд╛рд░реНрдп рд░реНрдпрд╛рдкрд░рд╣рд░реВрд╕рдБрдЧ, рд╣рд╛рдореА рдХрдорд╛рдгреНрдб рдкреВрд░рд╛ рдЧрд░реНрди рд░ рдЙрдкрд╕рд░реНрдЧрд╣рд░реВрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣рдЯрд╛рдЙрди рд╕рдХреНрдЫреМрдВ wsl, 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 (e.g. 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рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпреА рдкрдерд╣рд░реВрд▓рд╛рдИ WSL рдкрдерд╣рд░реВрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрджрдЫред рд╣рд╛рдореА рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░реНрдп рдорд╛рд░реНрдлрдд рдорд╛рд░реНрдЧрд╣рд░реВ рдЪрд▓рд╛рдЙрдБрдЫреМрдВ Format-WslArgument, рдЬреБрди рд╣рд╛рдореА рдкрдЫрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВред рдпрд╕рд▓реЗ рд╕реНрдкреЗрд╕ рд░ рдХреЛрд╖реНрдардХрд╣рд░реВ рдЬрд╕реНрддрд╛ рд╡рд┐рд╢реЗрд╖ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ рдЫреЛрдбреНрдЫ рдЬреБрди рдЕрдиреНрдпрдерд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░рд┐рдиреЗрдЫред

рдЕрдиреНрддрдорд╛, рд╣рд╛рдореА рдмреБрдЭрд╛рдЙрдБрдЫреМрдВ 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 - рдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд╣рд░реВ рд▓реЛрдб рдЧрд░рд┐рдПрдХрд╛ рдЫреИрдирдиреН, рддреНрдпрд╕реИрд▓реЗ рдпреА рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫреИрдирдиреН (рдЬрд╕реНрддреИред ls WSL рдорд╛ рд░ wsl ls рдорд╛рдерд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрдкрдирд╛рдо рд╕рдВрдЧ рдлрд░рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдиреЗрдЫ)ред

PowerShell рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ $PSDefaultParameterValues, рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рдирдХ рд╕рдВрдпрдиреНрддреНрд░, рддрд░ cmdlets рд░ рдЙрдиреНрдирдд рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ред рдЕрд╡рд╢реНрдп рдкрдирд┐, рд╣рд╛рдореА рд╣рд╛рдореНрд░рд╛ рд╢реЗрд▓рд╣рд░реВрдмрд╛рдЯ рдЙрдиреНрдирдд рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдмрдирд╛рдЙрди рд╕рдХреНрдЫреМрдВ, рддрд░ рдпрд╕рд▓реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛рд╣рд░реВ рдкрд░рд┐рдЪрдп рдЧрд░рд╛рдЙрдБрдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, PowerShell рдЖрдВрд╢рд┐рдХ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдирд╛рдорд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, -a рд╕рдВрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫ -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, рддрд┐рдореА рд╕рдХреНрдЫреМ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрд╕рдХреНрд╖рдо рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫ рдЕрд╕реНрдерд╛рдпреА рд░реВрдкрдорд╛ рдХреБрдЮреНрдЬреА рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрд░ "Disabled" рдЕрд░реНрде рдорд╛ $trueред рдЫреБрдЯреНрдЯреИ рд╣реНрдпрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рдЕрд╕рдХреНрд╖рдо рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рд╣реЛ $WslDefaultParameterValues рдмрд╛рдЯ рдЕрд▓рдЧ $PSDefaultParameterValues.

рддрд░реНрдХ рд╕рдорд╛рдкрди

PowerShell рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрд░реНрдХ рдЯреНрд░реЗрд▓рд░рд╣рд░реВ рджрд░реНрддрд╛ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ Register-ArgumentCompleterред рдмрд╛рд╕рд╕рдБрдЧ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдордпреЛрдЧреНрдп рд╕реНрд╡рдд: рдкреВрд░рд╛ рдЧрд░реНрдиреЗ рдЙрдкрдХрд░рдгред WSL рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ PowerShell рдмрд╛рдЯ bash рдХрд▓ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ 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]
    }
}

рдХреЛрдб bash рдХреЛ рдЖрдиреНрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реБ рдХреЛ рдХреЗрд╣рд┐ рдмреБрдЭреНрди рдмрд┐рдирд╛ рдЕрд▓рд┐ рдШрдирд╛ рдЫ, рддрд░ рдореВрд▓рддрдГ рд╣рд╛рдореА рдХреЗ рдЧрд░реНрдЫреМрдВ рдпреЛ рд╣реЛ:

  • рд╣рд╛рдореНрд░реЛ рд╕рдмреИ рдкреНрд░рдХрд╛рд░реНрдп рд░реНрдпрд╛рдкрд░рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╕реВрдЪреА рдкрд╛рд╕ рдЧрд░реЗрд░ рддрд░реНрдХ рдкреВрд░реНрдгрдХрд░реНрддрд╛ рджрд░реНрддрд╛ рдЧрд░реНрджреИ $commands рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдорд╛ -CommandName рд▓рд╛рдЧрд┐ Register-ArgumentCompleter.
  • рд╣рд╛рдореАрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдгреНрдбрд▓рд╛рдИ рд╢реЗрд▓ рдкреНрд░рдХрд╛рд░реНрдпрдорд╛ рдирдХреНрд╕рд╛ рдЧрд░реНрдЫреМрдВ рдЬреБрди рдмрд╛рд╢рд▓реЗ рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ (рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрди, bash рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред $F, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо complete -F <FUNCTION>).
  • PowerShell рддрд░реНрдХрд╣рд░реВ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ $wordToComplete, $commandAst ╨╕ $cursorPosition рдирд┐рд░реНрджрд┐рд╖реНрдЯреАрдХрд░рдг рдЕрдиреБрд╕рд╛рд░ bash рдХреЛ рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдврд╛рдБрдЪрд╛рдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдордпреЛрдЧреНрдп рд╕реНрд╡рдд: рдкреВрд░рд╛ bash
  • рд╣рд╛рдореА рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрди рдмрдирд╛рдЙрдБрдЫреМрдВ wsl.exe, рдЬрд╕рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдареАрдХрд╕рдБрдЧ рд╕реЗрдЯрдЕрдк рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрджрдЫ, рдЙрдкрдпреБрдХреНрдд рд╕реНрд╡рдд: рдкреВрд░рд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдЫ, рд░ рдирддрд┐рдЬрд╛рд╣рд░реВрд▓рд╛рдИ рд▓рд╛рдЗрди-рдмрд╛рдЗ-рд▓рд╛рдЗрди рдлреЗрд╕рдирдорд╛ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрджрдЫред
  • рддреНрдпрд╕рдкрдЫрд┐ рдлреЛрди рдЧрд░реНрдЫреМрдВ wsl рдХрдорд╛рдгреНрдб рд▓рд╛рдЗрдирдХреЛ рд╕рд╛рде, рд╣рд╛рдореА рд▓рд╛рдЗрди рд╡рд┐рднрд╛рдЬрдХрджреНрд╡рд╛рд░рд╛ рдЖрдЙрдЯрдкреБрдЯ рдЕрд▓рдЧ рдЧрд░реНрдЫреМрдВ рд░ рдкреНрд░рддреНрдпреЗрдХрдХреЛ рд▓рд╛рдЧрд┐ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫреМрдВ CompletionResults, рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдХреНрд░рдордмрджреНрдз рдЧрд░реНрджреИ рд░ рдПрд╕реНрдХреЗрдкрд┐рдЩ рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ рдЬрд╕реНрддреИ рд╕реНрдкреЗрд╕ рд░ рдХреЛрд╖реНрдардХрд╣рд░реВ рдЬреБрди рдЕрдиреНрдпрдерд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реБрдиреЗрдЫред

рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╣рд╛рдореНрд░реЛ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдгреНрдб рд╢реЗрд▓рд╣рд░реВрд▓реЗ bash рдХреЛ рд░реВрдкрдорд╛ рдареНрдпрд╛рдХреНрдХреИ рдЙрд╣реА рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫ! рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐:

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

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛рд▓реЗ рдЕрдШрд┐рд▓реНрд▓реЛ рддрд░реНрдХрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдирд╣рд░реВ рдЖрдкреВрд░реНрддрд┐ рдЧрд░реНрджрдЫ, рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдбреЗрдЯрд╛ рдкрдвреНрджреИ рдЬрд╕реНрддреИ WSL рдмрд╛рдЯ рдЬреНрдЮрд╛рдд рд╣реЛрд╕реНрдЯрд╣рд░реВ!

<TAB> рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдорд╛рд░реНрдлрдд рдЪрдХреНрд░ рд╣реБрдиреЗрдЫред <Ctrl + ╨┐╤А╨╛╨▒╨╡╨╗> рд╕рдмреИ рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рджреЗрдЦрд╛рдЙрдиреЗрдЫред

рд╕рд╛рдереИ, рд╣рд╛рдореАрд╕рдБрдЧ рдЕрдм bash рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рднрдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рддрдкрд╛рдИрдВрд▓реЗ PowerShell рдорд╛ рд╕рд┐рдзреИ рд▓рд┐рдирдХреНрд╕ рдкрдерд╣рд░реВ рд╕реНрд╡рдд: рдкреВрд░реНрдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ!

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

рдмрд╛рд╕ рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛рд▓реЗ рдХреБрдиреИ рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рдЙрддреНрдкрд╛рджрди рдЧрд░реНрджреИрди рднрдиреЗ, PowerShell рдкреНрд░рдгрд╛рд▓реА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╡рд┐рдиреНрдбреЛрдЬ рдкрдерд╣рд░реВрдорд╛ рдлрд░реНрдХрд┐рдиреНрдЫред рддрд╕рд░реНрде, рдЕрднреНрдпрд╛рд╕рдорд╛, рддрдкрд╛рдЗрдБ рдПрдХреИ рд╕рд╛рде рддрдкрд╛рдЗрдБрдХреЛ рд╡рд┐рд╡реЗрдХрдорд╛ рджреБрдмреИ рдорд╛рд░реНрдЧрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

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

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

рдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рд╛рдереИ рдпрд╕рд▓рд╛рдИ рддрдкрд╛рдИрдВрдХреЛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдердк рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢рд╣рд░реВ рдЙрдкрд▓рдмреНрдз рдЫрдиреН рдпрд╣рд╛рдБ.

рдХреБрди рд▓рд┐рдирдХреНрд╕ рдЖрджреЗрд╢рд╣рд░реВ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕рдмреИрднрдиреНрджрд╛ рдЙрдкрдпреЛрдЧреА рд▓рд╛рдЧреНрдЫ? Windows рдорд╛ рдХрд╛рдо рдЧрд░реНрджрд╛ рдХреЗ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬрд╣рд░реВ рд╣рд░рд╛рдЗрд░рд╣реЗрдХрд╛ рдЫрдиреН? рдХрдореЗрдиреНрдЯрдорд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рд╡рд╛ GitHub рдорд╛!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди