Mubvunzo wakajairika kubva kuvagadziri veWindows: "Sei kuchiripo <ВСТАВЬТЕ ТУТ ЛЮБИМУЮ КОМАНДУ LINUX>
?. Kana iri swipe ine simba less
kana maturusi anozivikanwa grep
kana sed
, Vagadziri veWindows vanoda kuwana nyore kumirairo iyi mubasa ravo rezuva nezuva.
wsl.exe
(eg. wsl ls
) Kunyangwe uku kuri kuvandudzwa kwakakosha, sarudzo iyi inotambura nehuwandu hwekuipa.
- Ubiquitous kuwedzera
wsl
zvinonetesa uye zvisiri zvechisikigo. - Nzira dzeWindows mukupokana hadzishande nguva dzose nekuti backslashs inodudzirwa semavara ekupukunyuka pane kuparadzanisa dhairekitori.
- Nzira dzeWindows mukupokana hadzishandurwe kunzvimbo inoenderana yekukwira muWSL.
- Default marongero haana kuremekedzwa muWSL profiles ane aliases uye nharaunda zvinosiyana.
- Kupedzwa kweLinux nzira hakutsigirwe.
- Kupedzisa kwekuraira hakuna kutsigirwa.
- Kupedza kukakavara hakutsigirwe.
Nekuda kweizvozvo, mirairo yeLinux inobatwa sevagari vekirasi yechipiri pasi peWindows-uye yakaoma kushandisa kupfuura mirairo yemuno. Kuti vaenzanise kodzero dzavo, zvinodikanwa kugadzirisa matambudziko akanyorwa.
PowerShell basa wrappers
NePowerShell basa wrappers, tinogona kuwedzera kupedzisa kwekuraira uye kubvisa kudiwa kwe prefixes wsl
, kushandura nzira dzeWindows kuita nzira dzeWSL. Zvinodiwa zvekutanga zvemakobho:
- Kune yega yega Linux murairo panofanira kunge paine basa rimwechete wrapper rine zita rimwechete.
- Iyo goko rinofanirwa kuziva nzira dzeWindows dzakapfuura senharo uye nekudzishandura kuWSL nzira.
- Goko rinofanira kufona
wsl
neiyo yakakodzera Linux yekuraira kune chero pombi yekuisa uye kupfuudza chero mutsara wemirairo nharo dzakapfuudzwa kubasa.
Sezvo iyi pateni ichigona kushandiswa kune chero kuraira, isu tinokwanisa kubvisa tsananguro yeaya wrappers uye nekuaburitsa zvine simba kubva pane rondedzero yemirairo yekupinza.
# 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 ' ')
}
}
"@
}
Rwendo rwe $command
inotsanangura mirairo yekupinza. Isu tinobva tagadzira basa rekuputira kune mumwe nemumwe wavo achishandisa rairo Invoke-Expression
(nekutanga kubvisa chero aliases angapesana nebasa).
Iro basa rinodzokorora pamusoro pekuraira mutsara nharo, inosarudza nzira dzeWindows uchishandisa mirairo Split-Path
и Test-Path
uye wozoshandura nzira idzi kuenda kuWSL nzira. Isu tinomhanya nzira kuburikidza nebasa remubatsiri Format-WslArgument
, izvo zvatichatsanangura gare gare. Inonzvenga mavara akakosha senge nzvimbo nemaparenthesi ayo angazodudzirwa zvisizvo.
Pakupedzisira, tinotaura wsl
pombi yekupinda uye chero mitsetse yemirairo nharo.
Nezviputi izvi unogona kudaidza yako yaunofarira Linux mirairo nenzira yakasarudzika pasina kuwedzera prefix wsl
uye pasina kunetseka kuti nzira dzinoshandurwa sei:
man bash
less -i $profile.CurrentUserAllHosts
ls -Al C:Windows | less
grep -Ein error *.log
tail -f *.log
Iyo yekutanga seti yemirairo inoratidzwa pano, asi iwe unogona kugadzira goko kune chero Linux kuraira nekungoiwedzera kune iyo rondedzero. Kana iwe ukawedzera iyi kodhi kune yako
Default Settings
MuLinux, zvakajairika kutsanangura aliases uye/kana nharaunda zvinosiyana mumaprofile ekupinda, kuseta zvimiro zvemirau yemirairo inowanzoshandiswa (semuenzaniso, alias ls=ls -AFh
kana export LESS=-i
) Imwe yezvakaipira kuita proxy kuburikidza negoko risiri-interactive wsl.exe
- kuti maprofile haana kurodha, saka sarudzo idzi hadziwanikwe nekukasira (kureva. ls
muWSL uye wsl ls
ichaita zvakasiyana nemazita atsanangurwa pamusoro).
PowerShell inopa -a
inopindirana ne -ArgumentList
), iyo inopesana nemirairo yeLinux inotora mazita asina kukwana senharo), uye syntax yekutsanangudza hunhu husingazove hwakanyanya kufanira (default nharo dzinoda zita reparameter mukiyi, kwete zita rekuraira chete) .
Nekudaro, nekugadziridzwa kudiki kumabhomba edu, tinogona kushandisa modhi yakafanana ne $PSDefaultParameterValues
, uye gonesa default sarudzo dzeLinux mirairo!
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 ' ')
}
}
Kupfuura $WslDefaultParameterValues
kumutsara wekuraira, tinotumira parameters kuburikidza wsl.exe
. Zvinotevera zvinoratidza maitiro ekuwedzera mirairo kune yako PowerShell mbiri kuti ugadzirise default marongero. Iye zvino tinogona kuzviita!
$WslDefaultParameterValues["grep"] = "-E"
$WslDefaultParameterValues["less"] = "-i"
$WslDefaultParameterValues["ls"] = "-AFh --group-directories-first"
Sezvo ma parameters akateedzerwa mushure $PSDefaultParameterValues
, Unogona "Disabled"
muchirevo $true
. Imwe bhenefiti yeyakasiyana hash tafura kugona kudzima $WslDefaultParameterValues
zvakasiyana kubva $PSDefaultParameterValues
.
Kupedzwa kwenharo
PowerShell inobvumidza iwe kunyoresa nharo trailer uchishandisa iwo murairo Register-ArgumentCompleter
. Bash ine simba
# 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]
}
}
Iyo kodhi yakati dende pasina kunzwisisa mamwe emabasa emukati bash, asi chaizvo zvatinoita ndeizvi:
- Kunyoresa gakava rinopedzisa kune ese edu basa wrappers nekupfuura runyorwa
$commands
mune parameter-CommandName
nokutiRegister-ArgumentCompleter
. - Isu tinomepu murairo wega wega kune shell basa iro bash rinoshandisa kugadzirisa auto (kutsanangura autocompletion yakatarwa, bash inoshandisa
$F
, chidimbu checomplete -F <FUNCTION>
). - Kushandura PowerShell Nharo
$wordToComplete
,$commandAst
и$cursorPosition
mune iyo fomati inotarisirwa nebash's autocompletion mabasa zvinoenderana nezvakatsanangurwaprogrammable auto-completion bash. - Isu tinonyora mutsara wekuraira wekuendesa kune
wsl.exe
, iyo inovimbisa kuti zvakatipoteredza zvakamisikidzwa zvakanaka, inodana yakakodzera auto-kupedzisa basa, uye inoburitsa mhedzisiro mumutsara-ne-mutsara fashoni. - Tinobva tafona
wsl
nemutsara wekuraira, tinoparadzanisa zvinobuda nemitsara yekuparadzanisa uye kugadzira kune yega yegaCompletionResults
, kuaronga uye mabhii ari kubuda akadai sezvimbo nezvibodzwa zvingasazodudzirwa.
Nekuda kweizvozvo, yedu Linux yekuraira magomba achashandisa chaiwo autocompletion yakafanana nebash! Semuyenzaniso:
ssh -c <TAB> -J <TAB> -m <TAB> -O <TAB> -o <TAB> -Q <TAB> -w <TAB> -b <TAB>
Yega yega kupedzisa kunopa kukosha kwakanangana kune yakapfuura gakava, kuverenga yekumisikidza data senge anozivikanwa mauto kubva kuWSL!
<TAB>
ichatenderera kuburikidza nemiganhu. <Ctrl + пробел>
icharatidza sarudzo dzese dziripo.
Uyezve, sezvo isu tava nebash autocompletion, unogona kuzadzisa nzira dzeLinux zvakananga muPowerShell!
less /etc/<TAB>
ls /usr/share/<TAB>
vim ~/.bash<TAB>
Muzviitiko apo bash autocompletion isingaburitse chero mhedzisiro, PowerShell inodzokera kune iyo default system Windows nzira. Saka, mukuita, iwe unogona kushandisa panguva imwe chete nzira mbiri pakufunga kwako.
mhedziso
Tichishandisa PowerShell neWSL, tinogona kubatanidza mirairo yeLinux muWindows semashandisirwo emuno. Iko hakuna chikonzero chekutsvaga Win32 inovaka kana Linux zvishandiso kana kukanganisa mafambiro ako nekuenda kuLinux shell. Just
Iyo yakazara sosi kodhi yakatsanangurwa pamusoro, pamwe nemamwe nhungamiro yekuibatanidza mukufamba kwako kwekushanda, iripo
Ndeipi mirairo yeLinux yaunowana yakanyanya kubatsira? Ndezvipi zvimwe zvinhu zvakajairika zvisipo kana uchishanda muWindows? Nyora mumashoko kana
Source: www.habr.com