PowerShell เจ…เจคเฉ‡ WSL เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจตเจฟเฉฑเจš เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐเจจเจพ

เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจกเจฟเจตเฉˆเจฒเจชเจฐเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจ†เจฎ เจธเจตเจพเจฒ: โ€œเจ…เจœเฉ‡ เจตเฉ€ เจ•เฉ‹เจˆ เจ•เจฟเจ‰เจ‚ เจจเจนเฉ€เจ‚ เจนเฉˆ <ะ’ะกะขะะ’ะฌะขะ• ะขะฃะข ะ›ะฎะ‘ะ˜ะœะฃะฎ ะšะžะœะะะ”ะฃ LINUX>?. เจญเจพเจตเฉ‡เจ‚ เจ‡เจน เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจธเจตเจพเจˆเจช เจนเฉ‹เจตเฉ‡ less เจœเจพเจ‚ เจœเจพเจฃเฉ‡-เจชเจ›เจพเจฃเฉ‡ เจธเจพเจงเจจ grep เจœ sed, เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจ†เจชเจฃเฉ‡ เจฐเฉ‹เจœเจผเจพเจจเจพ เจฆเฉ‡ เจ•เฉฐเจฎ เจตเจฟเฉฑเจš เจ‡เจนเจจเจพเจ‚ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจคเฉฑเจ• เจ†เจธเจพเจจ เจชเจนเฉเฉฐเจš เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค

เจฒเฉ€เจจเจ•เจธ (WSL) เจฒเจˆ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจธเจฌเจธเจฟเจธเจŸเจฎ เจจเฉ‡ เจ‡เจธ เจธเจฌเฉฐเจง เจตเจฟเจš เจ‡เจ• เจตเฉฑเจกเจพ เจ•เจฆเจฎ เจ…เฉฑเจ—เฉ‡ เจตเจงเจพเจ‡เจ† เจนเฉˆเฅค เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจคเฉ‹เจ‚ เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเฉŒเจ•เจธเฉ€ เจฆเฉเจ†เจฐเจพ เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ wsl.exe (เจ‰เจฆเจพ.) wsl ls). เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ‡เจน เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจธเฉเจงเจพเจฐ เจนเฉˆ, เจ‡เจน เจตเจฟเจ•เจฒเจช เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจจเฉเจ•เจธเจพเจจเจพเจ‚ เจคเฉ‹เจ‚ เจชเฉ€เฉœเจค เจนเฉˆเฅค

  • เจธเจฐเจต เจตเจฟเจ†เจชเจ• เจœเฉ‹เฉœ wsl เจฅเจ•เจพเจตเจŸ เจ…เจคเฉ‡ เจ—เฉˆเจฐ เจ•เฉเจฆเจฐเจคเฉ€.
  • เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจชเจพเจฅ เจนเจฎเฉ‡เจธเจผเจพ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฌเฉˆเจ•เจธเจฒเฉˆเจธเจผเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเจญเจพเจœเจ•เจพเจ‚ เจฆเฉ€ เจฌเจœเจพเจ เจฌเจšเจฃ เจตเจพเจฒเฉ‡ เจ…เฉฑเจ–เจฐเจพเจ‚ เจตเจœเฉ‹เจ‚ เจธเจฎเจเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค
  • เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฎเจพเจฐเจ—เจพเจ‚ เจฆเจพ WSL เจตเจฟเฉฑเจš เจ…เจจเฉเจธเจพเจฐเฉ€ เจฎเจพเจŠเจ‚เจŸ เจชเฉเจ†เจ‡เฉฐเจŸ เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค
  • เจ‰เจชเจจเจพเจฎเจพเจ‚ เจ…เจคเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจตเจพเจฒเฉ‡ WSL เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจกเจฟเจซเฉŒเจฒเจŸ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจฆเจพ เจธเจจเจฎเจพเจจ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค
  • เจฒเฉ€เจจเจ•เจธ เจฎเจพเจฐเจ— เจธเฉฐเจชเฉ‚เจฐเจจเจคเจพ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆเฅค
  • เจ•เจฎเจพเจ‚เจก เจธเฉฐเจชเฉ‚เจฐเจจเจคเจพ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆเฅค
  • เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจชเฉ‚เจฐเจพ เจ•เจฐเจจเจพ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจฆเฉ‚เจœเฉ‡ เจฆเจฐเจœเฉ‡ เจฆเฉ‡ เจจเจพเจ—เจฐเจฟเจ•เจพเจ‚ เจตเจพเจ‚เจ— เจธเจฎเจเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ-เจ…เจคเฉ‡ เจฎเฉ‚เจฒ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเจพเจฒเฉ‹เจ‚ เจตเจฐเจคเจฃเจพ เจตเจงเฉ‡เจฐเฉ‡ เจฎเฉเจธเจผเจ•เจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจ‰เจจเฉเจนเจพเจ‚ เจฆเฉ‡ เจ…เจงเจฟเจ•เจพเจฐเจพเจ‚ เจฆเฉ€ เจฌเจฐเจพเจฌเจฐเฉ€ เจ•เจฐเจจ เจฒเจˆ, เจธเฉ‚เจšเฉ€เจฌเฉฑเจง เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ.

