PowerShell āĻāĻŦāĻ‚ WSL āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœā§‡ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻāĻ•ā§€āĻ­ā§‚āĻ¤ āĻ•āĻ°āĻž

āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻĒā§āĻ°āĻļā§āĻ¨: "āĻ•ā§‡āĻ¨ āĻāĻ–āĻ¨āĻ“ āĻ¨ā§‡āĻ‡ <ВСĐĸАВĐŦĐĸЕ ĐĸĐŖĐĸ ЛЮБИМĐŖĐŽ КОМАНДĐŖ LINUX>?āĨ¤ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻ¸ā§‹āĻ¯āĻŧāĻžāĻ‡āĻĒ āĻ•āĻŋāĻ¨āĻž less āĻŦāĻž āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ grep āĻŦāĻž sed, āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒāĻžāĻ°āĻ°āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻĻā§ˆāĻ¨āĻ¨ā§āĻĻāĻŋāĻ¨ āĻ•āĻžāĻœā§‡ āĻāĻ‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻšāĻœ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻšāĻžāĻ¯āĻŧāĨ¤

āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻ¸āĻžāĻŦāĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ (WSL) āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻĄāĻŧ āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ āĻāĻ—āĻŋāĻ¯āĻŧā§‡ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›ā§‡. āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻĨā§‡āĻ•ā§‡ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĒā§āĻ°āĻ•ā§āĻ¸āĻŋ āĻ•āĻ°āĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•āĻ˛ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ wsl.exe (āĻ¯ā§‡āĻŽāĻ¨, wsl ls) āĻ¯āĻĻāĻŋāĻ“ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ–āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ‰āĻ¨ā§āĻ¨āĻ¤āĻŋ, āĻāĻ‡ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻŸāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ° āĻ¸āĻŽā§āĻŽā§āĻ–ā§€āĻ¨ āĻšāĻ¯āĻŧāĨ¤

  • āĻ¸āĻ°ā§āĻŦāĻŦā§āĻ¯āĻžāĻĒā§€ āĻ¸āĻ‚āĻ¯ā§‹āĻœāĻ¨ wsl āĻ•ā§āĻ˛āĻžāĻ¨ā§āĻ¤āĻŋāĻ•āĻ° āĻāĻŦāĻ‚ āĻ…āĻĒā§āĻ°āĻžāĻ•ā§ƒāĻ¤āĨ¤
  • āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻĒāĻžāĻĨ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¨āĻž āĻ•āĻžāĻ°āĻŖ āĻŦā§āĻ¯āĻžāĻ•āĻ¸ā§āĻ˛ā§āĻ¯āĻžāĻļāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°ā§€ āĻŦāĻŋāĻ­āĻžāĻœāĻ• āĻ¨āĻž āĻ•āĻ°ā§‡ āĻĒāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ…āĻ•ā§āĻˇāĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻžāĻ–ā§āĻ¯āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
  • āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻĒāĻžāĻĨ WSL-āĻāĻ° āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻŽāĻžāĻ‰āĻ¨ā§āĻŸ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤
  • āĻ‰āĻĒāĻ¨āĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¸āĻš WSL āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ¸āĻŽā§āĻŽāĻžāĻ¨āĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤
  • Linux āĻĒāĻžāĻĨ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤
  • āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤
  • āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ.

āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ-āĻāĻ° āĻ…āĻ§ā§€āĻ¨ā§‡ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻļā§āĻ°ā§‡āĻŖā§€āĻ° āĻ¨āĻžāĻ—āĻ°āĻŋāĻ•ā§‡āĻ° āĻŽāĻ¤ā§‹ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ-āĻāĻŦāĻ‚ āĻ¨ā§‡āĻŸāĻŋāĻ­ āĻ•āĻŽāĻžāĻ¨ā§āĻĄā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ†āĻ°āĻ“ āĻ•āĻ āĻŋāĻ¨āĨ¤ āĻ¤āĻžāĻĻā§‡āĻ° āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻ¸āĻŽāĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ­ā§āĻ•ā§āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤

āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ°ā§āĻ¯āĻžāĻĒāĻžāĻ°

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 āĻ‰āĻĒāĻ°ā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ‰āĻĒāĻ¨āĻžāĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ­āĻŋāĻ¨ā§āĻ¨āĻ­āĻžāĻŦā§‡ āĻ†āĻšāĻ°āĻŖ āĻ•āĻ°āĻŦā§‡)āĨ¤

āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ $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. āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻžāĻŦāĻ˛ā§€ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¤āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤āĻŸāĻŋ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧāĨ¤ āĻāĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ!

$WslDefaultParameterValues["grep"] = "-E"
$WslDefaultParameterValues["less"] = "-i"
$WslDefaultParameterValues["ls"] = "-AFh --group-directories-first"

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻĒāĻ°ā§‡ āĻŽāĻĄā§‡āĻ˛ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ $PSDefaultParameterValues, āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻž āĻ¸āĻšāĻœ āĻ…āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§€āĻ­āĻžāĻŦā§‡ āĻ•ā§€ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§‡ "Disabled" āĻ…āĻ°ā§āĻĨā§‡ $true. āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻšā§āĻ¯āĻžāĻļ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻšāĻ˛ āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž $WslDefaultParameterValues āĻĨā§‡āĻ•ā§‡ āĻ†āĻ˛āĻžāĻĻāĻžāĻ­āĻžāĻŦā§‡ $PSDefaultParameterValues.

āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋ

PowerShell āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻŸā§āĻ°ā§‡āĻ˛āĻžāĻ° āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ Register-ArgumentCompleter. āĻŦāĻžāĻļ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻ†āĻ›ā§‡ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽā§‡āĻŦāĻ˛ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ. WSL āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ āĻĨā§‡āĻ•ā§‡ āĻŦā§āĻ¯āĻžāĻļ āĻ•āĻ˛ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻ†āĻŽāĻ°āĻž āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ°â€ā§āĻ¯āĻžāĻĒāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻ•āĻŽāĻĒā§āĻ˛āĻŋāĻļāĻ¨ āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ•āĻŽāĻĒā§āĻ˛āĻŋāĻļāĻ¨ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻžāĻļ āĻ•āĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻžāĻļā§‡āĻ° āĻŽāĻ¤ā§‹āĻ‡ āĻ¸ā§‚āĻ•ā§āĻˇā§āĻŽāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻ•āĻŽāĻĒā§āĻ˛āĻŋāĻļāĻ¨ āĻĒāĻžāĻŦ!

# 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.
  • āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ•ā§‡ āĻļā§‡āĻ˛ āĻĢāĻžāĻ‚āĻļāĻ¨ā§‡ āĻŽā§āĻ¯āĻžāĻĒ āĻ•āĻ°āĻŋ āĻ¯āĻž āĻŦā§āĻ¯āĻžāĻļ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ (āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻŦā§āĻ¯āĻžāĻļ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ $F, āĻāĻ° āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤ āĻ°ā§‚āĻĒ complete -F <FUNCTION>).
  • PowerShell āĻ†āĻ°ā§āĻ—ā§āĻŽā§‡āĻ¨ā§āĻŸ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° $wordToComplete, $commandAst и $cursorPosition āĻ¸ā§āĻĒā§‡āĻ¸āĻŋāĻĢāĻŋāĻ•ā§‡āĻļāĻ¨ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§€ 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 + ĐŋŅ€ĐžĐąĐĩĐģ> āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĻā§‡āĻ–āĻžāĻŦā§‡āĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ–āĻ¨ āĻŦā§āĻ¯āĻžāĻļ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ¤āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻĒāĻžāĻĨāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨!

  • less /etc/<TAB>
  • ls /usr/share/<TAB>
  • vim ~/.bash<TAB>

āĻ¯ā§‡āĻ¸āĻŦ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻŦā§āĻ¯āĻžāĻļ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ¤āĻž āĻ•ā§‹āĻ¨ā§‹ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĻā§‡āĻ¯āĻŧ āĻ¨āĻž, PowerShell āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻĒāĻžāĻĨāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĢāĻŋāĻ°ā§‡ āĻ†āĻ¸ā§‡āĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻ‡ āĻ¸āĻžāĻĨā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻžāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ¤ā§‡ āĻ‰āĻ­āĻ¯āĻŧ āĻĒāĻĨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

PowerShell āĻāĻŦāĻ‚ WSL āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœā§‡ āĻ¨ā§‡āĻŸāĻŋāĻ­ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻāĻ•ā§€āĻ­ā§‚āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤ Win32 āĻŦāĻŋāĻ˛ā§āĻĄ āĻŦāĻž āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋāĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻžāĻ° āĻŦāĻž āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻļā§‡āĻ˛ā§‡ āĻ—āĻŋāĻ¯āĻŧā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻ°ā§āĻŽāĻĒā§āĻ°āĻŦāĻžāĻšāĻ•ā§‡ āĻŦāĻžāĻ§āĻž āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ¨ā§‡āĻ‡āĨ¤ āĻļā§āĻ§ā§ WSL āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨, āĻ¸āĻœā§āĻœāĻŋāĻ¤ āĻ•āĻ°āĻž āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ°āĻļā§‡āĻ˛ āĻĒā§āĻ°ā§‹āĻĢāĻžāĻ‡āĻ˛ и āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻŽāĻĻāĻžāĻ¨āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž! āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻāĻŦāĻ‚ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻāĻŦāĻ‚ āĻĢāĻžāĻ‡āĻ˛ āĻĒāĻžāĻĨāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽā§ƒāĻĻā§āĻ§ āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ¤āĻž āĻšāĻ˛ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻ¯āĻž āĻ†āĻœ āĻ¨ā§‡āĻŸāĻŋāĻ­ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡āĻ“ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻ¨āĻ¯āĻŧāĨ¤

āĻ‰āĻĒāĻ°ā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§‹āĻ°ā§āĻ¸ āĻ•ā§‹āĻĄ, āĻ¸ā§‡āĻ‡āĻ¸āĻžāĻĨā§‡ āĻāĻŸāĻŋāĻ•ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻĢā§āĻ˛ā§‹āĻ¤ā§‡ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻŋāĻ•āĻž āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻāĻ–āĻžāĻ¨ā§‡.

āĻ•ā§‹āĻ¨ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāĻ—ā§āĻ˛āĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻŦāĻ˛ā§‡ āĻŽāĻ¨ā§‡ āĻ•āĻ°ā§‡āĻ¨? āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻœā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ…āĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻœāĻŋāĻ¨āĻŋāĻ¸āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤? āĻ•āĻŽā§‡āĻ¨ā§āĻŸā§‡ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž āĻ—āĻŋāĻŸāĻšāĻžāĻŦā§‡!

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