แแแแฝแแแแแแแถแแธแขแแแแขแแทแแแแแแแแธแแแผแ "แ แแแปแขแแแธแแถแแแถแแ
แแแแทแแแถแ <ะะกะขะะะฌะขะ ะขะฃะข ะะฎะะะะฃะฎ ะะะะะะะฃ LINUX>
? แแถแแพแแถแแถแแถแแขแผแแแแแถแแฅแแแแทแแ less
แฌแงแแแแแแแแแแแแถแแแแแแถแแ grep
แฌ sed
, แขแแแแขแแทแแแแแแ Windows แ
แแแแถแแแถแแแถแแแแแฝแแแแแถแแแแแแแแถแแถแแแแแแแ
แแแแปแแแถแแแถแแแแแ
แถแแแแแแแแแแแฝแแแแ
wsl.exe
(แงแ wsl ls
) แแแแแธแแถแแแแแบแแถแแถแแแแแแแขแแฝแแฑแแแแแแแแแแถแแแแแแแแแแแแพแแแแแแแฝแแแแแผแแแปแแแทแแแแแทแแฝแแ
แแแฝแแ
- แแถแแแแแแแแแแแแแแธแแแแแแ
wsl
แแปแแแแแถแแแแทแแแปแแแธแแแแแแถแแทแ - แแแแผแแแแแแแธแแแผแแ แแแแปแแขแถแแปแแแแแแแทแแแแแแแแแแพแแแถแแแแแธแแแแแแแแแแถแแแแแแแแแแแผแแแถแแแแแแแถแแแถแแถแแฝแขแแแแแแแแแแ แแถแแถแแแถแแแแแแแแแ
- แแแแผแแแแแแแธแแแผแแ แแแแปแแขแถแแปแแแแแแแทแแแแแผแแแถแแแแแแแแแ แแถแ แแแปแ แแแแแแแแแแแผแแแแแถแแ แแแแปแ WSL แแแ
- แแถแแแแแแแแแแถแแแพแแแทแแแแแผแแแถแแแแแแแ แแแแปแแแแแแแ WSL แแแแแถแแแแแแแแแแแแแแแถแ แแทแแขแแแแแแทแแแแถแแแแ
- แแถแแแแแ แแแแแแผแแแธแแปแ แแทแแแแแผแแแถแแแถแแแแแแแ
- แแถแแแแแแแแถแแแแแแแแถแแทแแแแแผแแแถแแแถแแแแแแแ
- แแถแแแแแ แแแขแถแแปแแแแแแแทแแแแแผแแแถแแแถแแแแแแแ
แแถแแแแแแ แแถแแแแแแแแถแแธแแปแ แแแแผแแแถแแ แถแแแแปแแแผแ แแถแแแแแแแแแแถแแแแธแแธแแแ แแแแแแแธแแแผ แ แพแแแทแแถแแแแแพแแถแแแถแแแแแแแแถแแพแแ แแพแแแแธแฑแแแแแแพแแแแถแแผแแแทแแแแทแแแแแแฝแแแ แแถแ แถแแแถแ แแแแแปแแแถแแแแแแแแถแแแแแ แถแแแแแถแแแถแแแแแแธแ
แงแแแแแแแปแแแปแแแถแ PowerShell
แแถแแฝแแแแแแแทแแธแแปแแแปแแแถแ 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
. แขแแแแแแแแแแแแแแแแแแแแแถแแถแ hash แแถแ
แแแแแกแแแแบแแแแแแแถแแแแแปแแแถแแแทแ $WslDefaultParameterValues
แแแแกแแแแธแแแแถแ $PSDefaultParameterValues
.
แแถแแแแแ แแแขแถแแปแแแแแ
PowerShell แขแแปแแแแถแแฑแแแขแแแแ
แปแแแแแแแแปแแแแแธแแแแแแแแพแแถแแแแแแแแถ 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
แแ แแแแปแแแแถแแแถแแแแแแ-CommandName
แแแแแถแแRegister-ArgumentCompleter
. - แแพแแแผแแแแแแธแแถแแแแแแแแถแแธแแฝแแแแ
แแนแแแปแแแถแแแแแแแ bash แแแแพแแแแแถแแแแถแแแแแแแแแแแแแแแแแแแแแแท (แแพแแแแธแแแแแแแแแแแแแ
แแ
แแแแแแแแแถแแแแแแแแแแแแแแแแแแแแแแท bash แแแแพ
$F
, แขแแแแแแถแแแแแแแถแแcomplete -F <FUNCTION>
). - แแถแแแแแแแแแขแถแแปแแแแแ PowerShell
$wordToComplete
,$commandAst
ะธ$cursorPosition
แ แผแแแ แแแแปแแแแแแแแแแแแแแนแแแปแแแแแแปแแแถแแแแแแแแแแแแแแแแแแแทแแแแ 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>
แแแแปแแแแแธแแแแแถแแแแแแแแแแแแแแแแแแแแแแท bash แแทแแแแแแพแแแแแแแแแถแแฝแ PowerShell แแแแกแแแแ แแแแผแแแแแถแแแพแแแแแแแแแแแแแ Windows แ แแผแ แแแแแแแแปแแแถแแขแแปแแแแ แขแแแแขแถแ แแแแพแแแแผแแแถแแแแธแแแแแปแแแแแแแแถแแแแแถแแถแแแถแแแแแแ แ แทแแแแแแแแขแแแแ
แแแ แแแแธแแแแแทแแแแถแ
แแแแแแแพ PowerShell แแทแ WSL แแพแแขแถแ
แแแแ
แผแแแถแแแแแแแแถแแธแแปแ
แแ
แแแแปแ Windows แแถแแแแแแทแแธแแพแแ แแทแแ
แถแแแถแ
แแแแแแแแ Win32 builds แฌ Linux Utilities แฌแแแแถแแแแแพแแแถแแแถแแแถแแแแแแขแแแแแแแ
แผแแแ
แแถแแ Linux Shell แแแแแแ แแแแถแแแแ
แแผแแแแแแแแแแแแแแแแแถแแแทแแแแแถแแถแแแพ แแแแผแ
แแถแแแแแถแแแแแแแถแแแแแแแแแแแแถแแแแถแแแแแ
แผแแแถแแ
แแแแปแแแแ แผแแแถแแแถแแแแแแขแแแแแถแ
แแพแแถแแแแแแแแถแแธแแปแ
แแฝแแแถแแแแขแแแแแแแแถแแถแแแแแแแแแแแแแปแ? แแพแแถแแขแแแธแแผแแ
แแแแแแแแแแแแแถแแแแ
แแแแแแแพแแถแแแ
แแแแปแ Windows? แแแแแแแ
แแแแปแแแแทแแแแแแฌ
แแแแแ: www.habr.com