PowerShell เจซเฉฐเจ•เจธเจผเจจ เจฐเฉˆเจชเจฐ

PowerShell เจซเฉฐเจ•เจธเจผเจจ เจฐเฉˆเจชเจฐเจธ เจจเจพเจฒ, เจ…เจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจธเฉฐเจชเฉ‚เจฐเจจเจคเจพ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ…เจ—เฉ‡เจคเจฐเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ wsl, เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฎเจพเจฐเจ—เจพเจ‚ เจจเฉ‚เฉฐ WSL เจฎเจพเจฐเจ—เจพเจ‚ เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เจฐเจจเจพเฅค เจธเจผเฉˆเฉฑเจฒเจพเจ‚ เจฒเจˆ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจฒเฉ‹เฉœเจพเจ‚:

  • เจนเจฐเฉ‡เจ• เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจก เจฒเจˆ เจ‡เฉฑเจ•เฉ‹ เจจเจพเจฎ เจจเจพเจฒ เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจฐเฉˆเจชเจฐ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค
  • เจธเจผเฉˆเฉฑเจฒ เจจเฉ‚เฉฐ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจชเจพเจธ เจ•เฉ€เจคเฉ‡ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฎเจพเจฐเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจชเจ›เจพเจฃเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ 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 (เจชเจนเจฟเจฒเจพเจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจ‰เจชเจจเจพเจฎ เจจเฉ‚เฉฐ เจนเจŸเจพ เจ•เฉ‡ เจœเฉ‹ เจซเฉฐเจ•เจธเจผเจจ เจจเจพเจฒ เจŸเจ•เจฐเจพเจ… เจธเจ•เจฆเจพ เจนเฉˆ)เฅค

เจซเฉฐเจ•เจธเจผเจจ เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ 'เจคเฉ‡ เจฆเฉเจนเจฐเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฎเจพเจฐเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจฆเจพ เจนเฉˆ 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

เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเจพ เจฎเฉ‚เจฒ เจธเฉˆเฉฑเจŸ เจ‡เฉฑเจฅเฉ‡ เจฆเจฟเจ–เจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ, เจชเจฐ เจคเฉเจธเฉ€เจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจก เจฒเจˆ เจ‡เจธเจจเฉ‚เฉฐ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเจ•เฉ‡ เจ‡เฉฑเจ• เจธเจผเฉˆเฉฑเจฒ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจฆเฉ‡ เจนเฉ‹ เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒ PowerShell, เจ‡เจน เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจนเจฐ PowerShell เจธเฉˆเจธเจผเจจ เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง เจนเฉ‹เจฃเจ—เฉ€เจ†เจ‚, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฎเฉ‚เจฒ เจ•เจฎเจพเจ‚เจกเจพเจ‚!

