рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕рдЪрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди: тАЬрдЕрдЬреВрдирд╣реА рдХрд╛ рдирд╛рд╣реА <╨Т╨б╨в╨Р╨Т╨м╨в╨Х ╨в╨г╨в ╨Ы╨о╨С╨Ш╨Ь╨г╨о ╨Ъ╨Ю╨Ь╨Р╨Э╨Ф╨г LINUX>
?. рддреЛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрд╡рд╛рдЗрдк рдЕрд╕реЛ less
рдХрд┐рдВрд╡рд╛ рдкрд░рд┐рдЪрд┐рдд рд╕рд╛рдзрдиреЗ grep
рдХрд┐рдВрд╡рд╛ sed
, рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕рдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рджреИрдирдВрджрд┐рди рдХрд╛рдорд╛рдд рдпрд╛ рдХрдорд╛рдВрдбреНрд╕рдЪрд╛ рд╕рд╣рдЬ рдкреНрд░рд╡реЗрд╢ рд╣рд╡рд╛ рдЕрд╕рддреЛ.
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
рд╡рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЙрдкрдирд╛рдорд╛рд╕рд╣ рд╡реЗрдЧрд│реНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рд╡рд╛рдЧреЗрд▓).
рдкреЙрд╡рд░рд╢реЗрд▓ рдкреНрд░рджрд╛рди рдХрд░рддреЗ -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
. рдмреЕрд╢рдордзреНрдпреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЖрд╣реЗ
# 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 рдмрд┐рд▓реНрдб рдХрд┐рдВрд╡рд╛ рд▓рд┐рдирдХреНрд╕ рдпреБрдЯрд┐рд▓рд┐рдЯреА рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдХрд┐рдВрд╡рд╛ рд▓рд┐рдирдХреНрд╕ рд╢реЗрд▓рд╡рд░ рдЬрд╛рдКрди рддреБрдордЪреНрдпрд╛ рд╡рд░реНрдХрдлреНрд▓реЛрдордзреНрдпреЗ рд╡реНрдпрддреНрдпрдп рдЖрдгрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рдлрдХреНрдд
рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓рд╛ рд╕рдВрдкреВрд░реНрдг рд╕реНрддреНрд░реЛрдд рдХреЛрдб, рддрд╕реЗрдЪ рддреБрдордЪреНрдпрд╛ рд╡рд░реНрдХрдлреНрд▓реЛрдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рддрддреНрддреНрд╡реЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд
рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгрддреНрдпрд╛ рд▓рд┐рдирдХреНрд╕ рдХрдорд╛рдВрдбреНрд╕ рд╕рд░реНрд╡рд╛рдд рдЙрдкрдпреБрдХреНрдд рд╡рд╛рдЯрддрд╛рдд? рд╡рд┐рдВрдбреЛрдЬрдордзреНрдпреЗ рдХрд╛рдо рдХрд░рддрд╛рдирд╛ рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛрд╖реНрдЯреА рдЧрд╣рд╛рд│ рдЖрд╣реЗрдд? рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд▓рд┐рд╣рд╛ рдХрд┐рдВрд╡рд╛
рд╕реНрддреНрд░реЛрдд: www.habr.com