Kubatanidza Linux mirairo muWindows uchishandisa PowerShell uye WSL

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.

Windows Subsystem yeLinux (WSL) yaita danho rakakura kwazvo panyaya iyi. Iyo inokutendera kuti ufonere Linux mirairo kubva kuWindows nekuita proxy kuburikidza 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-Pathuye 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 profile PowerShell, iyi mirairo ichave iripo kwauri mune yega yega PowerShell chikamu, senge mirairo yemuno!

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 $PSDefaultParameterValues, yakajairwa michina yekutsanangura default parameters, asi chete cmdlets uye advanced mabasa. Ehe, isu tinokwanisa kuita mabasa epamberi kubva mumabhomba edu, asi izvi zvinounza zvisingakoshese matambudziko (semuenzaniso, PowerShell inobatanidza chikamu chezita reparamita (semuenzaniso, -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 zviri nyore kuvadzima kwenguva nekuisa kiyi "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 programmable auto-kupedzisa maturusi. WSL inokutendera kuti ufonere bash kubva kuPowerShell. Kana tikakwanisa kunyoresa kupedzwa kwekupokana kweyedu PowerShell basa rekuputira uye kufonera bash kuti ibudise kupedzisa, isu tinowana yakazara nharo kupedzwa neiyo chaiyo bash pachayo!

# 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 nokuti Register-ArgumentCompleter.
  • Isu tinomepu murairo wega wega kune shell basa iro bash rinoshandisa kugadzirisa auto (kutsanangura autocompletion yakatarwa, bash inoshandisa $F, chidimbu che complete -F <FUNCTION>).
  • Kushandura PowerShell Nharo $wordToComplete, $commandAst и $cursorPosition mune iyo fomati inotarisirwa nebash's autocompletion mabasa zvinoenderana nezvakatsanangurwa programmable 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 yega CompletionResults, 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 isa WSL, gadzirisa PowerShell mbiri и nyora mirairo yaunoda kuunza kunze! Yakapfuma autocompletion yeLinux uye Windows yekuraira ma paramita uye mafaera nzira ndeye mashandiro ayo asingatombowanikwe mune yekuzvarwa Windows mirairo nhasi.

Iyo yakazara sosi kodhi yakatsanangurwa pamusoro, pamwe nemamwe nhungamiro yekuibatanidza mukufamba kwako kwekushanda, iripo pano.

Ndeipi mirairo yeLinux yaunowana yakanyanya kubatsira? Ndezvipi zvimwe zvinhu zvakajairika zvisipo kana uchishanda muWindows? Nyora mumashoko kana paGitHub!

Source: www.habr.com

Voeg