เจชเฉ‚เจฐเจต-เจจเจฟเจฐเจงเจพเจฐเจค เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚

เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš, เจฒเฉŒเจ—เจฟเจจ เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจ‰เจชเจจเจพเจฎเจพเจ‚ เจ…เจคเฉ‡/เจœเจพเจ‚ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจเจพ เจ†เจฎ เจ—เฉฑเจฒ เจนเฉˆ, เจ…เจ•เจธเจฐ เจตเจฐเจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฒเจˆ เจกเจฟเจซเฉŒเจฒเจŸ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจเจพ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, alias ls=ls -AFh เจœ export LESS=-i). เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจ‡เฉฐเจŸเจฐเจเจ•เจŸเจฟเจต เจธเจผเฉˆเฉฑเจฒ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเฉŒเจ•เจธเฉ€ เจ•เจฐเจจ เจฆเฉ‡ เจจเฉเจ•เจธเจพเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเฉˆ wsl.exe - เจ•เจฟ เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒ เจฒเฉ‹เจก เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ, เจ‡เจธ เจฒเจˆ เจ‡เจน เจตเจฟเจ•เจฒเจช เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง เจจเจนเฉ€เจ‚ เจนเจจ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ ls WSL เจตเจฟเฉฑเจš เจ…เจคเฉ‡ wsl ls เจ‰เฉฑเจชเจฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ‰เจชเจจเจพเจฎ เจจเจพเจฒ เจตเฉฑเจ–เจฐเจพ เจตเจฟเจตเจนเจพเจฐ เจ•เจฐเฉ‡เจ—เจพ)เฅค

