рдкреЙрд╡рд░рд╢реЗрд▓ рдЖрдгрд┐ рдбрдмреНрд▓реНрдпреВрдПрд╕рдПрд▓ рд╡рд╛рдкрд░реВрди рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдбреНрд╕ рд╡рд┐рдВрдбреЛрдЬрдордзреНрдпреЗ рд╕рдорд╛рдХрд▓рд┐рдд рдХрд░рдгреЗ

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

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

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

рдкрд░рд┐рдгрд╛рдореА, рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдбреНрд╕рдирд╛ рд╡рд┐рдВрдбреЛрдЬ рдЕрдВрддрд░реНрдЧрдд рджреНрд╡рд┐рддреАрдп рд╢реНрд░реЗрдгреАрдЪреНрдпрд╛ рдирд╛рдЧрд░рд┐рдХрд╛рдВрд╕рд╛рд░рдЦреЗ рд╡рд╛рдЧрд╡рд▓реЗ рдЬрд╛рддреЗ - рдЖрдгрд┐ рдореВрд│ рдХрдорд╛рдВрдбрдкреЗрдХреНрд╖рд╛ рд╡рд╛рдкрд░рдгреЗ рдЕрдзрд┐рдХ рдХрдареАрдг рдЖрд╣реЗ. рддреНрдпрд╛рдВрдЪреЗ рдЕрдзрд┐рдХрд╛рд░ рд╕рдорд╛рди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕реВрдЪреАрдмрджреНрдз рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдкреЙрд╡рд░рд╢реЗрд▓ рдлрдВрдХреНрд╢рди рд░реЕрдкрд░реНрд╕

рдкреЙрд╡рд░рд╢реЗрд▓ рдлрдВрдХреНрд╢рди рд░реЕрдкрд░реНрд╕рд╕рд╣, рдЖрдореНрд╣реА рдХрдорд╛рдВрдб рдХрдореНрдкреНрд▓рд┐рд╢рди рдЬреЛрдбреВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЙрдкрд╕рд░реНрдЧрд╛рдВрдЪреА рдЧрд░рдЬ рджреВрд░ рдХрд░реВ рд╢рдХрддреЛ wsl, Windows рдкрде 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

рдХрдорд╛рдВрдбрдЪрд╛ рдореВрд▓рднреВрдд рд╕рдВрдЪ рдпреЗрдереЗ рджрд░реНрд╢рд╡рд┐рд▓рд╛ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреБрдореНрд╣реА рдХреЛрдгрддреНрдпрд╛рд╣реА рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдбрд╕рд╛рдареА рдлрдХреНрдд рд╕реВрдЪреАрдордзреНрдпреЗ рдЬреЛрдбреВрди рд╢реЗрд▓ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛. рдЖрдкрдг рд╣рд╛ рдХреЛрдб рдЬреЛрдбрд▓реНрдпрд╛рд╕ рдЖрдкрд▓реНрдпрд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдкреЙрд╡рд░рд╢реЗрд▓, рдпрд╛ рдХрдорд╛рдВрдбреНрд╕ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреЙрд╡рд░рд╢реЗрд▓ рд╕реЗрд╢рдирдордзреНрдпреЗ, рдиреЗрдЯрд┐рд╡реНрд╣ рдХрдорд╛рдВрдбреНрд╕рдкреНрд░рдорд╛рдгреЗрдЪ рдЙрдкрд▓рдмреНрдз рдЕрд╕рддреАрд▓!

рдбреАрдлреЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ

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

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

рддрдерд╛рдкрд┐, рдЖрдордЪреНрдпрд╛ рд╢реЗрд▓рдордзреНрдпреЗ рдереЛрдбрд╛рд╕рд╛ рдмрджрд▓ рдХрд░реВрди, рдЖрдореНрд╣реА рд╕рд╛рд░рдЦреЗ рдореЙрдбреЗрд▓ рд▓рд╛рдЧреВ рдХрд░реВ рд╢рдХрддреЛ $PSDefaultParameterValues, рдЖрдгрд┐ Linux рдХрдорд╛рдВрдбрд╕рд╛рдареА рдбреАрдлреЙрд▓реНрдЯ рдкрд░реНрдпрд╛рдп рд╕рдХреНрд╖рдо рдХрд░рд╛!

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.

