ProHoster > Blog > Идораи > Интегратсияи фармонҳои Linux ба Windows бо истифода аз PowerShell ва WSL
Интегратсияи фармонҳои Linux ба Windows бо истифода аз PowerShell ва WSL
Саволи маъмулии таҳиягарони Windows: "Чаро то ҳол вуҷуд надорад <ВСТАВЬТЕ ТУТ ЛЮБИМУЮ КОМАНДУ LINUX>?. Новобаста аз он ки он як лағжиши пурқувват аст less ё асбобҳои шинос grep ё sed, Таҳиягарони Windows мехоҳанд, ки дар кори ҳаррӯзаи худ ба ин фармонҳо дастрасии осон дошта бошанд.
Зерсистемаи Windows барои Linux (WSL) дар ин бобат кадами калон ба пеш гузошт. Он ба шумо имкон медиҳад, ки фармонҳои Linuxро аз Windows тавассути прокси-синг кардани онҳо занг занед wsl.exe (масалан, wsl ls). Гарчанде ки ин беҳбудии назаррас аст, ин вариант аз як қатор камбудиҳо дучор мешавад.
Иловаи ҳамаҷониба wsl дилгиркунанда ва ғайритабиӣ.
Роҳҳои Windows дар аргументҳо на ҳама вақт кор мекунанд, зеро хатҳои баръакс ҳамчун аломатҳои фирорӣ тафсир карда мешаванд, на ҷудокунандаи директория.
# 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, ки мо баъдтар муайян мекунем. Он аз аломатҳои махсус ба монанди фосила ва қавс, ки дар акси ҳол нодуруст шарҳ дода мешаванд, гурезад.
Бо ин парпечҳо шумо метавонед фармонҳои дӯстдоштаи Linux-и худро ба таври табиӣ бидуни илова префикс даъват кунед wsl ва бе ташвиш дар бораи чӣ гуна табдил додани роҳҳо:
man bash
less -i $profile.CurrentUserAllHosts
ls -Al C:Windows | less
grep -Ein error *.log
tail -f *.log
Маҷмӯи асосии фармонҳо дар ин ҷо нишон дода шудааст, аммо шумо метавонед барои ҳама фармонҳои Linux ҷилди онро бо илова кардани он ба рӯйхат эҷод кунед. Агар шумо ин кодро ба шумо илова кунед профил PowerShell, ин фармонҳо ба шумо дар ҳар як сессияи PowerShell дастрас хоҳанд буд, мисли фармонҳои маҳаллӣ!
Танзимоти пешфарз
Дар Linux, муқаррар кардани тахаллусҳо ва/ё тағирёбандаҳои муҳити зист дар профилҳои воридшавӣ, муқаррар кардани параметрҳои пешфарз барои фармонҳои зуд-зуд истифодашаванда маъмул аст (масалан, alias ls=ls -AFh ё export LESS=-i). Яке аз нуқсонҳои прокси тавассути қабати ғайри интерактивӣ wsl.exe - ки профилҳо бор карда нашудаанд, бинобар ин, ин интихобҳо ба таври нобаёнӣ дастрас нестанд (яъне. ls дар WSL ва wsl ls бо тахаллуси дар боло муайяншуда дигар хел рафтор хоҳад кард).
PowerShell таъмин менамояд $PSDefaultParameterValues, механизми стандартӣ барои муайян кардани параметрҳои пешфарз, аммо танҳо барои cmdlets ва функсияҳои пешрафта. Албатта, мо метавонем аз снарядҳои худ вазифаҳои пешрафта созем, аммо ин мушкилиҳои нолозимро ба вуҷуд меорад (масалан, PowerShell номҳои қисман параметрҳоро мувофиқат мекунад (масалан, -a бо ҳам алоқаманд аст -ArgumentList), ки бо фармонҳои Linux, ки номҳои қисман ҳамчун аргумент мегиранд) мухолифат мекунанд ва синтаксис барои муайян кардани арзишҳои пешфарз мувофиқтарин нахоҳад буд (аргументҳои пешфарз номи параметрро дар калид талаб мекунанд, на танҳо номи фармон) .
Бо вуҷуди ин, бо тағир додани каме ба снарядҳои мо, мо метавонем модели шабеҳро татбиқ кунем $PSDefaultParameterValues, ва имконоти пешфарзро барои фармонҳои Linux фаъол созед!