PowerShell เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ $PSDefaultParameterValues, เจกเจฟเจซเฉŒเจฒเจŸ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฎเจฟเจ†เจฐเฉ€ เจตเจฟเจงเฉ€, เจชเจฐ เจธเจฟเจฐเจซเจผ cmdlets เจ…เจคเฉ‡ เจ‰เฉฑเจจเจค เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฒเจˆเฅค เจฌเฉ‡เจธเจผเฉฑเจ•, เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจธเจผเฉˆเฉฑเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจ‰เฉฑเจจเจค เจซเฉฐเจ•เจธเจผเจจ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจชเจฐ เจ‡เจน เจฌเฉ‡เจฒเฉ‹เฉœเฉ€เจ†เจ‚ เจชเฉ‡เจšเฉ€เจฆเจ—เฉ€เจ†เจ‚ เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ (เจ‰เจฆเจพเจนเจฐเจฃ เจฒเจˆ, เจชเจพเจตเจฐเจธเจผเฉ‡เจฒ เจ…เฉฐเจธเจผเจ• เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจจเจพเจฎเจพเจ‚ เจจเจพเจฒ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจนเฉˆ (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, -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. Bash เจธเจผเจ•เจคเฉ€เจธเจผเจพเจฒเฉ€ เจนเฉˆ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเฉ‡เจฌเจฒ เจ†เจŸเฉ‹-เจ•เฉฐเจชเจฒเฉ‡เจธเจผเจจ เจŸเฉ‚เจฒ. WSL เจคเฉเจนเจพเจจเฉ‚เฉฐ PowerShell เจคเฉ‹เจ‚ bash เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ PowerShell เจซเฉฐเจ•เจธเจผเจจ เจฐเฉˆเจชเจฐเจพเจ‚ เจฒเจˆ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจธเฉฐเจชเฉ‚เจฐเจจเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจธเฉฐเจชเฉ‚เจฐเจจเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจœเจจเจฐเฉ‡เจŸ เจ•เจฐเจจ เจฒเจˆ เจฌเฉˆเจธเจผ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ เจฌเฉˆเจธเจผ เจตเจพเจ‚เจ— เจนเฉ€ เจธเจŸเฉ€เจ•เจคเจพ เจจเจพเจฒ เจชเฉ‚เจฐเฉ€ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจธเฉฐเจชเฉ‚เจฐเจจเจคเจพ เจฎเจฟเจฒเจฆเฉ€ เจนเฉˆ!

# 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, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ›เจพเจ‚เจŸเจฃเจพ เจ…เจคเฉ‡ เจ…เฉฑเจ–เจฐเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจšเจฃเจพ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเจชเฉ‡เจธ เจ…เจคเฉ‡ เจฌเจฐเฉˆเจ•เจŸเจธ เจœเฉ‹ เจ•เจฟ เจจเจนเฉ€เจ‚ เจคเจพเจ‚ เจ—เจฒเจค เจตเจฟเจ†เจ–เจฟเจ† เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจธเจพเจกเฉ‡ เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจก เจธเจผเฉˆเฉฑเจฒ 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 เจธเจฟเจธเจŸเจฎ เจกเจฟเจซเฉŒเจฒเจŸ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจฎเจพเจฐเจ—เจพเจ‚ 'เจคเฉ‡ เจตเจพเจชเจธ เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš, เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจ†เจชเจฃเฉ‡ เจตเจฟเจตเฉ‡เจ• 'เจคเฉ‡ เจฆเฉ‹เจตเฉ‡เจ‚ เจฎเจพเจฐเจ—เจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹.

เจธเจฟเฉฑเจŸเจพ

PowerShell เจ…เจคเฉ‡ WSL เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ…เจธเฉ€เจ‚ เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจตเจฟเฉฑเจš เจฎเฉ‚เจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค Win32 เจฌเจฟเจฒเจกเจธ เจœเจพเจ‚ เจฒเฉ€เจจเจ•เจธ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐเจจ เจœเจพเจ‚ เจฒเฉ€เจจเจ•เจธ เจธเจผเฉˆเฉฑเจฒ 'เจคเฉ‡ เจœเจพ เจ•เฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจตเจฐเจ•เจซเจฒเฉ‹ เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฃ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจฌเจธ WSL เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเฉ‹, เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเฉ‹ PowerShell เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒ ะธ เจ‰เจนเจจเจพเจ‚ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฌเจฃเจพเจ“ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ†เจฏเจพเจค เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹! เจฒเฉ€เจจเจ•เจธ เจ…เจคเฉ‡ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจ•เจฎเจพเจ‚เจก เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจ…เจคเฉ‡ เจซเจพเจˆเจฒ เจชเจพเจฅเจพเจ‚ เจฒเจˆ เจฐเจฟเจš เจ†เจŸเฉ‹เจ•เฉฐเจชเจฒเฉ‡เจธเจผเจจ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจนเฉˆ เจœเฉ‹ เจ…เฉฑเจœ เจฆเฉ‡ เจฎเฉ‚เจฒ เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉ€ เจ‰เจชเจฒเจฌเจง เจจเจนเฉ€เจ‚ เจนเฉˆเฅค

เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจชเฉ‚เจฐเจพ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก, เจจเจพเจฒ เจนเฉ€ เจ‡เจธเจจเฉ‚เฉฐ เจคเฉเจนเจพเจกเฉ‡ เจตเจฐเจ•เจซเจฒเฉ‹ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเจจ เจฒเจˆ เจตเจพเจงเฉ‚ เจฆเจฟเจธเจผเจพ-เจจเจฟเจฐเจฆเฉ‡เจธเจผ เจ‰เจชเจฒเจฌเจง เจนเจจ เจ‡เฉฑเจฅเฉ‡.

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจฒเฉ€เจจเจ•เจธ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจธเจญ เจคเฉ‹เจ‚ เจฒเจพเจญเจฆเจพเจ‡เจ• เจฒเฉฑเจ—เจฆเฉ€เจ†เจ‚ เจนเจจ? เจตเจฟเฉฐเจกเฉ‹เจœเจผ เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจนเฉ‹เจฐ เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจ†เจฎ เจšเฉ€เจœเจผเจพเจ‚ เจ—เฉเฉฐเจฎ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ? เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจฒเจฟเจ–เฉ‹ เจœเจพเจ‚ GitHub 'เจคเฉ‡!

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