рдпреБрдХреНрддрд┐рд╡рд╛рдж рдкреВрд░реНрдг

рдкреЙрд╡рд░рд╢реЗрд▓ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВрди рдпреБрдХреНрддрд┐рд╡рд╛рдж рдЯреНрд░реЗрд▓рд░рдЪреА рдиреЛрдВрджрдгреА рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ Register-ArgumentCompleter. рдмреЕрд╢рдордзреНрдпреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЖрд╣реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рд╕реНрд╡рдпрдВ-рдкреВрд░реНрдг рд╕рд╛рдзрдиреЗ. WSL рддреБрдореНрд╣рд╛рд▓рд╛ рдкреЙрд╡рд░рд╢реЗрд▓ рд╡рд░реВрди рдмреЕрд╢ рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. рдЬрд░ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдкреЙрд╡рд░рд╢реЗрд▓ рдлрдВрдХреНрд╢рди рд░реЕрдкрд░реНрд╕рд╕рд╛рдареА рд╡рд┐рддрд░реНрдХ рдкреВрд░реНрдгрддрд╛ рдиреЛрдВрджрд╡реВ рд╢рдХрд▓реЛ рдЖрдгрд┐ рдкреВрд░реНрдгрддрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрд▓ рдмреЕрд╢ рдХрд░реВ рд╢рдХрд▓реЛ, рддрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдмреЕрд╢ рд╕рд╛рд░рдЦреНрдпрд╛рдЪ рдЕрдЪреВрдХрддреЗрд╕рд╣ рд╕рдВрдкреВрд░реНрдг рдпреБрдХреНрддрд┐рд╡рд╛рдж рдкреВрд░реНрдгрддреНрд╡ рдорд┐рд│реЗрд▓!

# 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 рдкреЕрд░рд╛рдореАрдЯрд░ рдордзреНрдпреЗ -CommandName рддреЗ Register-ArgumentCompleter.
  • рдЖрдореНрд╣реА рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдбрд▓рд╛ рд╢реЗрд▓ рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рдореЕрдк рдХрд░рддреЛ рдЬреЗ рдмреЕрд╢ рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддреЗрд╕рд╛рдареА рд╡рд╛рдкрд░рддреЗ (рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдмреЕрд╢ рд╡рд╛рдкрд░рддреЗ $F, рд╕рд╛рдареА рд╕рдВрдХреНрд╖реЗрдк complete -F <FUNCTION>).
  • рдкреЙрд╡рд░рд╢реЗрд▓ рд╡рд┐рддрд░реНрдХ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ $wordToComplete, $commandAst ╨╕ $cursorPosition рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдиреБрд╕рд╛рд░ рдмреЕрд╢рдЪреНрдпрд╛ рд╕реНрд╡рдпрдВрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдВрджреНрд╡рд╛рд░реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕реНрд╡рд░реВрдкрд╛рдордзреНрдпреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рд╕реНрд╡рдпрдВ-рдкреВрд░реНрдгрддрд╛ рдмрд╛рд╢
  • рдЖрдореНрд╣реА рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрдпрд╛рд░ рдХрд░рддреЛ wsl.exe, рдЬреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рддреЗ, рдпреЛрдЧреНрдп рд╕реНрд╡рдпрдВ-рдкреВрд░реНрдгрддрд╛ рдХрд╛рд░реНрдп рдХреЙрд▓ рдХрд░рддреЗ, рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдо рд▓рд╛рдИрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдлреЕрд╢рдирдордзреНрдпреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ.
  • рдордЧ рдЖрдореНрд╣реА рдХреЙрд▓ рдХрд░рддреЛ wsl рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирд╕рд╣, рдЖрдореНрд╣реА рд▓рд╛рдЗрди рд╕реЗрдкрд░реЗрдЯрд░рджреНрд╡рд╛рд░реЗ рдЖрдЙрдЯрдкреБрдЯ рд╡реЗрдЧрд│реЗ рдХрд░рддреЛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рдЬрдирд░реЗрдЯ рдХрд░рддреЛ CompletionResults, рддреНрдпрд╛рдВрдЪреА рдХреНрд░рдорд╡рд╛рд░реА рд▓рд╛рд╡рдгреЗ рдЖрдгрд┐ рд╕реНрдкреЗрд╕реЗрд╕ рдЖрдгрд┐ рдХрдВрд╕ рдпрд╛рдВрд╕рд╛рд░рдЦреНрдпрд╛ рд╡рд░реНрдгрд╛рдВрдЪреА рд╕реБрдЯрдХрд╛ рдХрд░рдгреЗ рдЬреНрдпрд╛рдЪрд╛ рдЕрдиреНрдпрдерд╛ рдЪреБрдХреАрдЪрд╛ рдЕрд░реНрде рд▓рд╛рд╡рд▓рд╛ рдЬрд╛рдИрд▓.

