рд╡рд┐рдиреНрдбреЛрдЬ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрдмрд╛рдЯ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди: "рдХрд┐рди рддреНрдпрд╣рд╛рдБ рдЕрдЭреИ рдЫреИрди <╨Т╨б╨в╨Р╨Т╨м╨в╨Х ╨в╨г╨в ╨Ы╨о╨С╨Ш╨Ь╨г╨о ╨Ъ╨Ю╨Ь╨Р╨Э╨Ф╨г LINUX>
?ред рдЪрд╛рд╣реЗ рдпреЛ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрд╡рд╛рдЗрдк рд╣реЛ less
рд╡рд╛ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдХрд░рдгрд╣рд░реВ grep
рд╡рд╛ sed
, Windows рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ рдЖрдлреНрдиреЛ рджреИрдирд┐рдХ рдХрд╛рдордорд╛ рдпреА рдЖрджреЗрд╢рд╣рд░реВрдорд╛ рд╕рдЬрд┐рд▓реЛ рдкрд╣реБрдБрдЪ рдЪрд╛рд╣рдиреНрдЫрдиреНред
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
рдЖрджреЗрд╢рд╣рд░реВрдХреЛ рдЖрдзрд╛рд░рднреВрдд рд╕реЗрдЯ рдпрд╣рд╛рдБ рджреЗрдЦрд╛рдЗрдПрдХреЛ рдЫ, рддрд░ рддрдкрд╛рдИрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рд▓рд┐рдирдХреНрд╕ рдЖрджреЗрд╢рдХреЛ рд▓рд╛рдЧрд┐ рдпрд╕рд▓рд╛рдИ рд╕реВрдЪреАрдорд╛ рдердкреЗрд░ рд╢реЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпреЛ рдХреЛрдб рддрдкрд╛рдЗрдБрдХреЛ рдорд╛ рдердкреНрдиреБрд╣реБрдиреНрдЫ
рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реЗрдЯрд┐рдЩрд╣рд░реВ
рд▓рд┐рдирдХреНрд╕рдорд╛, рдкреНрд░рд╛рдп: рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдЖрджреЗрд╢рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрджреИ рд▓рдЧрдЗрди рдкреНрд░реЛрдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рдЙрдкрдирд╛рдо рд░/рд╡рд╛ рд╡рд╛рддрд╛рд╡рд░рдгреАрдп рдЪрд░рд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрди рд╕рд╛рдорд╛рдиреНрдп рдЫ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, alias ls=ls -AFh
рд╡рд╛ export LESS=-i
)ред рдЧреИрд░-рдЕрдиреНрддрд░реНрдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╢реЗрд▓ рдорд╛рд░реНрдлрдд рдкреНрд░реЛрдХреНрд╕реА рдЧрд░реНрдиреЗ рдмреЗрдлрд╛рдЗрджрд╛рд╣рд░реВ рдордзреНрдпреЗ рдПрдХ wsl.exe
- рдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд╣рд░реВ рд▓реЛрдб рдЧрд░рд┐рдПрдХрд╛ рдЫреИрдирдиреН, рддреНрдпрд╕реИрд▓реЗ рдпреА рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫреИрдирдиреН (рдЬрд╕реНрддреИред ls
WSL рдорд╛ рд░ wsl ls
рдорд╛рдерд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрдкрдирд╛рдо рд╕рдВрдЧ рдлрд░рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдиреЗрдЫ)ред
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
ред рдмрд╛рд╕рд╕рдБрдЧ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЫ
# 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 рдмрд┐рд▓реНрдбрд╣рд░реВ рд╡рд╛ рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рдЦреЛрдЬреНрди рд╡рд╛ рд▓рд┐рдирдХреНрд╕ рд╢реЗрд▓рдорд╛ рдЧрдПрд░ рддрдкрд╛рдИрдВрдХреЛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рд▓рд╛рдИ рдЕрд╡рд░реЛрдз рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред рдмрд╕
рдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рд╛рдереИ рдпрд╕рд▓рд╛рдИ рддрдкрд╛рдИрдВрдХреЛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣рдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдердк рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢рд╣рд░реВ рдЙрдкрд▓рдмреНрдз рдЫрдиреН
рдХреБрди рд▓рд┐рдирдХреНрд╕ рдЖрджреЗрд╢рд╣рд░реВ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕рдмреИрднрдиреНрджрд╛ рдЙрдкрдпреЛрдЧреА рд▓рд╛рдЧреНрдЫ? Windows рдорд╛ рдХрд╛рдо рдЧрд░реНрджрд╛ рдХреЗ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬрд╣рд░реВ рд╣рд░рд╛рдЗрд░рд╣реЗрдХрд╛ рдЫрдиреН? рдХрдореЗрдиреНрдЯрдорд╛ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рд╡рд╛
рд╕реНрд░реЛрдд: www.habr.com