Windows developer áá»á¬ážáá¶á០áá¬áá¬ááºáá±ážááœááºážáá
áºáá¯- âáá¬ááŒá±á¬áá·áº áááŸááá±ážáá¬áá²á <ÐСТÐÐЬТРТУТ ÐЮÐÐÐУЮ ÐÐÐÐÐÐУ LINUX>
?á á¡á
áœááºážáááºáá²á· ááœááºááœá²ááŸá¯áá²ááŒá
áºááŒá
áºá less
ááá¯á·ááá¯áẠáááºážááŸá®ážáá±á¬áááááá¬áá»á¬áž grep
ááá¯á·ááá¯áẠsed
Windows developer áá»á¬ážááẠáááºážááá¯á·ááá±á·á
ááºáá¯ááºáááºážááœááºááœáẠá¡ááá¯áá« command áá»á¬ážááᯠááœááºáá°á
áœá¬ áááºáá±á¬ááºá¡áá¯á¶ážááŒá¯ááá¯ááŒáááºá
wsl.exe
(á¥ááá¬, wsl ls
) áááºážááẠáááá¬áááºááŸá¬ážáá±á¬ ááá¯ážáááºááŸá¯áá
áºáá¯ááŒá
áºáá±á¬áºáááºážá á€ááœá±ážáá»ááºááŸá¯ááẠá¡á¬ážáááºážáá»ááºáá»á¬ážá
áœá¬ááᯠááŒá¯á¶ááœá±á·áá±ááááºá
- áá±áá¬á¡ááŸá¶á· áááºáá±á¬ááºáž
wsl
áá»ááºážá áá¬áá±á¬ááºážááŒá®áž ááá¬áááá»áá°ážá - backslashes áá»á¬ážááᯠdirectory separators áá»á¬ážááẠescape á á¬áá¯á¶ážá¡ááŒá Ạá¡áááá¹áá¬ááºááŒááºááá¯áá±á¬ááŒá±á¬áá·áº á¡ááŒááºážá¡áá¯á¶áá»á¬ážááŸá Windows áááºážááŒá±á¬ááºážáá»á¬áž á¡ááŒá²áááºáž á¡áá¯ááºááá¯ááºáá«á
- á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááŸá Windows áááºážááŒá±á¬ááºážáá»á¬ážááᯠWSL ááœáẠáááºááá¯ááºáᬠmount point ááá¯á· áá¬áá¬ááŒááºááá¬ážáá«á
- áá¬áááºáá°áá»á¬ážááŸáá·áº áááºáááºážáá»ááºááŒá±á¬ááºážááœá²ááŸá¯áá»á¬ážáá«ááŸááá±á¬ WSL áááá¯ááá¯ááºáá»á¬ážááœáẠáá°áááºážáááºáááºáá»á¬ážááᯠáá±ážá á¬ážáááºááá¯ááºáá«á
- Linux áááºážááŒá±á¬ááºáž ááŒá®ážá á®ážááŸá¯ááᯠáá¶á·ááá¯ážááá¬ážáá«á
- Command ááŒá®ážáá¯á¶ážááŒááºážááᯠááá¶á·ááá¯ážáá«á
- á¡ááŒááºážá¡áá¯á¶ááŒá®ážá á®ážááŸá¯ááᯠááá¶á·ááá¯ážáá«á
ááááºá¡áá±ááŸáá·áºá Linux command áá»á¬ážááᯠWindows á¡á±á¬ááºááœáẠáá¯ááááááºážá á¬ážááá¯ááºáá¶áá¬ážáá»á¬ážáá²á·ááá¯á· ááá±á¬áá¬ážááŒá®áž- áá°áááºáž commands áá»á¬ážááẠá¡áá¯á¶ážááŒá¯á ááá¯áááºáá²áááºá áááºážááá¯á·á áááá¯ááºááœáá·áºáá»á¬ážááᯠáá®áá»áŸá á±áááºá á á¬áááºážááŒá¯á á¯áá¬ážáá±á¬ ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááẠááá¯á¡ááºáá«áááºá
PowerShell áá¯ááºáá±á¬ááºáá»áẠáá¯ááºááá¯ážááŸá¯áá»á¬áž
PowerShell function wrappers ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠcommand completion ááá¯áá±á«ááºážááá·áºááá¯ááºááŒá®áž prefix áá»á¬ážááá¯á¡ááºááŸá¯ááᯠáááºááŸá¬ážááá¯ááºáá«áááºá wsl
Windows áááºážááŒá±á¬ááºážáá»á¬ážááᯠWSL áááºážááŒá±á¬ááºážáá»á¬ážá¡ááŒá
Ạáá¬áá¬ááŒááºááá¯ááŒááºážá ááá¯ááœá¶áá»á¬ážá¡ááœáẠá¡ááŒá±áá¶ááá¯á¡ááºáá»ááºáá»á¬áž
- Linux command áá áºáá¯á á®á¡ááœáẠáá¬áááºáá° function wrapper áá áºáá¯ááŸáááá«áááºá
- shell ááẠá¡ááŒááºážá¡áá¯á¶áá»á¬ážá¡ááŒá ẠááŒááºááœá¬ážáá±á¬ Windows áááºážááŒá±á¬ááºážáá»á¬ážááᯠá¡ááá¡ááŸááºááŒá¯ááŒá®áž áááºážááá¯á·ááᯠWSL áááºážááŒá±á¬ááºážáá»á¬ážá¡ááŒá áºááá¯á· ááŒá±á¬ááºážááá«áááºá
- áá°ážááœá¶ááá¯á·áá±á¬á· áá±á«áºááá·áºáááºá
wsl
ááá·áºáá»á±á¬áºáá±á¬ Linux command ááŒáá·áº áááºááá·áº pipeline input ááá¯á·áááᯠcommand line argument áá»á¬ážááᯠááŒááºáááºážááŒá®áž function ááá¯á· áá±ážááá¯á·áááºá
á€áá¯á¶á á¶ááᯠáááºááá·áº command ááœááºáááᯠá¡áá¯á¶ážáá»ááá¯ááºáá±á¬ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠá€áá¯ááºááá¯ážááŒááºážá á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºááᯠááŸá¯ááºáá»ááá¯ááºááŒá®áž áááºááœááºážááẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážá á¬áááºážá០áááºážááá¯á·ááᯠááá¯ááºááá áºááŒáá·áº áá¯ááºáá¯ááºááá¯ááºáááºá
# 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
import commands áá»á¬ážááᯠáááºááŸááºáááºá ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠcommand ááá¯á¡áá¯á¶ážááŒá¯á áááºážááá¯á·áá
áºáá¯á
á®á¡ááœáẠfunction wrapper áá
áºáá¯ááᯠááá¯ááºážááá
áºááŒáá·áº áá¯ááºáá¯ááºáááºá Invoke-Expression
(áá¯ááºáá±á¬ááºáá»ááºááŸáá·áº ááœá²ááœá²á
á±ááá·áº áá¶áááºáá»á¬ážááᯠáŠážá
áœá¬ áááºááŸá¬ážááŒááºážááŒáá·áº)á
áá¯ááºáá±á¬ááºáá»ááºááẠcommand line arguments áá»á¬ážááẠáááºáá¬áááºáᬠááŒá
áºááŒá®ážá commands áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á Windows áááºážááŒá±á¬ááºážáá»á¬ážááᯠáá¯á¶ážááŒááºáá±ážáááºá Split-Path
О Test-Path
ááá¯á·áá±á¬áẠá€áááºážááŒá±á¬ááºážáá»á¬ážááᯠWSL áááºážááŒá±á¬ááºážáá»á¬ážá¡ááŒá
áºááá¯á· ááŒá±á¬ááºážáááºá á¡áá°á¡áá®áá±ážááá·áºáá¯ááºáá±á¬ááºáá»ááºááŸáá
áºááá·áº áá»áœááºá¯ááºááá¯á·ááẠáááºážááŒá±á¬ááºážáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá Format-WslArgument
áá±á¬ááºá០áááºááŸááºáá«áááºá áááºážááẠáá
áºáááºážáá
áºáá¯á¶ á¡áááá¹áá¬ááºááœá²ááŸá¬ážáá¶áááá·áº áá±áá¬ááœááºáá»á¬ážááŸáá·áº ááœááºážá
á¥áºáá»á¬ážáá²á·ááá¯á·áá±á¬ á¡áá°ážáá¬ááºáá±á¬ááºáá»á¬ážá០ááœááºáááºážáááºá
áá±á¬ááºáá¯á¶ážá¡áá±áá²á· áá»áœááºáá±á¬áºáááºááŒáááºá wsl
ááá¯ááºááá¯ááºážááá·áºááœááºážááŒááºážááŸáá·áº áááºááá·áº command line á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá
á€áá¯ááºááá¯ážááŸá¯áá»á¬ážááŒáá·áº áááºááŸá
áºáááºáá±á¬ Linux á¡áááá·áºáá»á¬ážááᯠááŸá±á·áááºáááá·áºáá² ááá¯ááá¯ááá¬ááá»áá±á¬áááºážáááºážááŒáá·áº áá±á«áºááá¯ááºáááºá wsl
áááºážááŒá±á¬ááºážááœá± áááºááá¯ááŒá±á¬ááºážááœá¬ážáá² á
áááºáá°á
áá¬áááá¯áá²á
man bash
less -i $profile.CurrentUserAllHosts
ls -Al C:Windows | less
grep -Ein error *.log
tail -f *.log
á¡ááŒá±áᶠcommand á¡á
á¯á¶ááᯠá€áá±áá¬ááœáẠááŒáá¬ážáááºá ááá¯á·áá±á¬áº áááºážááᯠá
á¬áááºážáá²ááá¯á· ááá·áºáá¯á¶ááŒáá·áº áááºááá·áº Linux command á¡ááœáẠshell áá
áºáá¯ááᯠáááºáá®ážááá¯ááºáááºá áá®áá¯ááºááá¯ááá·áºáááº
áá°áááºážáááºáááºáá»á¬áž
Linux ááœááºá á¡áá±á¬áá·áºáááºáááá¯ááá¯ááºáá»á¬ážááœáẠáá¬áááºáá°áá»á¬ážááŸáá·áº/ááá¯á·ááá¯áẠáááºáááºážáá»ááºááŒá±á¬ááºážááœá²áá»ááºáá»á¬ážááᯠáááºááŸááºáááºá áááŒá¬ááá¡áá¯á¶ážááŒá¯ááá·áº command áá»á¬ážá¡ááœáẠáá¯á¶áá±áá±á¬ááºáá»á¬ážááᯠáááºááŸááºááŒááºáž (á¥ááá¬á alias ls=ls -AFh
ááá¯á·ááá¯áẠexport LESS=-i
) á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááŸá¯áááŸááá±á¬ shell ááŸáááá·áº proxying áá¡á¬ážáááºážáá»ááºáá»á¬ážáá²ááŸáá
áºáᯠwsl.exe
- áááá¯ááá¯ááºáá»á¬ážááᯠááááºáá¬ážáá±á¬ááŒá±á¬áá·áº á€ááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠáá¯á¶áá±á¡á¬ážááŒáá·áº ááááŸáááá¯ááºáá« (ááá¯ááá¯áááºááŸá¬á ls
WSL ááŸáá·áº wsl ls
á¡áááºáá±á¬áºááŒáá« alias áá»á¬ážááŸáá·áº ááœá²ááŒá¬ážá
áœá¬ ááŒá¯áá°áá«áááºá)
PowerShell ááá±á¬ááºáá¶á·áá±ážáááºá -a
ááŸáá·áºáááºá
ááºáá±áááºá -ArgumentList
áá
áºá
áááºáá
áºááá¯ááºážá¡áááºáá»á¬ážááᯠá¡ááŒááºážá¡áá¯á¶á¡ááŒá
áºáá°áá±á¬ Linux command áá»á¬ážááŸáá·áº ááœá²ááœá²ááá·áº)á áá°áááºážáááºááá¯ážáá»á¬ážááᯠáááºááŸááºááŒááºážá¡ááœáẠsyntax ááẠá¡ááá·áºáá»á±á¬áºáá¯á¶ážááŒá
áºáááá·áºáááºááá¯ááºáá« (áá°áá¡ááŒááºážá¡áá¯á¶áá»á¬ážááẠáá®ážá¡ááœááºážááŸá áá«áá¬áá®áá¬áá¡áááºááᯠááá¯á¡ááºáááºá command name ááá¯áá¬áá)á .
ááá¯á·áá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á·á shells áá»á¬ážááᯠá¡áááºážááẠááŒá¯ááŒááºááœááºážáá¶ááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¬ážáá° áá±á¬áºáááºááᯠá¡áá±á¬ááºá¡ááẠáá±á¬áºááá¯ááºáá«áááºá $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
command line ááá¯á·áá»áœááºá¯ááºááá¯á·ááẠparameters áá»á¬ážááá¯áá±ážááá¯á·áááºá wsl.exe
. áá¯á¶áá±áááºáááºáá»á¬ážááᯠconfigure áá¯ááºááẠáááºá PowerShell áááá¯ááá¯ááºááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬áž ááá·áºááœááºážáááºážááᯠá¡á±á¬ááºáá«ááá¯á·ááŒááá¬ážáááºá ááá¯áá»áœááºá¯ááºááá¯á·áá¯ááºááá¯ááºáá«ááŒá®á
$WslDefaultParameterValues["grep"] = "-E"
$WslDefaultParameterValues["less"] = "-i"
$WslDefaultParameterValues["ls"] = "-AFh --group-directories-first"
áá±á¬ááºáá»á¬ážááᯠááá°áá¬áá°áá¬ážáá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá $PSDefaultParameterValues
, áááºáá¯ááºááá¯ááºááẠ"Disabled"
á¡áááá¹áá«ááºááá¯á· $true
. áá®ážááŒá¬áž hash table ááá±á¬ááºáááºá¡áá»áá¯ážáá»á±ážáá°ážááŸá¬ disable áá¯ááºááá¯ááºá
áœááºážááŒá
áºáááºá $WslDefaultParameterValues
á០áá®ážááŒá¬áž $PSDefaultParameterValues
.
á¡ááŒááºážá¡áá¯á¶ááŒá®ážá á®ážááŒááºážá
PowerShell ááẠááá·áºá¡á¬áž command ááᯠá¡áá¯á¶ážááŒá¯á á¡ááŒááºážá¡áá¯á¶ááœá²áá»á¬ážááᯠá
á¬áááºážááœááºážááẠááœáá·áºááŒá¯áááºá Register-ArgumentCompleter
. 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
parameter ááœááº-CommandName
á¡ááœááºRegister-ArgumentCompleter
. - áá»áœááºá¯ááºááá¯á·ááẠbash á á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºááŒááºážá¡ááœáẠá¡áá¯á¶ážááŒá¯ááá·áº ááœááºáááºážáá
áºáá¯á
á®ááᯠáá»áááºááŸááá±ážááẠ(á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºááœááºážááŸá¯ áááºááŸááºáá»ááºáá»á¬ážááᯠáááºááŸááºáááºá bash ááᯠá¡áá¯á¶ážááŒá¯áááº
$F
, á¡ááá¯áá±á¬ááºcomplete -F <FUNCTION>
). - PowerShell Arguments á¡ááŒá
áºááŒá±á¬ááºážááŒááºážá
$wordToComplete
,$commandAst
О$cursorPosition
áááºááŸááºáá»ááºáá»á¬ážá¡á bash á á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºááŒááºážáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá áá»áŸá±á¬áºááá·áºáá¬ážááá·áºáá¯á¶á á¶ááá¯á·áááá¯ááááºáá¯ááºááá¯ááºáá±á¬ á¡ááá¯á¡áá»á±á¬áẠááŒá®ážááŒá±á¬ááºááŸá¯ bashá - áá»áœááºá¯ááºááá¯á·áá¶ááá¯á· ááœáŸá²ááŒá±á¬ááºážááẠá¡áááá·áºáá±ážá
á¬ááŒá±á¬ááºážááᯠáá±ážááœá²á·áá¬ážáááºá
wsl.exe
áááºáááºážáá»ááºááᯠááŸááºáááºá áœá¬ á áá áºááá·áºááœááºážááŒá±á¬ááºáž áá±áá»á¬á á±ááá·áºá ááá·áºáá»á±á¬áºáá±á¬ á¡ááá¯á¡áá»á±á¬áẠááŒáá·áºááœááºážááá·áº áá¯ááºáá±á¬ááºáá»ááºááᯠáá±á«áºááá¯áᬠááááºáá»á¬ážááᯠááá¯ááºážáá áºáá¯ááŒá®ážáá áºáᯠáááºááŸááºááŒáá·áº áá¯ááºáá±ážáá«áááºá - áá±á¬ááºáá±á¬á· áá»áœááºáá±á¬áºáá¯ááºážáááºáááºá
wsl
command line ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠoutput ááᯠline separators áá»á¬ážááŒáá·áº ááá¯ááºážááŒá¬ážááŒá®áž áá áºáá¯á á®á¡ááœáẠgenerate áá¯ááºáá«áááºáCompletionResults
áááºážááá¯á·ááᯠá á®ááœá²ááŒááºážááŸáá·áº ááœá²ááŸá¬ážá áœá¬ á¡áááá¹áá¬ááºáá±á¬ááºáá°ááá·áº áá±áá¬ááœááºáá»á¬ážááŸáá·áº ááœááºážá á¥áºáá»á¬ážáá²á·ááá¯á·áá±á¬ áá¬ááºáá±á¬ááºáá»á¬áž ááœááºááŒá±á¬ááºááŒááºáž
ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·á Linux command shells áá»á¬ážááẠbash áá²á·ááá¯á· á¡ááá¡áá»áá°áá®áá±á¬ á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºá áœááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áááºááŒá áºáááºá á¥ááá¬á¡á¬ážááŒááºá·:
ssh -c <TAB> -J <TAB> -m <TAB> -O <TAB> -o <TAB> -Q <TAB> -w <TAB> -b <TAB>
á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºá áœááºááŸá¯áá áºáá¯á á®ááẠááááºá¡ááŒááºážá¡áá¯á¶á¡ááœáẠáááá»áá±á¬áááºááá¯ážáá»á¬ážááᯠáá±ážáá±á¬ááºáááºá WSL á០áááá¬ážááá·áº hosts áá»á¬ážáá²á·ááá¯á·áá±á¬ ááœá²á·á ááºážááŸá¯áá±áá¬ááá¯áááºááŸá¯ááŒááºážá
<TAB>
parameters áá»á¬ážááŸáááá·áºáááºáááºáááá·áºáááºá <Ctrl + пÑПбел>
áááá¯ááºáá±á¬ááœá±ážáá»ááºá
áá¬á¡á¬ážáá¯á¶ážááá¯ááŒááááá·áºáááºá
ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááœáẠááᯠbash á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºááœááºážááŸá¯ ááŸááá±á¬ááŒá±á¬áá·áºá áááºááẠPowerShell ááœáẠLinux áááºážááŒá±á¬ááºážáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºááŒáá·áºááá¯ááºáá«áááºá
less /etc/<TAB>
ls /usr/share/<TAB>
vim ~/.bash<TAB>
bash á¡ááá¯á¡áá»á±á¬ááºááŒáá·áºá áœááºááŒááºážááẠáááºááá·áºááááºáá»áŸ ááá¯ááºáá±ážááá·áºááá á¹á áá»á¬ážááœááºá PowerShell ááẠá áá áºáá°á Windows áááºážááŒá±á¬ááºážáá»á¬ážááá¯á· ááŒááºááœá¬ážáááºá ááá¯á·ááŒá±á¬áá·áºá áááºááœá±á·ááœááºá áááºááẠáááºááá¯á¶ážááŒááºáá»ááºá¡ááá¯ááºáž áááºážááŒá±á¬ááºážááŸá áºáá¯áá¯á¶ážááᯠáá áºááŒáá¯ááºááẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áá±á¬ááºáá»ááº
PowerShell ááŸáá·áº WSL ááᯠá¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á·ááẠLinux á¡áááá·áºáá»á¬ážááᯠáá°áááºážá¡ááºááºáá»á¬ážá¡ááŒá
ẠWindows ááœáẠáá±á«ááºážá
ááºááá¯ááºáááºá Win32 áááºáá±á¬ááºááŸá¯áá»á¬áž ááá¯á·ááá¯áẠLinux utilities áá»á¬ážááᯠááŸá¬ááœá±ááẠááá¯á·ááá¯áẠLinux shell ááá¯á·ááœá¬ážááŒááºážááŒáá·áº ááá·áºáá¯ááºáááºážá¡ááœá¬ážá¡áá¬ááᯠááŸá±á¬ááºááŸááºááẠáááá¯á¡ááºáá«á áá¯á¶
á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ áááºážááŒá
áºáá¯ááºá¡ááŒáá·áºá¡á
á¯á¶á¡ááŒáẠáááºážááᯠáááºááá¯ááºáááºážá¡ááœá¬ážá¡áá¬ááœáẠááá·áºááœááºážááŒááºážá¡ááœáẠáá±á¬ááºáááºáááºážááœáŸááºáá»ááºáá»á¬ážááᯠáááŸáááá¯ááºáá«áááºá
ááẠLinux commands ááœá±á á¡áá¯á¶ážá¡áááºáá¯á¶ážáá²? Windows ááŸá¬ á¡áá¯ááºáá¯ááºáá²á·á¡áá« áááŒá¬ážáá¯á¶á¡áá¬ááœá± áá¬ááœá± ááœá²áá±áá²á comment ááŸá¬ááŒá
áºááŒá
Ạáá±ážáá±ážáá«á
source: www.habr.com