рдкрд░рд┐рдгрд╛рдореА, рдЖрдордЪреЗ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдб рд╢реЗрд▓ рдмреЕрд╢ рдкреНрд░рдорд╛рдгреЗрдЪ рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛ рд╡рд╛рдкрд░рддреАрд▓! рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде:

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

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛ рдорд╛рдЧреАрд▓ рдпреБрдХреНрддрд┐рд╡рд╛рджрд╛рд╕рд╛рдареА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЗ рдкреБрд░рд╡рддреЗ, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рд╡рд╛рдЪрддреЗ рдЬрд╕реЗ рдХреА WSL рдХрдбреАрд▓ рдЬреНрдЮрд╛рдд рд╣реЛрд╕реНрдЯ!

<TAB> рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреВрди рд╕рд╛рдпрдХрд▓ рдЪрд╛рд▓рд╡реЗрд▓. <Ctrl + ╨┐╤А╨╛╨▒╨╡╨╗> рд╕рд░реНрд╡ рдЙрдкрд▓рдмреНрдз рдкрд░реНрдпрд╛рдп рджрд░реНрд╢рд╡реЗрд▓.

рд╢рд┐рд╡рд╛рдп, рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдЖрддрд╛ рдмреЕрд╢ рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рддреБрдореНрд╣реА рдереЗрдЯ PowerShell рдордзреНрдпреЗ Linux рдкрде рд╕реНрд╡рдпрдВрдкреВрд░реНрдг рдХрд░реВ рд╢рдХрддрд╛!

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

рдЬреНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рдмреЕрд╢ рд╕реНрд╡рдпрдВрдкреВрд░реНрдгрддрд╛ рдХреЛрдгрддреЗрд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдд рдирд╛рд╣реА, рдкреЙрд╡рд░рд╢реЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдбреАрдлреЙрд▓реНрдЯ рд╡рд┐рдВрдбреЛрдЬ рдкрдерд╛рдВрд╡рд░ рдкрд░рдд рдпреЗрддреЗ. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рд╕рд░рд╛рд╡ рдордзреНрдпреЗ, рдЖрдкрдг рдЖрдкрд▓реНрдпрд╛ рд╡рд┐рд╡реЗрдХрдмреБрджреНрдзреАрдиреБрд╕рд╛рд░ рджреЛрдиреНрд╣реА рдорд╛рд░реНрдЧ рдПрдХрд╛рдЪ рд╡реЗрд│реА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛.

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

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

рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓рд╛ рд╕рдВрдкреВрд░реНрдг рд╕реНрддреНрд░реЛрдд рдХреЛрдб, рддрд╕реЗрдЪ рддреБрдордЪреНрдпрд╛ рд╡рд░реНрдХрдлреНрд▓реЛрдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рддрддреНрддреНрд╡реЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд рдпреЗрдереЗ.

рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдбреНрд╕ рд╕рд░реНрд╡рд╛рдд рдЙрдкрдпреБрдХреНрдд рд╡рд╛рдЯрддрд╛рдд? рд╡рд┐рдВрдбреЛрдЬрдордзреНрдпреЗ рдХрд╛рдо рдХрд░рддрд╛рдирд╛ рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛрд╖реНрдЯреА рдЧрд╣рд╛рд│ рдЖрд╣реЗрдд? рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд▓рд┐рд╣рд╛ рдХрд┐рдВрд╡рд╛ GitHub рд╡рд░!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