ื ืืืคึผืืฉ ืงืฉืื ืคืื Windows ืืขืืืขืืึธืคึผืขืจืก: "ืคืืจืืืืก ืืื ืขืก ื ืึธื ื ืื <ะะกะขะะะฌะขะ ะขะฃะข ะะฎะะะะฃะฎ ะะะะะะะฃ LINUX>
?. ืฆื ืขืก ืืื ืึท ืฉืืึทืจืง ืืึทืงืืขื ืขื less
ืึธืืขืจ ืืึทืงืึทื ืืข ืืืฉืืจืื grep
ืึธืืขืจ sed
, Windows ืืขืืืขืืึธืคึผืขืจืก ืืืืื ืืจืื ื ืึทืงืกืขืก ืฆื ืื ืงืึทืืึทื ืื ืืื ืืืืขืจ ืืขืืืขื ืึทืจืืขื.
wsl.exe
(ืืืฉื wsl ls
). ืืึธืืฉ ืืึธืก ืืื ืึท ืืึทืืืืืืง ืคึฟืึทืจืืขืกืขืจืื ื, ืืขื ืึธืคึผืฆืืข ืกืึทืคืขืจื ืคืื ืึท ื ืืืขืจ ืคืื ืืืกืึทืืืืึทื ืืืืืฉืื.
- ืืืืขืืื ืืขืจืฆื
wsl
ืืืืืึทืก ืืื ืืื ืึทืืืจืืขื. - Windows ืคึผืึทืืก ืืื ืึทืจืืืืขื ืื ืืึธื ื ืื ืฉืืขื ืืืง ืึทืจืืขื ืืืืึทื ืืึทืงืืึทืฉืื ืืขื ืขื ืื ืืขืจืคึผืจืึทืืึทื ืืื ืึทื ืืืืืคื ืืืชืืืช ืืื ืืื ืืืขืืืืืึทืืขืจ ืกืขืคึผืขืจืืืืขืจื.
- Windows ืคึผืึทืืก ืืื ืึทืจืืืืขื ืื ืืขื ืขื ื ืืฉื ืืืืขืจืืขืืขืฆื ืฆื ืื ืงืึธืจืึทืกืคึผืึทื ืืื ื ืืึทืจื ืคืื ื ืืื WSL.
- ืคืขืืืงืืึทื ืกืขืืืื ืืก ืืขื ืขื ื ืืฉื ืจืขืกืคึผืขืงืืขื ืืื WSL ืคึผืจืึธืืคืืืื ืืื ืืืืืึทืกืื ืืื ืกืืืืืืข ืืืขืจืืึทืืึทืื.
- ืงืึทืืคึผืืืฉืึทื ืคืื ืืื ืืงืก ืืจื ืืื ื ืืฉื ืืขืฉืืืฆื.
- ืืึทืคึฟืขืื ืงืึทืืคึผืืืฉืึทื ืืื ื ืืฉื ืืขืฉืืืฆื.
- ืึทืจืืืืขื ื ืงืึทืืคึผืืืฉืึทื ืืื ื ืืฉื ืืขืฉืืืฆื.
ืืื ืึท ืจืขืืืืืึทื, ืืื ืืงืก ืงืึทืืึทื ืื ืืขื ืขื ืืืืื ืืื ืืื ืฆืืืืื ืงืืึทืก ืืืจืืขืจืก ืืื ืืขืจ Windows - ืืื ืืขื ืขื ืืขืจ ืฉืืืขืจ ืฆื ื ืืฆื ืืื ืืขืืืืจื ืงืึทืืึทื ืื. ืฆื ืืงืืืึทืืืื ืืืืขืจ ืจืขืื, ืขืก ืืื ื ืืืืืง ืฆื ืกืึธืืืืข ืื ืืืกืืขื ืคึผืจืึธืืืขืืก.
ืคึผืึธืืืขืจืฉืขืื ืคืื ืงืฆืืข ืจืึทืคึผืขืจื
ืืื PowerShell ืคืื ืงืฆืืข ืจืึทืคึผืขืจื, ืืืจ ืงืขื ืขื ืืืืื ืืึทืคึฟืขืื ืงืึทืืคึผืืืฉืึทื ืืื ืขืืืืื ืืจื ืื ื ืืื ืคึฟืึทืจ ืคึผืจืขืคืืงืก 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
(ืืืจื ืขืจืฉืืขืจ ืจืืืืืืื ื ืงืืื ืืืืืึทืกืื ืืืึธืก ืืืึธืื ืงืึธื ืคืืืงื ืืื ืื ืคึฟืื ืงืฆืืข).
ืื ืคึฟืื ืงืฆืืข ืืืขืจืืืฅ ืืืืขืจ ืืึทืคึฟืขืื ืฉืืจื ืึทืจืืืืขื ืื, ืืืืขืจืืึทื ื Windows ืคึผืึทืืก ื ืืฆื ืงืึทืืึทื ืื 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]
}
}
ืืขืจ ืงืึธื ืืื ืึท ืืืกื ืืขืืืื ืึธื ืคืืจืฉืืื ื ืขืืืขืืข ืคืื โโโโืืึทืฉ ืก ืื ืขืจืืขื ืคืึทื ืืงืฉืึทื ื, ืึธืืขืจ ืืืืกืืงืื ืืืึธืก ืืืจ ืืึธื ืืื ืืึธืก:
- ืจืขืืืฉืืกืืขืจืื ื ืึทื ืึทืจืืืืขื ื ืงืึทืืคึผืืืืขืจ ืคึฟืึทืจ ืึทืืข ืืื ืืืขืจ ืคืื ืงืฆืืข ืจืึทืคึผืขืจื ืืืจื ืคืึธืจื ืึท ืจืฉืืื
$commands
ืืื ืคึผืึทืจืึทืืขืืขืจ-CommandName
ืคืึทืจRegister-ArgumentCompleter
. - ืืืจ ืืึทืคึผืข ืืขืืขืจ ืืึทืคึฟืขื ืฆื ืื ืฉืึธื ืคึฟืื ืงืฆืืข ืืืึธืก Bash ื ืืฆื ืคึฟืึทืจ ืึทืืืึธืงืึธืืคึผืืขืืืึธื (ืฆื ืืขืคืื ืืจื ืึทืืืึธืงืึธืืคึผืืขืืืึธื ืกืคึผืขืกืึทืคืึทืงืืืฉืึทื ื, Bash ื ืืฆื
$F
, ืึทืืจืืืืืืืฉืึทื ืคึฟืึทืจcomplete -F <FUNCTION>
). - ืงืึทื ืืืขืจืืื ื PowerShell ืึทืจืืืืขื ืื
$wordToComplete
,$commandAst
ะธ$cursorPosition
ืืืื ืื ืกืคึผืขืกืึทืคืึทืงืืืฉืึทื ื ืืื ืื ืคึฟืึธืจืืึทื ืืืึธืก ืืื ืืขืจืืื ืืืจื ืื ืึทืืืึธืงืึธืืคึผืืขืืืึธื ืคืึทื ืืงืฉืึทื ื ืคืื Bashืคึผืจืึธืืืจืึทืืึทืืึทื ืึทืืืึธ ืงืึทืืคึผืืืฉืึทื bash. - ืืืจ ืืึทืื ืึท ืืึทืคึฟืขื ืฉืืจื ืฆื ืึทืจืืืขืจืคืืจื ืฆื
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!
less /etc/<TAB>
ls /usr/share/<TAB>
vim ~/.bash<TAB>
ืืื ืงืึทืกืขืก ืืื ืืึทืฉ ืึทืืืึธืงืึธืืคึผืืขืืืึธื ืืื ื ืืฉื ืคึผืจืึธืืืฆืืจื ืงืืื ืจืขืืืืืึทืื, PowerShell ืจืืืืขืจืฅ ืฆื ืื ืกืืกืืขื ืคืขืืืงืืึทื Windows ืคึผืึทืืก. ืืืื, ืืื ืคืืจ, ืืืจ ืงืขื ืขื ืกืืืืึทืืืืื ืืึทืกืื ื ืืฆื ืืืืืข ืคึผืึทืืก ืืืื ืืืื ืืืกืงืจืขืฉืึทื.
ืกืึธืฃ
ื ืืฆื PowerShell ืืื WSL, ืืืจ ืงืขื ืขื ืืืกืฉืืืืขื ืืื ืืงืก ืงืึทืืึทื ืื ืืื Windows ืืื ืืขืืืืจื ืึทืคึผืืึทืงืืืฉืึทื ื. ืขืก ืืื ื ืื ืืึทืจืคึฟื ืฆื ืืืื ืคึฟืึทืจ Win32 ืืืืขื ืึธืืขืจ ืืื ืืงืก ืืืืืืึทืืื ืึธืืขืจ ืืืขืจืจืืึทืกื ืืืื ืืืึธืจืงืคืืึธืื ืืืจื ืืืื ืฆื ืึท ืืื ืืงืก ืฉืึธื. ื ืึธืจ
ืื ืคืื ืืงืืจ ืงืึธื ืืืกืงืจืืืื ืืืืื, ืืื ืืขืืื ื ืืื ื ืึธื ืืืืืืืื ื ืคึฟืึทืจ ืื ืงืึธืจืคึผืขืจืืืืื ื ืขืก ืืื ืืืื ืืืึธืจืงืคืืึธืื, ืืื ืื ืืืฆื
ืืืึธืก ืืื ืืงืก ืงืึทืืึทื ืื ืืึธื ืืืจ ืืขืคึฟืื ืขื ืจืืึฟ ื ืืฆืืง? ืืืึธืก ืื ืืขืจืข ืคึผืจืึธืกื ืืื ืื ืคืขืื ืืืง ืืืขื ืืืจ ืึทืจืืขื ืืื Windows? ืฉืจืืื ืืื ืื ืืึทืืขืจืงืื ืืขื ืึธืืขืจ
ืืงืืจ: www.habr.com