ํ์ฌ ๊ธฐ๋ณธ ๋ช
๋ น ์ค์ ์๋ผ๋ด์ด ๋ถ์ฌ ๋ฃ๊ธฐ๊ฐ PowerShell์์ ์์๋๋ก ์คํ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ ๋ค์ดํฐ๋ธ ๋ช
๋ น์ผ๋ก ์ ๋ฌ๋๋ ๋ฐ์ดํ์ ์๋ชป๋ ๊ตฌ๋ฌธ ๋ถ์ ๋๋ PowerShell๋ก ํด์๋์ง ์๋ PowerShell ๊ตฌ๋ฌธ ์ฌ์ฉ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. PowerShell์๋ ๋ค์ดํฐ๋ธ ๋ช
๋ น๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ --%
ํน์ ์ธ์๊ฐ ์์ต๋๋ค. ๋๋จธ์ง ์ธ์๋ ๋ค์ดํฐ๋ธ ๋ช
๋ น์ ์ ๋ฌ ๋ ๋ฆฌํฐ๋ด๋ก ์ฒ๋ฆฌ๋์ง๋ง ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
|
, &&
๋ฐ ||
์ด ์ฐ์ ํ๋ฏ๋ก wsl --% ls | less
๋ wsl ls
์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ less
ํ์ดํํฉ๋๋ค less
WSL์์ ์คํ--%
๋ฅผ ์ฝ์
ํ๋๋ก ์ค์ ํธ์งํด์ผํฉ๋๋ค.์ ์์ ์๋ก์ด --%
(Call Native) ์ฐ์ฐ์๋ฅผ ๋์
ํ๋ ๊ฒ์
๋๋ค.
์ด ์ฐ์ฐ์ ์ดํ์ ๋ชจ๋ ํ
์คํธ ๋ด์ฉ์ ์คํํ OS์ "๊ธฐ๋ณธ ์
ธ"์ ํธ์ถํฉ๋๋ค. Windows์์๋ cmd.exe์ด๊ณ Unix ๊ธฐ๋ฐ ์์คํ
์์๋ / bin / sh์
๋๋ค. ์ด๋ ๊ฒํ๋ฉด Unix ๊ธฐ๋ฐ ์์คํ
์์ globbing ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๊ณ Windows์์ %variable%
ํ์ฅ์ด ํ์ฉ๋ฉ๋๋ค. --%
์ค์์น์ ๋ฌ๋ฆฌ ์ด๋ |
, &&
๋ฐ ||
๊ฐ ๊ธฐ๋ณธ ๋ช
๋ น ์ค์ ์ผ๋ถ๋ก ์ฒ๋ฆฌ๋จ์ ์๋ฏธํฉ๋๋ค.
์ด๊ฒ์์ด ๋ ๊ฐ์ง๊ฐ ๊ธฐ๋ฅ์ ์ผ๋ก ๋์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
wsl --% ls $foo `&`& echo $PWD
--% wsl ls $foo && echo $PWD
์ฌ๊ธฐ์ $foo
๋ฐ $PWD
๋ WSL ๋ด์ ์
ธ์์ ํ๊ฐ๋ฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์์ ์์ &&
๋ฅผ ์ด์ค์ผ์ดํํด์ผ PowerShell์ด โโ์๋ WSL ๋ด์์ ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์คํ์ ์ถ๋ ฅ์ ๋ค์ PowerShell๋ก ํ์ดํํ๋ ค๋ฉด ์ฌ์ฉ์๋ ๋จผ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ์ ์ฅํด์ผํฉ๋๋ค.
$out = --% ls *.txt
$out | select-string hello
ํ์ฌ &
ํธ์ถ ์ฐ์ฐ์์ ๋ฌ๋ฆฌ PowerShell ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ค์์ ์ฐธ๊ณ ํ์ธ์.
--% $commandline
๋จผ์ PowerShell์์ $commandline
๋ฅผ ๋ณ์๋ก ํ์ธํ์ง ์๊ณ ๋์ $commandline
๋ฅผ ๊ธฐ๋ณธ ์
ธ์ ์ ๋ฌํ์ฌ ํ์ธ๋์ง ์์ ์ํ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ ๋ฌธ์ ๋ --%
๋ฅผ ์
๋ ฅ ํ ํ ๋ถ์ฌ ๋ฃ๊ธฐ ๋งํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.
wsl์ ๋ํ ์์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
--% wsl ls | less
์๋๋ WSL Linux ์ธ์คํด์ค ๋ด์์ ์ ์ฒด ๋ผ์ธ์ ์คํํ๋ ๊ฒ์ ๋๋ค.
์ค์์น๋ก --%
์ด๋ฏธ ์ต์ํ ์ฌ์ฉ์๋์ด ์๋ก์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ฝ๊ฒ ์ ํ ํ ์ ์์ต๋๋ค. ์ ๊ท ์ฌ์ฉ์์ ๊ฒฝ์ฐ --%
๋ ๊ณ ์ ํ๋ฏ๋ก ๊ฒ์ ์์ง์์ PowerShell๊ณผ ์ฝ๊ฒ ๊ด๋ จ์ด ์์์ ์ฐพ์ ์ ์์ต๋๋ค.
&!
๋ฐ &n
๊ฐ์๊ธธ๋ก ์ ์๋์์ง๋ง &!
๊ฐ ์ผ๋ถ ์ธ์ด์์ ์ ํจํ ์ฐ์ฐ์์ด๋ฏ๋ก ๋ฌธ์์ ๋ํ ์น ๊ฒ์์ด ๋ ์ด๋ ค์ ์ง๋ฏ๋ก ๋ฐ๋ฐ์ด์์์ต๋๋ค. ๋ํ &
ํตํ ์ฐ์ฐ์์ ์ ์ฌํ ์๊ฐ์ ๊ฐ์ฒด๊ฐ ์ฌ์ฉ์์๊ฒ ํผ๋์ ์ค์ง ์ฌ๋ถ์ ๋ํ ์ฐ๋ ค๋์์์ต๋๋ค.
์ด ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ์ค ์ฐ์ ์ง์์ ๋ํ ์ง๋ฌธ์ด ์์ต๋๋ค. ์ฒ์์๋ ์ง์ํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด์์ ์๋ฃจ์
๋์ cmdlet ์๋ฃจ์
์ด ์ ์๋์์ต๋๋ค. ํ์ดํ ๋ผ์ธ์ ์์ ๋ฐ์ดํ๋ก ๋ฌถ๊ฑฐ๋ ํน์ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํด์ผํ๋ฏ๋ก "์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ"๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. Invoke-NativeCommand
(๊ฒฐ์ ๋ ๋ช
์ฌ)์์์ ๊ฐ์ cmdlet์ด ์ฐ์ฐ์์ ํ์์ฑ์ ๋์ฒดํ๋ ๋์ ์ถ๊ฐ ์ต์
์ผ๋ก ์ ์ฉ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ ๊ฒํ๋ฉด ๋ค์ ๋ฌธ์ ๋ ํด๊ฒฐ๋ฉ๋๋ค.
https://github.com/PowerShell/PowerShell/issues/12491
https://github.com/PowerShell/PowerSHell/issues/1761
๋๋ ์์ด๋์ด๋ฅผ ์ข์ํ๊ณ ์ ์ฉํ๋ค๊ณ ์๊ฐํ์ง๋ง, ๋จ์ผ ๋ฌธ์์ด ํ์ฅ์ ์ป์ ์ ์๋ค๋ฉด ํจ์ฌ ๋ ์ ์ฉ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค (DSL์ ๊ฒฝ์ฐ ํน๋ณํ ์๊ฐํ๊ณ ์์ต๋๋ค). ๋ฐ๋ผ์ ๋ด PS์์ cmd.exe ํธํ ๋ฌธ์์ด์ ๊ตฌ์ถํ๋ค๋ฉด cmd.exe์ ๊ทธ๋๋ก ๋ฌธ์์ด์ ์ง์ ํ ์ ์์ต๋๋ค. ํน์
&n -command $string
์ ์ฌ์ ์ผ๋ก ๋ด ํต์ญ์ฌ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
&n -shell /bin/sh -command $string
๋๋
&n -shell cmd.exe -command $string
์ด๋ฆ / ์ฐ์ฐ์ ์ธก๋ฉด์์ "&!" ์ฌ์ฉ? shbang ( "#!")๊ณผ ์ ์ฌํฉ๋๋ค.
$!
์ ์ข์ ์ ์์
๋๋ค!
์์ ๋จ์ํ ๋ช ๋ น์ผ๋ก ์ง์ ํ์ฌ ์ง์ ํ ์ ์์ต๋๋ค.
&! /bin/sh -c blah
$var
ํ์ฅ์ $
๊ฐ ๊ธฐ๋ณธ ๋ช
๋ น / ์
ธ์ ์ ๋ฌ๋๊ธฐ ์ํด ๋ฆฌํฐ๋ด์ด์ด์ผํ๋ค๋ ๋ฌธ์ ๋ฅผ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ด ํผํ๋ ค๊ณ ํ๋ ๋ฌธ์ ์ค ํ๋๋ ์ฌ๋๋ค์ด ๋ชจ๋ ๊ฒ์ ์ ์ ํ ํผํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ด์ผ ํ ๋์
๋๋ค. ๋ณ์ ํ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ ํญ์ ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค.
$mycommand = "/bin/sh ls"
Invoke-Expression "&! $mycommand"
๊ทธ๋ฌ๋ PowerShell์ ๊ธฐ๋ณธ ๋ช ๋ น๊ณผ ํผํฉํ๋ ค๋ ๊ฒฝ์ฐ ํ์ฌ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ณ ๊ณ ๊ธ ์ฌ์ฉ๋ฒ์ ๊ณ ๋ คํ ๋ ์ ์ ํ๊ฒ ์ด์ค์ผ์ดํํด์ผํ๋ ํญ๋ชฉ์ ์ธ์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
$mycommand = "/bin/sh ls" Invoke-Expression "&! $mycommand"
๋ฐฉ๊ธ iex๋ฅผ ์ ์ํ์ ๋ค๋ ๋ฏฟ์ ์ ์์ต๋๋ค. :-)
@essentialexch ์ ์ ํ ๊ณณ์ด ๋ช ๋ฒ ์์ต๋๋ค. :)
์ด ์์ ์์ ์์๋๋ ๊ฒ์ ์ฌ์ฉ์๊ฐ ์คํํ๊ธฐ ์ ์ $mycommand
์ ๋ด์ฉ์ ์ ๋๋ก ํ์ธํ์์ ์๋ฏธํฉ๋๋ค!
๋น์ ์ด ์ค๋ช
ํ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ์ ๋ํ ํ๋ฅญํ ๊ธ๊ณผ ํด๊ฒฐ์ฑ
์ด ๋ฐ๋์ ํ์ํฉ๋๋ค.
๋๋ --%
์ ๋ํด ๋ชฐ๋๊ณ ์ํ๊น๊ฒ๋ ๋ณธ ์ ์ด ์์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ ๋ &n
์ฐ์ฐ์๋ ์ ์ฌํ ๊ฒ์ ๊ฐ๋ฅ์ฑ ๋ฌธ์ ๋ฅผ ๊ฒช์ ์ ์์ผ๋ฉฐ ๊ธฐํธ๋ฅผ ๋ฌธ์์ ๊ฒฐํฉํ๋ ๊ฒ์ด ์์ฐ์ค๋ฝ์ง ์์ต๋๋ค (C printf ๋ฌธ์์ % f๋ฅผ ์๊ธฐ์ํต๋๋ค). ์ด์จ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฏ๋ก ์๋ฅผ ๋ค์ด &&
์ผ ์์๋ ์ด์ ๊ฐ ์์ต๋๊น?
์คํํ๋ ค๋ ์์ญ์ ํ์ํ๊ธฐ ์ํด ๋๊ดํธ (๋๋ ์ด์ค ์ค๊ดํธ?)์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ง๊ด์ ์ผ ์ ์์ต๋๋ค. ์ : & [ wsl ls ] | less
๋๋ &!
๊ฐ ๋ค๋ฅธ ์
ธ์์ ์ค๋ ์ฌ๋๋ค์์ํ ๋ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๋ ๋ฐ ๋์ํ์ง๋ง, super-duper-linter์์๋ ์ผ๋ฐ์ ์ผ๋ก ๋งค๊ฐ ๋ณ์ ๋ฐฐ์ด์ ๋น๋ ํ ๋ค์ ๋ช
๋ น์ ์คํ๋ ํ
ํ์ฌ ๊ธฐ๋ณธ ๋ช
๋ น์ ์คํํฉ๋๋ค.
$command = 'linter'
$myargs = @(
'-config'
'linterconfig.path'
)
if ($Test) {$myargs += 'test'}
& $command <strong i="7">@myargs</strong>
๊ทธ๋์ ์ด๊ฒ์ ์กฐ๊ฑด๋ถ ๊ฒฝ์ฐ์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
@bergmeister ์ ๋ ์๋ &&
๋ฅผ ์๊ฐ์ ์ผ๋ก ์๊ฐํ๋๋ฐ ์ค๋๋ ๋ง์ ์ฌ๋๋ค์ด ์๊ณ ์๋ &
์ ๋น์ทํฉ๋๋ค. ๊ทธ๋ฌ๋ &&
๊ฐ ํ์ดํ ๋ผ์ธ ์ฒด์ธ ์ฐ์ฐ์ ์ธ ๊ฒฝ์ฐ ์ํํด์ผ ํ ์์
์ ๋ํด ํผ๋์ ์ค ์ ์์ต๋๋ค. ํ์ฌ &!
์ ์์ด ๋ง์์ ๋ญ๋๋ค.
@JustinGrote , ๊ณ์ ์ฌ์ฉํ์ง ์์ ์ด์ ๊ฐ ์์ต๋๋ค. &!
๊ตฌ๋ฌธ์ ์ค์ ๋ก ์๋ผ๋ด์ด ๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๊ฑฐ๋ PowerShell ๊ตฌ๋ฌธ๊ณผ ์ถฉ๋ํ๋ ์ธ์๊ฐ ์๊ณ ์ ๋๋ก ์ด์ค์ผ์ดํํ๋ ๋ฐฉ๋ฒ์ ์ํ์ง ์๊ฑฐ๋ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค.
์ค ์ด๋ฐ, 10 ๋
์ ์ ๋ธ๋ฃจ์ค์ ์ ์ด์จ๊ณผ ํ ๋ก ํ๋ ๊ธฐ์ต์ด ๋๋ค. ๋ด ์ง๊ฐ์ ์ฌ๊ธฐ์ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ๋ฐ๋ช
ํ๋ ๊ฒ์ด ๋ถํ์ ํด ๋ณด์ธ๋ค๋ ๊ฒ์
๋๋ค. ์ด ์ค๋ ๋์ ์ผ๋ถ ์ฌ๋๋ค์ --%
์ ๋ํด ๋ค์ด ๋ณด์ง ๋ชปํ์ง๋ง ๋น์ ์ด ์๊ฐํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ ๊ฑธ๊ฒ ์ต๋๋ค. ๋ฌธ์ :
# run ls in wsl, return results to powershell, then pipe to wsl again, to grep.
& wsl ls | wsl grep -i "foo"
# the entire pipeline right of wsl will run in wsl.
& --% wsl ls | grep -i "foo"
์ ์๋ฌด๋ ์ด๊ฒ์ ์ ์ํ์ง ์์์ต๋๊น? "์ด ์ดํ์ ๋ชจ๋ ๊ฒ์ ํน๋ณํ powershell ์ฒ๋ฆฌ์์ด ์ ๋ฌ ๋ ๊ฒ์
๋๋ค."๋ผ๊ณ ๋งํ๋ ๊ฒ์ ๋ค๋ฅธ ๊ณณ์์ --%
์ฌ์ฉ๊ณผ ๋
ผ๋ฆฌ์ ์ผ๋ก ์ผ์นํฉ๋๋ค.
@oising , ์คํํ๋ ค๋ ๋ช
๋ น์ผ๋ก ์์ํด์ผํ๋ฏ๋ก ํด๋น ๋ช
๋ น์ด ์๋ํ์ง ์์ต๋๋ค. ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ์ ์ํฉ๋๊น?
์ด๊ฒ์ ์์๋๋ก ์ํ๋ฉ๋๋ค.
function Invoke-LiteralCommand ($command) {Invoke-Expression "& $command --% $args"}
Invoke-LiteralCommand ping -W 200 www.google.com | grep icmp
@JustinGrote ์, ์ง๊ธ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. :) &n
๋๋ &!
๋๋ ๊ทธ ๋ฐ์ ์ด์ผ๊ธฐ๋ฅผ _ ๋์ _ ์ ์ํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. &
๋ ํธ์ถ์ด๊ณ --%
๋ powershell ๊ตฌ๋ฌธ ๋ถ์์ ์ต์ ํฉ๋๋ค. ํจ๊ป ๊ทธ๋ค์ ์๋ก์ด ๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ์ผ๊ด๋๊ณ ๋ฐ๊ฒฌ ๊ฐ๋ฅํฉ๋๋ค. ๋๋ "ํตํ"์ "์๋ ์ ํ"๊ตํ ์์ด ์๋ค๋ ์๊ฐ์ด ์ซ๋ค.
์ฐจ์ด์ ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์์ ๋ฅผ ํ์ฅํ์ต๋๋ค.
@oising ๋๋ ์ด๊ฒ์ด ์๋ฏธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ "bash๋ฅผ ์๋ ์๋ก์ด powershell ์ฌ์ฉ์"์ ๋ํ ๋ง์ ๋ํ ํ์ดํ์ด์ง๋ง ์๋ก์ด ์ฐ์ฐ์์ ๋ํด ๋ฉ์ง ๊ฒ์ ๋๋ค.
@oising ๋๋ ์ด๊ฒ์ด ์๋ฏธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ "bash๋ฅผ ์๋ ์๋ก์ด powershell ์ฌ์ฉ์"์ ๋ํ ๋ง์ ๋ํ ํ์ดํ์ด์ง๋ง ์๋ก์ด ์ฐ์ฐ์์ ๋ํด ๋ฉ์ง ๊ฒ์ ๋๋ค.
์ ํ. PowerShell / cmd.exe / bash ์ฌ์ด์ ๋ณต์กํ ์ธ์ฉ ๊ท์น์ ์ดํดํ์ง ๋ชปํ๋ PowerShell ์ฌ์ฉ์๋ฅผ์ํ ๊ฒ์ ๋๋ค. ์ด์ ์ ๋ชฉ์ "call native"๋ผ๊ณ ์ ํ ์๊ธฐ ๋๋ฌธ์ ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์ ํธ์ถํฉ๋๋ค.
@oising ๋๋ ์ด๊ฒ์ด ์๋ฏธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ "bash๋ฅผ ์๋ ์๋ก์ด powershell ์ฌ์ฉ์"์ ๋ํ ๋ง์ ๋ํ ํ์ดํ์ด์ง๋ง ์๋ก์ด ์ฐ์ฐ์์ ๋ํด ๋ฉ์ง ๊ฒ์ ๋๋ค.
์ ํ. PowerShell / cmd.exe / bash ์ฌ์ด์ ๋ณต์กํ ์ธ์ฉ ๊ท์น์ ์ดํดํ์ง ๋ชปํ๋ PowerShell ์ฌ์ฉ์๋ฅผ์ํ ๊ฒ์ ๋๋ค. ์ด์ ์ ๋ชฉ์ "call native"๋ผ๊ณ ์ ํ ์๊ธฐ ๋๋ฌธ์ ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์ ํธ์ถํฉ๋๋ค.
์ฌ์ค, ๋๋ ๊ทธ๋ค์ ๋ํด ์ ํ ์๊ฐํ ํ์๊ฐ์๋ ์ฐ๋ฆฌ๋ฅผ์ํ ๊ฒ์ ๋๋ค.
๋ค, @oising์ ๋๋ค. ์ด ๊ฐ๋ ์ ์กด์ฌํ์ง๋ง ๋งค์ฐ ๋ถ์ถฉ๋ถํฉ๋๋ค. ์์ ํ ์๋ก์ด ๊ฒ์ ๊ตฌํํ๋ ค๋ฉด ์ด์ ๊ตฌ๋ฌธ์ ํ๊ธฐ / ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ ์ข ์ข ์ด๋ฌํ ์์ด๋์ด๊ฐ ๋ชฉ์๋ฆฌ๋ฅผ ๋ด๊ณ ์ค์ ๋์ ์ธ๊ตฌ ํต๊ณ์ ์ถฉ๋ถํ ๊ฐ์ค์น๊ฐ ๋ถ์ฌ๋์ง ์๋๋ค๊ณ ๋๋๋๋ค. ์ฌ์ฉ์๊ฐ _already_์ ๊ธฐ์กด์ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด ์ ์ฐ๊ณ , ๊ทธ๋ค์ด ๋ฐ๊ฒฌ๋๋ฉด ๋ถ์กฑํ ๊ธฐ์กด์ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒฝ์ฐ๋ A A์ ํธ์ถ) ๋ฌธ์๋ฅผ ๊ฐ์ ํ๊ณ , b)๋ ํฅ์ ๊ธฐ์กด ์ฌ์ ์์ ์ค์ ๊ธฐ๋ฅ์ ๋๋ค.
๋์ ์ ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ๋ ์ด๋ฏธ ์ฌ์ฉ์๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๊ทธ๊ฒ์ ๋ฐ๊ฒฌํ๊ธฐ์ํ ์ ๊ทผ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค ๋ฌธ์์ ์์กด ์์ง _another_ ์ฐ์ฐ์๋ฅผ ๋์ ํ๋ฉด์ ๊ณผ๊ฑฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก๋์ด ์ด์ํ ์ต์ c)๋ฅผ ์ป๋๋ค.
์ด๋ฌํ ๊ฐ๋ ์ ์๊ฐํ๋ ๋ฐ ์ค๋ฅ ๋ฉ์์ง ๋ฐ / ๋๋ ์ ์ ์์คํ ์ ์ฌ์ฉํด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ธ ๋ฒ์งธ๊ฐ ํ์ํ๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๊น? ๋ค๋ฒ์งธ? ๋ค์ฏ? (๋๋ ๋ง ๊ทธ๋๋ก ์นด์ดํธ๋ฅผ ์์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋๋ฅผ ๋์์ค๋๋ค) ๋ช ๋ น์ ํธ์ถํ๋ ๋ฐฉ๋ฒ. ๊ธฐ์กด ๋ฐฉ๋ฒ์ ๋ถ์ถฉ๋ถํฉ๋๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ํ๊ณ ๋ค๊ธฐ ์์ํ ๋ ์ฌ์ฉ์๋ฅผ ๋ ํผ๋์ํค๊ธฐ ์ํด ๊ฑฐ๋ฏธ์ค์ฒ๋ผ ๋จ๊ฒจ ๋์ง ๋ง๊ณ _ ๊ฐ์ ํด์ผํฉ๋๋ค _.
์ฌ๋๋ค์ด ๋ฌด์ธ๊ฐ๋ฅผํ๋ 5 ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์ ๋๋ฐ๋ ์ฒซ ๋ฒ์งธ ์ง๋ฌธ์ "๋ง ๊ทธ๋๋ก ๊ฐ์ ์ผ์ํ์ง๋ง ์ ์๋ํ์ง ์๋ 2 ~ 3 ๊ฐ์ง ๋ฐฉ๋ฒ์ด์๋ ์ด์ "์ ๋๋ค. ์ ๋๋ต์ ํญ์ ๊ทธ๋ ์ต๋๋ค. -PS ํ์ ๊ธฐ๋ฅ์ ์ถ๊ฐ / ๊ฐ์ ํ๋ ค๊ณ ํ ๋ ์ง๋ 10 ๋ ๊ฐ์ ๋ชจ๋ ๊ฒ ++์ด ์ฌ์ ํ ์๋ํ๋์ง ํ์ธํ๋ ๋ฐ ๋๋ฌด ์ง์คํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋ค์ ๋ณผ ์ ์์ต๋๋ค. ๊ธฐ์กด์ด์ง๋ง ์์ ๋ฐ ๊ฐ์ ์ด ํ์ํ ๋ถ์ถฉ๋ถ ํ ๊ตฌํ์ด ์์ผ๋ฉฐ ์ ์ ๋ ์๋ฃจ์ ์ ์ ์ฌ์ ์ผ๋ก ๋ถ์์ ํ ๋ค๋ฅธ ๊ตฌํ์ ์ถ๊ฐํ์ฌ ํ์ ๋์ฑ ํผ๋์ค๋ฝ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ IMO๋ผ๋ ๋ค๋ฅธ ๊ตฌํ์ ๋ค์ ์์ํ๋ ๊ฒ์ด ์๋๋ผ ์์ํ๋ ๊ฒ์ ๋๋ด์ผํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ &๋ฅผ ๋ช ๊ฐ์ง ์ด์์ ๊ณ ์ ํ ์ฌ์ฉ ์ฌ๋ก์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๊ฒ์ ๋์ฌ๋ก ๊ฐ์ฃผํ๊ฑฐ๋ ์ธ์ด ์ ๋ฐ์ ๊ฑธ์น ํ์คํ๋ฅผ ์ดํด ๋ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ์ํ๋ ๋ง์ง๋ง ๊ฒ์ &๊ฐ ๋ฌด์์ ํ ๊ฒ์ธ์ง์ ๋ํ ํผ๋์ ๋๋ค. ์ ์ฒด์ ์ผ๋ก.
3 ๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํฉ๋๋ค.
wsl ls $path
์ฌ์ ํ ์๋@ mklement0 ๋๊ธ์ด ์ด๋์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. :-)
์ด ๊ธ์ ์ฝ์ ๋ ๋๋ ์๊ฐํ๋ค. ์ข์ ์๊ฐ์ด์ผ! ๊ทธ๋ฌ๋ ๋๊ธ์ ์ฝ์ ํ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค. ๋๋ ํญ์ & ๋ช ๋ น์ด 'PS ํ์ค์ด ์๋'๊ณผ 'PERL days'(ugh)๋ฅผ ์๊ธฐ์์ผ์ฃผ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ ๋ค๋ฅธ ๋นํ์ค PS ๋ช ๋ น (๋ช ์ฌ ๋์ฌ๊ฐ ์๋)์ ๋์ ํ๋ ๊ฒ์ ๋์์ด๋์ง ์์ต๋๋ค. ์ถ์ .
-% ๋งค๊ฐ ๋ณ์์ ๋ํด์๋ ๋ชฐ๋์ต๋๋ค. ์๋ฃจ์ ์ผ๋ก @JustinGrote ์ ๋์ผํ ์์น์ ์ฌ์ฉํฉ๋๋ค.
PS ์
ธ๋ก ์๋ฅด๊ธฐ / ๋ถ์ฌ ๋ฃ๊ธฐ ๋ช
๋ น์ด ๋์ ์ฃผ์ '๊ฒ'์ด์๋ ์ ์ด ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ณธ ๋ช
๋ น์ PowerShell ๋ช
๋ น์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ๋ ๋ซ์ง ์์๊น์?
cmd.exe๋ฅผ ์์ ํ ๋์ฒด ํ ๊ฒฝ๋ก๋ฅผ ๋ง๋์ญ์์ค ...
๋๋ ๊ธฐ์กด ๋ช ๋ น์ ๊ฐ์ ํ๊ธฐ ์ํด ํฌํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ -์ค์ ๋ก-% ๋ฐ & ์ฌ์ฉ์ ๋ํ ์ผ๋ถ ๋ฌธ์ ๊ฐ์
@iSazonov @ SteveL-MSFT๊ฐ ์ ์ํ๋ ์ฌ์ฉ ์ฌ๋ก๋ '์ปท ๋ถ์ฌ ๋ฃ๊ธฐ'์๋๋ฆฌ์ค์ ๋๋ค. ๋ถ๋ถ ํ์ฅ์ ์ผ์ ํจ์ฌ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค (AST ์ธก์์)
์ฆ์ "#!" ๊ทธ๋ฆฌ๊ณ "!#". "&!"๋ฅผ ์ข์ํฉ๋๋ค.
ํ ํฌ ๋์ด์ ์ ํจ์ ํธ์ถ์ ํ ํฐ ๊ฐ์๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ค์์ ์ฌ์ฉ์ ํ์ฉํฉ๋๋ค.
Iex -l
๋๋ ์ ๋ฌํ๊ธฐ ์ ์ ๊ตฌ๋ฌธ ๋ถ์์ ์ค์งํ๋ Invoke-Expression -literal.
ํ์ฑ โโ์์ค์์ ๋ ๋ง์ ๊ณ ์ ํ ํฐ์ ์ถ๊ฐํ๋ฉด ์ง์ ์ฅ๋ฒฝ์ด ์ฌ๋ผ๊ฐ๊ณ ์ด ๊ธฐ๋ฅ์ ๋ํ ๊ฒ์ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์์ง๋๋ค.
์๋ฅผ ๋ค์ด Get-Help &๋ ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ about_Operators์์ ์ฐพ์์ผํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฌธ์ํ๋์ง ์์ call_operator์ ๋ํ ๊ณ ์ ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
& modulename {๋ช
๋ น}
๋ชจ๋๋ก ๋ฒ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ง์ ๊ฒ์ด ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒ์ ๊ฐ๋ฅ์ฑ์ด ๋๋ฌด ๋ฎ์์ ๊ธฐ๋ณธ ๋ฌธ์ ๋ด์์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ปค๋ฎค๋ํฐ๋ JSnover์ ๊ทธ๊ฐ ์ฐ๋ฆฌ์๊ฒ ๋ฉ์ง ๊ฒ์ ๋ณด์ฌ์ค ๊ฐ์ฐ์ ํตํด์๋ง ๊ทธ๊ฒ์ ๋ํด ์๊ณ ์์ต๋๋ค.
์๋ก์ด ์ฌ์ฉ์ ๊ด์ ์์์ด "๊ธฐ๋ฅ"์ด ์ผ๋ง๋ ๊ฒ์ ๊ฐ๋ฅํ์ง ์์ ํ ๊ณ ๋ คํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ก์ด ์ฌ์ฉ์๋ pwsh ์ฝ์ด์ ๋ํ ์๋ก์ด ์ฌ์ค์ ์์ง ๋ชปํด๋ Powershell 5์์์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๊ณ ํ ๊ฒ์ ๋๋ค. ๊ฒ์ ๊ฐ๋ฅ์ฑ์ด ๋๋ฌด ๋ฎ์ต๋๋ค.
๊ธฐ์กด ๋์์ ๋ณ๊ฒฝํ๊ณ ์ถ์ง๋ง PowerShell์์ ์ด๋ฌํ ๊ธฐ๋ณธ API๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋ง์ ๊ฒ์ ๋ง์น ์ ์์ต๋๋ค. ๊ตฌ์ฑ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
PS 6๊ฐ GA๋๊ธฐ ์ ์ ๋ ์ง์ ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ ์๋ ์์ง๋ง ์์งํ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ฌ๊ฐํ ์ํ์ด๋์์ ๊ฒ์
๋๋ค (Python์ print()
ํจ์์ ๋ค๋ฅด์ง ์์).
ํ์ ํ๋ก์ธ์ค์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ์ธก๋ฉด์์ ๋๊ธฐ ํธ์ถ๊ณผ Start-Process
ํธ์ถ ๋ชจ๋ ์ด๋ฏธ ์ ๋ฐ ๊ฒ์ฌ์ ๋ํด ๋
ผ์ํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฉฐ ์ผ๊ด์ฑ์ ์ํด ํ ๋ฒ์ ํฌ์ํด์ผํ๋ค๋ ๋๋์ด ์์ต๋๋ค. ํนํ Start-Process๋ ์ธ์ ๋ฐฐ์ด ์ ๋ฌ ์ง์์ ์
๋ฐ์ดํธํด์ผํฉ๋๋ค.
cmdline arg ์ ๋ฌ์ ์ฌ์ฉํ ๋๊ธฐ ํธ์ถ์ ๊ฒฝ์ฐ ๋ค ๊ฐ์ง ์ข ๋ฅ์ ์ธ์ ์ ๋ฌ์ด ๊ฐ๋ฅํฉ๋๋ค.
CommandLineToArgvW
์ ๋ฐ๊ณ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ ๋ ๊ฑฐ์๊ฐ ๋ ํ์ฌ ๋์>
๋ฐ |
์ ๊ฐ์ ํญ๋ชฉ์ด ๋ณ๋์ ๋ช
๋ น์ ์ํํ๋๋กํ๋ ๊ธฐ๋ณธ ๋์์
๋๋ค. ์ด ๋ชจ๋์์ ํ์ ํ๋ก์ธ์ค๊ฐ ํํ์์์ ๊ฐ์ ธ ์ค๋ ๊ฐ์ Write-Host $val
ํ์๋๋ ๊ฐ์ด์ด์ผํฉ๋๋ค.--%
์ด ์ค๋ํด์ผํ๋ ์ผ์ด์ง๋ง ์ด์์ ์ผ๋ก๋ --% ... %--
์ ๊ฐ์ด ๊ฐ์ ์ค์ ์ฝ์
ํ ์์๋ ๋ ํ ํฐ์ด ํ๋๋ฟ์
๋๋ค.์ฒซ ๋ฒ์งธ ๋์์ ๋ ๋ฒ์งธ ๊ธฐ๋ฅ์ ์คํ์ ๊ธฐ๋ฅ์ผ๋ก ๋์ ํ ๋ค์ ๊ต์ฒดํ์ฌ ์ฒ์ฒํ ๋จ๊ณ์ ์ผ๋ก ์ ๊ฑฐํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ ๋ฒ์งธ ๋ฐ ์ธ ๋ฒ์งธ ๋์์ &!
๋ฐ &#
๋๋ +% ... -%
์ ๊ณ ์ ํ์๊ธธ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ถ์ด ๋ชจ๋์ ๊ฒฝ์ฐ ๋ ๋ง์ ํ ํฐ์ด ์ถ ์ด์ ์ผ๋ก ์ทจํด ์ง๋๋ก ์ด์ค์ผ์ดํ ํ ํฐ์ ๋จ์ํํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. heredoc๊ณผ ์ ์ฌํฉ๋๋ค.
์์ฒญ์ด "์ด ์ฐ์ฐ์ ์ดํ์ ๋ชจ๋ ํ
์คํธ ๋ด์ฉ์ ์คํํ OS์"๊ธฐ๋ณธ ์
ธ "์ ํธ์ถํฉ๋๋ค."์ ๊ฐ์ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ ๋ฟ์ธ ๊ฒฝ์ฐ. shell
์ด๊ฒ์ ๋ช
์ ์ ์ผ๋ก ๋งํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
```ํ์ ์
PS> ์ wsl ls | ์ ๊ฒ
PS> (shell wsl ls * .txt) | Select-String Hello
Forth / APL ์คํ์ผ์ ์ํธ ์ฐ์ฐ์๋ณด๋ค ๊ฒ์ ๋ฐ ์ฝ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ์ด๋ป๊ฒ ํด๊ฒฐ ๋ ์ง ๋ชจ๋ฅด๊ฒ ๋ค # 1995 : https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -653174261 ์ฐธ์กฐ
๋ํ WSL์ ๋ฌธ์ ๋ powershell์ด โโ์๋ wsl.exe
(https://github.com/PowerShell/PowerShell/issues/12975#issuecomment-650353021 ์ฐธ์กฐ) ๋์์ ๋ฌธ์ ์
๋๋ค.
(์ข์์, powershell์ ๋ฌธ์ ๊ฐ ์์ง๋ง ๊ทธ๊ฑด # 1995์
๋๋ค)
์, ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ https://github.com/PowerShell/PowerShell/issues/12975์ ๊ฑฐ์ ์ค๋ณต๋์ง ์์ต๋๊น? ๋ณธ์ง์ ์ผ๋ก ๋๋ถ๋ถ ๋ฐ๋ณต ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ธ๊ธ ํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฟก ๋นต๋จ๋ฌธ์ ๋ varbatim์ ์์ ํ๋ ๋ช ๋ น / ์คํฌ๋ฆฝํธ๋ก ์ ๋ฌํ ๋ช ๋ น ์ค์ ์ผ๋ถ๋ฅผ ๊ตฌ๋ถํ๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ ํญ์ ์ฌ์ฉ์๋ฅผ ๋ฐฉํดํ๋ค๋ ๊ฒ์ ๋๋ค."varbatim์ ์ ๋ฌํ ๋ช ๋ น ์ค ๋ถ๋ถ"์ด๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ์๋ฏธํฉ๋๊น 1. ํธ์ถ ๋ ์คํ ํ์ผ์ ๋ฌธ์ ์ํ์ค๋ฅผ ๊ทธ๋๋ก ์ ๋ฌํ์ฌ ํธ์ถ ๋ ์คํ ํ์ผ์ด ์ธ์ ๋ฐฐ์ด์ ํ ์์์์ด ๋ฌธ์ ์ํ์ค๋ฅผ ๊ฐ๋๋กํฉ๋๋ค (์ : ์ด๋ฌํ ๋ฌธ์๋ [main]์`argv [1]`์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ] (https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs-2019#command-line-arguments)) ๋๋ 2. insert๋ฅผ ์๋ฏธํฉ๋๊น? ์ผ๋ถ ๋ฌธ์ ์ํ์ค๋`CreateProcess`์ [`lpCommandLine` ๋งค๊ฐ ๋ณ์์ ๊ทธ๋๋ก ํฌํจ] (https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw#parameters)- -(1.)์ ์๋ฏธํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ ์๋ํฉ๋๋ค.(https://github.com/PowerShell/PowerShell/issues/1995์์ ๋ ผ์ ๋ ์ฝ์ ๋ ๋ฐ์ดํ ๋ฌธ์ ๋ฅผ ์ ์ธํ๊ณ ) ๋๊ตฐ๊ฐ๋ ์ฌ๊ธฐ์ ํ ์ค ๋ฌธ์์ด์ ์ถ๊ฐํ๋ฉด ์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํฅ์ ๋ ๊ฒ์ด๋ผ๊ณ ์ฃผ์ฅ ํ ์ ์์ง๋ง, ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ด ๋ฌธ์ ์ ํต์ฌ์ด ์๋๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ ์ด๋ ์ ๋ ์๋ํ๋ฏ๋ก (2.)๋ฅผ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค .--- (2.)๋ฅผ ์๋ฏธํ๋ค๋ฉด, ๊ทธ๊ฒ์ ๋ํ ์ ์๊ฒฌ์ ๋ค์ ๊ทน์ ์ธ ๋ฐฉ์์ผ๋ก ๋งํ๊ฒ ์ต๋๋ค : ์ ๋ฐ ์ ๋ฐ ์ถ๊ฐํ์ง ๋ง์ญ์์ค ์ด๊ฒ์ ๋ํ ํน๋ณํ ๊ตฌ๋ฌธ. ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก`-%`๊ฐ ์๋ํ ์ผ์ด๋ฉฐ, ๊ตฌํ ๋ ์ ์ด ์์ด์ผํฉ๋๋ค. ๋ด๊ฐ ์ ๊ทธ๋ ๊ฒ ๊ฐ๋ ฅํ๊ฒ ๋ฐ๋ํ๋ ๊ฑธ๊น์? 1. Windows์์๋ง ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ฉด Windows์ powershell์ด โโLinux์ ๋ค๋ฅธ ๊ตฌ๋ฌธ์ ๊ฐ๊ฒ๋ฉ๋๋ค. (๋๋ ๊ตฌ๋ฌธ์ด ์ง์๋์ง๋ง ํ์ฌ`-%`์ ๊ฒฝ์ฐ์ด๋ฏ๋ก ์์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค.) 2. Microsoft์์ ๊ฒ์ ํ Windows์ ๊ธฐ๋ณธ ๋ช ๋ น ์ค ์ ธ์ด via๊ฐ ์๋ ํน์ ๊ตฌ๋ฌธ์ ํตํด ์ผ๋ฅ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ a cmdlet)๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ์ ์ธ [๋ช ๋ น ์ค ๊ตฌ๋ฌธ ๋ถ์ ๊ท์น] (https://docs.microsoft.com/en-us/cpp/cpp/main-function-command-line-args?view=vs)์ ๋ฐ๋ฅด์ง ์๋ ์คํ ํ์ผ์ ํธ์ถํฉ๋๋ค. -2019 # parsing-c-command-line-arguments) (๋๊ตฌ๊ฐ ์ผ๋ฐ์ ์ธ ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ ํ์ํ์ง ์์ต๋๋ค (2.), ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค (1.)). ๊ทธ๋ฌ๋ฉด ๋ช ๋ น ์ค ์์ฑ์์๊ฒ ๊ถ์ฅ๋ฉ๋๋ค. ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๊ท์น์ ๋ฐ๋ฅด์ง ์์ผ๋ฉด [ "Windows ๋ช ๋ น ์ค ๋ฌด์ง์"] (https://stackoverflow.com/a/4094897/2770331)๊ฐ ์ ํ ๋ ๋ฟ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ท์น์ ๋ฐ๋ฅด๋ ์ฌ๋์ด ์ ์์๋ก ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถํ๊ฑฐ๋ ์ผ๋ฐ์ ์ผ๋ก ํฌ๋ก์ค ํ๋ซํผ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๊ฐ ๋ ์ด๋ ค์ ์ง๋ฏ๋ก ํ๋ก๊ทธ๋จ ์์ฑ์๋ ์ด๋ฌํ ์ผ๋ฐ์ ์ธ ๊ท์น์ ๋ฐ๋ฅด๋๋ก ๊ถ์ฅํด์ผํฉ๋๋ค. 3. ์ด๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ผ๋ ๊ฒ์ ์์ฌ ์ค๋ฝ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ WSL์๋ง ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. Windows ํฐ๋ฏธ๋์ wt ๋ช ๋ น ์ค ํธ์ถ ๋ฐ ๊ธฐํ ๋ง์ ๋๊ตฌ์๋ ์ํฅ์์ค๋๋ค. ๊ทธ๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๋ช ๊ฐ์ง ์๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๊น? WSL์ ๊ฒฝ์ฐ WSL์ ๋ช ๋ น ์ค ๊ตฌ๋ฌธ ๋ถ์์ ๋จ์ํ [๊นจ์ง] (https://github.com/Microsoft/WSL/issues/1746) (๋ฌธ์ ๋`bash.exe`์ ๊ดํ ๊ฒ์ด์ง๋ง ์ํฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก`wsl.exe`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง ์์)-์ผ๋ฐ์ ์ธ [๋ช ๋ น ์ค ๊ตฌ๋ฌธ ๋ถ์ ๊ท์น] (https://docs.microsoft.com/en-us/)์ ๋ฐ๋ฅด์ง ์๋ ๋ชจ๋ ๋๊ตฌ๋ฅผ ๊ณ ๋ คํฉ๋๋ค. cpp / cpp / main-function-command-line-args? view = vs-2019 # parsing-c-command-line-arguments) ๊ณ ์ฅ ๋ฌ์ง๋ง WSL์ ๊ธฐ๋ณธ ๋์์ IMHO๊ฐ ์ ๋๋ก ๋ฌธ์ํ๋์ง ์์์ต๋๋ค. "`wsl.exe`์ ๋์์ด ๊นจ์ก์ต๋๋ค.์ด ์๋ต์ ์์ฑํ๋ ๋์`-e`๋ฅผ ์ฌ์ฉํ ๋`wsl.exe`๊ฐ ์ค์ ๋ก ์์๋๋ก ๋์ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.PS /home/User> /bin/echo 'cd / && ls . | cowsay' cd / && ls . | cowsay PS /home/User>
๋ฐ๋ผ์์ด ๋ช ์ ์ ์ฌ์ฉ ์ฌ๋ก์์ ๋๋ฝ ๋ ์ ์ผํ ๊ฒ์ ๋ค๋ฅธ ์ผ๋ฐ exe์์์ ๊ฐ์ด ๊ตฌ๋ฌธ ๋ถ์ ๋ ๋ช ๋ น ์ค ์ธ์๋ก ๊ธฐ๋ณธ ์ ธ์ ํธ์ถํ๋`wsl.exe`์ ๋ํ ๋งค๊ฐ ๋ณ์ ์ธ IMO์ ๋๋ค.PS C:\> wsl -e bash -c 'cd / && ls . | cowsay' _______________________________________ / acct bin boot cache cygdrive data dev \ | etc home init lib lib64 lost+found | | media mnt opt proc root run sbin snap | \ srv sys tmp usr var / --------------------------------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || || PS C:\>
"์์ ๋ช ๋ น / ์คํฌ๋ฆฝํธ์ varbatim์ ์ ๋ฌํ ๋ช ๋ น ์ค ๋ถ๋ถ"์ ๊ดํ ์ ์ผํ ๊ฒ์์ด ์ฐ์ฐ์๋ก ๊ฐ์ ๋ ๊ฒ์ ๋๋ค. ์์ ์๋ฏธ (2.)๊ฐ ๋ ๊ฒ์ ๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด ๊ทธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋์.
๋ฐ๋ก ๊ฐ๊ธฐ ๋ง ์์ผ๋ฉด ๊ธฐ์กด ๋ช
๋ น ์ค์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค. cmdlet (์ : Invoke-Shell
, linux์์๋ bash -c
ํธ์ถ, cmd /c
ํธ์ถ) ์ฐฝ๋ฌธ?
๊ทธ๋ผ ๋น์ ์ ํ ์ ์์ต๋๋ค
Invoke-Shell @'
whatever existing comandline containg '"quotes"' or whatnot
'@
ํ ์ค์ด์ด์ผํ๋ค๋ฉด ์ฌ๊ธฐ์ ํ ์ค ๋ฌธ์์ด ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์ญ์์ค.ํ์ง๋ง ์ ๋๋ก ์ฐพ์ ์์๊ณ ๋ชจ๋ ๊ฒ์ ๋ณต์กํ๊ฒ ๋ง๋๋ ํน์ ์ฐ์ฐ์๋ฅผ ๊ตฌํํ์ง ๋ง์ญ์์ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ํด # 1995๋ฅผ ํฌ๊ธฐํ์ง ๋ง์ญ์์ค!
"sigil"์ด๋ผ๋ ๋จ์ด ์ฌ์ฉ์ +10 ์ .
&!
๋ shell
์ "shell"์ด ์ผ๋ฐ์ ์ธ ์์ด ๋จ์ด์ด๋ฏ๋ก ์ฌ๋๋ค์ด shell์ด๋ผ๋ ๊ธฐ์กด ๋ช
๋ น์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์
๋๋ค. (์ฌ์ค "shell"์ด๋ผ๋ ์ด๋ฆ์ ํจ์์ "n"์ด๋ผ๋ ์ด๋ฆ์ ํจ์๊ฐ ๋ชจ๋ ์์ต๋๋ค (๋ฐ๋ผ์ &n
๋ ๋ง์์ ๋ค์ง ์์ต๋๋ค).)
@oising : & --%
๋ ๋ฉ์ง ์ง๋ง , ์ ์ ๋ ๊ธฐ๋ฅ์ ๋ช
์์ ์ธ ๋ชฉ์ ์ค ํ๋๋ |
๊ฐ ๊ธฐ๋ณธ ์๋ก ์ ๋ฌ๋๋ ๋ฌด์ธ๊ฐ๊ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์
๋๋ค. PowerShell ๊ตฌ๋ฌธ ๋ถ์์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ์๋๋๋ค . ๊ทธ๋ฆฌ๊ณ & --%
์ ํ์ดํ ๋ผ์ธ ์ฐ์ ์์๋ฅผ foo $blah --% more args
์ ๋ค๋ฅด๊ฒ ๋ง๋ค๋ฉด ๋นํฉ ์ค๋ฌ์ธ ๊ฒ์
๋๋ค ... & $foo --% more args | blah
ํ๋ค๋ฉด ์ด๋จ๊น์? ๋ฐ๋ผ์ ์ ์๊ฐ์๋ ์ ์ ๋ &!
๋ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ๊ฐ๋ ๊ฒ์ ๋ณด์ฆ ํ ๋งํผ ์ถฉ๋ถํ ๋ค๋ฆ
๋๋ค. (๋ค์ ๋งํด : ์ ์ ๋ ๊ธฐ๋ฅ์ ๊ด๋ จ์ด ์์ง๋ง &
๋ฐ --%
๊ฒฐํฉํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฆ
๋๋ค .)
์ด ๊ธฐ๋ฅ์ "bash๋ฅผ ์๊ณ ์๋ ์ PowerShell ์ฌ์ฉ์"์ "๋ณต์กํ ์ธ์ฉ / ์ด์ค์ผ์ดํ ๊ท์น์ ๋ชจ๋ ๋ชจ๋ฅด๋ ์ฌ์ฉ์"๋ฅผ์ํ ๊ฒ ์ด์์
๋๋ค. ๋ํ ๋ชจ๋ ๊ฒ์ ์กฐ์ ํ ํ์์์ด StackOverflow์์ ๋ช
๋ น์ ๋ณต์ฌ / ๋ถ์ฌ ๋ฃ๊ธฐ ๋งํ๋ ๊ฐ์ฅ ์ ๋ฌธ์ ์ธ ์ฌ์ฉ์๋ฅผ์ํ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋์๊ฒ ๊ฝค ๋ง์ด ๋ฐ์ํฉ๋๋ค. ๋ด๊ฐ ์์
ํ๋ ์ ํ์๋ ์์
๋ฐฉ๋ฒ์ ๋ํ ๋ง์ ๋ฌธ์๊ฐ ์๊ณ ์ธ์ด ํ๋์นด๋ cmd.exe ๋ช
๋ น์
๋๋ค. ๋ฐ๋ผ์ % VARIABLE_REFERENCES % ๋ฑ์ ์์ ํด์ผํฉ๋๋ค. .; &!
๋ฅผ ์
๋ ฅ ํ ๋ค์ ๋ถ์ฌ ๋ฃ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ข์ ๊ฒ์
๋๋ค. ์ค์ ๋ก ์ด๊ฒ์ด ๊ตฌํ ๋ ๊ฒฝ์ฐ "StackOverflow ์ฐ์ฐ์"๋ผ๊ณ ํฉ๋๋ค. :๋
@ vexx32 : ์ด๊ฒ์ "๋ชจ๋๋ฅผ ์ง๋ฐฐํ๋ ํ๋์ ๋ง"ํธ์ถ ๊ตํ ์์ด ์๋๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ๋๊ตฌ ์์์ ๋ ๋ค๋ฅธ ๋๊ตฌ์ ๋๋ค. ์ด ๋๊ตฌ๋ฅผ์ํ ๊ณต๊ฐ์ ๋ง๋ค๊ธฐ ์ํด ๊ธฐ์กด ๋๊ตฌ๋ฅผ ์ ๊ฑฐํด์ผํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ค์ ๋ค๋ฅธ ์ผ์ํฉ๋๋ค. ๋๊ตฌ ์์์ ๋ง์น, ์คํฌ๋ฃจ ๋๋ผ์ด๋ฒ, ๋๋ฆด, ์ํฉํธ ๋๋ฆด, ๋ค์ผ ๊ฑด์ด์์ ๋ ์ ๊ท ์ฌ์ฉ์๊ฐ ์๋ ๊ฐ์ ๋๋ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ฌ๋ฌผ "์ ์ ๋ฌธ๊ฐ์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ชจ๋ ์๋ก ๋ค๋ฅธ ์ํฉ์์ ์ฌ์ฉ๋ฉ๋๋ค.
@TSlivede : # 1995๊ฐ ๋ณ๋๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ง๋ง "Windows ์ ์ฉ ๋ฌธ์ "์ ๋์ํ์ง ์์ต๋๋ค. StackOverflow์์ ํ๋ซํผ ๋ณ ๋ช ๋ น์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ๋ ๊ฒ์ ๋ชจ๋ OS์ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. (์ฌ์ค, ์ด๊ฒ์ ํ ํ๋ซํผ์์ ๋ค๋ฅธ ํ๋ซํผ๋ณด๋ค ๋ ๊ฐํ ์ ์ ๊ฐ์ ๋ง์ ์ฌ๋๋ค์๊ฒ ๋งค์ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ ๋ Windows ๊ธฐ์ ์ ๋ ๋ฅ์ํ๊ธฐ ๋๋ฌธ์ Linux์์ ๋๋ SO์์ ๋ณต์ฌ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ๋ง์ดํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.)
์๋ก์ด ์ฐ์ฐ์ &!
๋๋ Invoke-Shell
๋ช
๋ น์ ํตํด ๋ค๋ฅธ ์ฌ๋๋ค์ฒ๋ผ ๊ฐํ ๊ฐ์ ์ ๋๋ผ์ง ์์ต๋๋ค ... ์ ๋ ์ฐ์ฐ์๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต๋ค๊ณ ๋ถํํ๋ ์ฌ๋๋ค์๊ฒ ๊ณต๊ฐํฉ๋๋ค. ์ ๋ &!
์ ๊ฐ๊ฒฐํจ์ ์ ๋ง ์ข์ํฉ๋๋ค.
@jazzdelightsme ์ด๊ฒ์ "ํ์ฌ ์ด๋ฏธ _okay_์ด๊ณ ๊ฐ์ ๋ ์์๋ ์ฝ 3-5 ๊ฐ์ ์คํฌ๋ฃจ ๋๋ผ์ด๋ฒ๋ฅผ์ํ ๋ ๋ค๋ฅธ ๋ฏฟ์ ์ ์์๋งํผ ๊ตฌ์ฒด์ ์ธ ์คํฌ๋ฃจ ๋๋ผ์ด๋ฒ ๋ถ์ฐฉ"๋งํผ "๋๊ตฌ ์์์ ๋ ๋ค๋ฅธ ๋๊ตฌ"๊ฐ ์๋๋๋ค.
@jazzdelightsme "Windows ์ ์ฉ"๋ถ๋ถ์ ๋ด๊ฐ ์๋ ๊ทธ ์ฑ๋ช ์๋ฅผ ๊ฒ์ ํ ๋ฌธ์ ์ ๋ ๊ด๋ จ์ด์์ ์ ์์ต๋๋ค. ์, ๊ทธ๋ ์ต๋๋ค. ์ด๊ฒ์ ํด๋น ๋ฌธ์ ์ ์ ํํ ์ค๋ณต์ด ์๋๋๋ค.
# 1995๊ฐ ํฌ๊ธฐ๋์ง ์๊ณ ์ฌ๊ธฐ์์ ์์ฒญ ๋ ๊ธฐ๋ฅ์ด ํน์ ๊ตฌ๋ฌธ์ ํตํด ํด๊ฒฐ๋์ง ์๊ณ ์ปค๋งจ๋ ๋ (๋๋์ด ํน์ํ ๊ฒฝ์ฐ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ๊ณณ์์ ์๋ํ๋ ํ ์ค์ ์ฌ๊ธฐ ๋ฌธ์์ด์ ๋ํ ์๋ก์ด ๊ตฌ๋ฌธ)์ ํตํด ํด๊ฒฐ๋๋ฉด ์ค์ ๋ก ์ฐฌ์ฑํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค. (๋๋ "์ฐฌ์ฑ"์ด ์๋๋ผ "๋ด๊ฐ ์ ์ ์ผ๋ก ๋ฐ์ ๋ค์ผ ์์๋ ์ผ")
๋ ๋ค๋ฅธ ์์ด๋์ด : ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ ์ค์ ๋ก ๋ค์ดํฐ๋ธ ์ ธ์ฉ์ผ๋ก ์๋ ๋ ์ ์ฒด ๋ช ๋ น์ ๋ณต์ฌ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ์ ๊ดํ ๊ฒ์ด๋ผ๋ฉด PsReadLine์ ๋ช ๋ น์ ๋๋ต์ ์ผ๋ก bash ๋๋ cmd ์คํ์ผ์์ powershell๋ก ๋ณํํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ๋ณํ์ ํน์ ํค ์กฐํฉ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๊ฑฐ๋ ๋ช ๋ น์ ์คํํ๋ ค๊ณ ํ ๋ ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐ ๋ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ฌ์ฉ์์๊ฒ powershell์ ๊ตฌ๋ฌธ์ ๊ฐ๋ฅด์น๋ ์ถ๊ฐ์ ์ธ ์ด์ ์ด ์์ต๋๋ค.
๊ฒ์ ๊ฐ๋ฅ์ฑ๊ณผ ๊ด๋ จํ์ฌ : PsReadLine์ ๊ตฌ๋ฌธ ์ ์๋ชป๋ ์ฝํ ์ธ (๋ฒ์ญ ํ ์ ํจ ํจ)๋ฅผ ๋ถ์ฌ ๋ฃ์ ๋๋ง๋ค ํน์ ํค ์กฐํฉ์ ์ฌ์ฉํ ์ ์๋ค๋ ๋ฉ์์ง๋ฅผ ํญ์ ์งง์ ์๊ฐ ๋์ ํ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์คํํ๊ธฐ๊ฐ ์กฐ๊ธ ๋ณต์กํ๋ค๋ ๊ฒ์ ์ดํดํ ์์์์ต๋๋ค.
@jazzdelightsme @joeyaiello ์ ์ด์ผ๊ธฐ ํ์ต๋๊น? ๋๋ ๊ทธ๊ฐ ๊ทธ๊ฒ์ StackOverflow operator
๋ผ๊ณ ๋ถ๋ ๋ค๊ณ ์๊ฐํ๋๋ฐ ๊ทธ๊ฒ์ด ๋งค์ฐ ์ฌ์ค ์์๋ ๋ถ๊ตฌํ๊ณ ๋๋ฅผ ์์ฐํ๊ฒ ๋ง๋ค์๋ค
@ SteveL-MSFT ์๋์ ์ ๋ ์ด๊ฒ์ ๋ํด ์๋ฌด์๊ฒ๋ ๋งํ์ง ์์์ต๋๋ค. ๋๋ "StackOverflow operator"์ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ฐฉํ์ต๋๋ค. xD
์๋ ํ์ธ์.
... ์ ์ ๋ ๊ธฐ๋ฅ์ ๋ช ์ ์ ๋ชฉ์ ์ค ํ๋๊ฐ ๋ค์์ ์๋ฏธํ๋ค๋ ์ ์ ์ ์ธํ๊ณ | ๋ค์ดํฐ๋ธ ์ ธ๋ก ์ ๋ฌ๋๋ ๊ฒ์ด๋ฉ๋๋ค. PowerShell ๊ตฌ๋ฌธ ๋ถ์์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ์๋๋๋ค.
์ ์ ์์ ์ดํด ํ์ จ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ด ๋งํ๋ ๊ฒ์ _ ์ ํํ๊ฒ _ ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ๋๋ค. ์ ๋ต์ ์ผ๋ก ๋๋ฌธ์๋ก ๋ ํํธ๋ฅผ ์ข ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค .D
# NON-OPTIMAL SOLUTION: run "ls" in wsl, return results to powershell, then pipe to wsl again, to "grep."
& wsl ls | wsl grep -i "foo"
# NEW SOLUTION: the entire pipeline/string, INCLUDING THE PIPE SYMBOL, right of wsl will be executed in wsl.
& --% wsl ls | grep -i "foo"
# NEW SOLUTION: the entire pipeline AS ABOVE is sent to WSL, then the results are returned to powershell
# and piped, in powershell, to foreach-object
(& --% wsl ls | grep -i "foo") | % { "match {0}" -f $_ }
# NEW SOLUTION: allow placing --% beyond first argument
# pass everything right of --% to the command in $wsl
$wsl = gcm wsl
& $wsl --% ls | grep -i "foo"
# or
& wsl --% ls | grep -i "foo"
# NEW SOLUTION: execute multiline pasted code without powershell parsing.
& --% @'
(pasted multiline code)
@'
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น? ํ์ดํ๊ฐ --%
๋ค์ ๋ํ๋๋ฉด ๊ทธ๊ฒ์ ๋ ๋ค๋ฅธ ๋ฉ์ฒญํ ๋ฌธ์ ์ธ ์ธ์์
๋๋ค. ์ฐ์ฐ์ ์ฐ์ ์์๋ฅผ ๋คํ ์ง ์์ต๋๋ค. ์ค์ฒฉ ๋ ํ์ดํ ๋ผ์ธ ๋๋ ํ์ ์์ ํฌํจ ๋ ๊ฒฝ์ฐ powershell์ ๋ํ ๊ตฌ๋ฌธ ๋ถ์์ ๋ค์ ์์ํฉ๋๋ค.
๋ง์ฝ ๋น์ ์ด & $ foo-% ๋ ๋ง์ args | ์ด์ฉ๊ตฌ?
์, $foo
์์ ์ธ์๋ฅผ ์คํํ๊ณ "more"
, "args"
, "|"
๋ฐ "blah"
์ ์ ๋ฌํ์ฌ $foo
์ํฉ๋๋ค. ๊ท์น์ ๋์๊ฒ ์ถฉ๋ถํ ๊ฐ๋จ ํด ๋ณด์ด์ง๋ง, ์ ๋ ์ค๋ซ๋์ powershell / monad๋ฅผ ์ฌ์ฉํด ์์ต๋๋ค. & $foo --% ...
๋ --%
๋ค๋ฅธ ์ธ์์ฒ๋ผ ์ทจ๊ธํ๋ฏ๋ก ์ด๋ &
๋ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ์ด ์ธ์ฅ์ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์
ํ๊ฒ ์ฌ์ฉํ์ง ์์๋ค๋ฉด ์ฐ๋ฆฌ๋ ์์ ํด์ผํฉ๋๋ค.
์๊ฐ?
๋ถ๋ถ ์ค ํ๊ฐ, ์ฌ๋ฌ ์ค ํ๊ฐ ๋ฐ --%
์ ๋ณ์ ์์น๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ์๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์งํ์ต๋๋ค. ์๋ก์ด์๊ธธ, ์ฐ์ฐ์ ๋๋ ์ด์ํ ๊ตฌ๋ฌธ์ ๋์
ํ์ง ์์๋๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ทธ๊ฒ์ ์ปค๋ฒํ๋ค๊ณ ์๊ฐํ๋ค. ์ ์ผํ ๊ฒ์ : ํ์๊ฐ ๊ทธ๊ฒ์ ์ฒ๋ฆฌ ํ ์ โโ์๋๊ฐ? @lzybkr @JamesWTruher @BrucePay ?
@TSlivede๋ฅผ ๋ฃ๊ณ , ๋ฃ๊ณ .
๋ฌด๋๋ํ ์ ๋ฅผ ์ฉ์ํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํด ์ค๋ซ๋์ ์ด์ผ๊ธฐ ํด ์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ ์ํ๋ ๊ฒ์ ๋ง ๋ฒ์ ์ฌ๊ณ ์ ํด๋นํฉ๋๋ค.
์ด๋ ๋ถ์ดํ๊ณ ๋ณธ์ง์ ์ผ๋ก ๋ฌธ์ ๊ฐ๋๋ "๊ตฌ๋ฌธ ๋ถ์ ์ค์ง ๊ธฐํธ" --%
์ ๊ด๋ จ์ด ์์ต๋๋ค.์ด ๊ธฐํธ๋ ํ์ฌ ํ์์์ _Windows_์์ ์ ํ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค (https://github.com/MicrosoftDocs/PowerShell- ์ฐธ์กฐ). Docs / issues / 6149) ๋ฐ _Unix์ ์ ์ฌํ ํ๋ซํผ _์์๋ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์์ต๋๋ค (https://github.com/MicrosoftDocs/PowerShell-Docs/issues/4963 ์ฐธ์กฐ).
--%
์ (๋) ๊ตฌํ๋์ด์๋ ์๋๋ฉฐ์ด ์ ์๋ ์ ์๋๋๋ก ๊ตฌํ๋์ด์๋ ์๋ฉ๋๋ค.
๋ง ๋ฒ์ ์ฌ๊ณ ๋ ๋ ๊ฐ์ง ์์ด๋์ด๊ฐ ๊ฐ๋ ์ ์ผ๋ก ํผ๋ ๋ ๊ฒ์ ๋๋ค.
(a) " &
๋๋ |
์ ๊ฐ์ ์ ๋ฉํ ๋ฌธ์์ ๋ํด ๊ฑฑ์ ํ ํ์์์ด ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ ๋ ํ ํฐ์ ์ผ๋ถ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ์ฌ ๋ฒ ์ด ์๋๋ฅผ ํ์ฉํ๊ณ ์ถ์ต๋๋ค." - ์ฐธ์กฐ https://github.com/PowerShell/PowerShell/issues/12975#issuecomment -646276628
&&
๋ฐ ||
)์ ๊ฐ์ ๋ช
๋ น์ ์ฌ์ฉํ๊ณ ๋์ผํ ์ค์ ์ถ๊ฐ ๋ช
๋ น์ ๋ฐฐ์นํ๋ ๊ฒ๊ณผ๋ ์์ถฉ๋ฉ๋๋ค. ;
-๊ทธ๋ฆฌ๊ณ ๋ช
๋ น ์ค์์ _PowerShell ๋ณ์ ๋ฐ ์ _์ ์ฌ์ฉํ ์ ์์ต๋๋ค.(b) "๋ด ๋ช
๋ น ์ค์ด _ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์
ธ (๋๋ ๋ช
๋ น ์ค์ด ์๋ ์์ฑ๋ ์
ธ)์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.", ๋ฌผ๋ก _๋ ๋ฐ์ดํ์์ด ๋ฌธ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. &
๋๋ |
์ ๊ฐ์ด ๋ฉํ ๋ฌธ์๋ก ํด์๋์ด _syntactic_ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
cmd
๋ /bin/sh
(๋๋ bash
์ ๊ฐ์ POSIX์ ์ ์ฌํ ์)๋ ls
์ ํต๊ณผํ๋ ๋ฐฉ์์ผ๋ก wsl ls | less
๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค. ls
, |
๋ฐ less
_verbatim_์์ wsl
-๋ชจ๋ _unquoted_ |
๋ฅผ _their_ ํ์ดํ ๊ธฐํธ๋ก ํด์ํฉ๋๋ค.์ด๋ฌํ ์์ด๋์ด๋ ์๋ก ์์ถฉ๋๋ฉฐ ๊ณ ์ ํ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค. ๋ ๊ฐ์ง ๋ชจ๋ ํน๋ณํ ๊ตฌ๋ฌธ ์์ฒด๊ฐ ํ์ํ์ง ์์ต๋๋ค.
(a)์ ๋ํ ํด๊ฒฐ์ฑ ์ ์์ด๋์ด๋ฅผ _abandon_ํ๊ณ ๋์ _PowerShell์ ๊ธฐ์กด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฉํ ๋ฌธ์๊ฐ ์ฌ์ฉ๋๋๋ก _verbatim_-ํญ์ _quoting_ ๋๋ _escaping_์ด ํ์ํฉ๋๋ค.
wsl ls '|' less
`
๋ฒ ์ด ์๋์์ _ ๊ฐ๋ณ์ ์ผ๋ก _ ๋ฉํ ๋ฌธ์ ์ด์ค์ผ์ดํ : wsl ls `| less
$wslArgs = 'ls', '|', 'less'; wsl $wslArgs
"
_ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ํธ์ถ ํ ๋ _-_์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค _ : ์๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.(b)์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ค์ ๋ก _ ๋ด๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ ธ์ ํธ์ถํ์ฌ _ ๋ช ๋ น ์ค์ _ ๋จ์ผ ๋ฌธ์์ด๋ก ์ ๋ฌ _ํ๋ ๊ฒ์ ๋๋ค.
Invoke-Shell
cmdlet์ด ํด๊ฒฐ์ฑ
์
๋๋ค. ์ด๋ฏธ ์ถ์ด ๋ฌธ์์ด ( '...'
๋ํ ๊ตฌ๋ฌธ์ด ์์ต๋๋ค @'<newline>...<newline>'@
Invoke-NativeShell
๋ผ๊ณ ๋ถ๋ฅด๊ณ , Unix์ ๊ฐ์ ํ๋ซํผ์์ bash
์๋๋ผ /bin/sh
๋ฅผ ๋ถ๋ฅด๋ ๊ฒ์
๋๋ค.ins
๋ฅผ ๊ฐ๊ฒฐํ ๋ณ์นญ์ผ๋ก ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.--%
๋ฐ ์ ์์ ํตํด ๋ชจ๋ ๊ฐ๋
์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.Invoke-NativeShell
/ ins
ํธ์ถ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ชจํธํ์ง ์์ PowerShell ๋ฆฌ๋๋ ์
."...."
๋๋ here-string ๋ณํ)์ ์ฌ์ฉํ์ฌ ๋ช
๋ น ์ค์ _PowerShell_ ๋ณ์ ๊ฐ์ ํฌํจ ํ ์ ์์ต๋๋ค ( --%
๋ก๋ ํ ์์๋ ์์
).์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ์์๋์ง ์๋๋ก # 1995๋ฅผ ์์ ํ ์ ์๋ค๊ณ ๊ฒฐ๋ก ์ ๋ด๋ฆฐ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ๋ชจ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ค๋จ๋ฉ๋๋ค. https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -562334606-the ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅํ ํ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์ ํ ๋์์ ๋ํ ์ตํธ ์ธ์ ์ง์ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ผ ํญ์ ๊ทธ๋ฌ์ด ์ผ ํ ๋์์ ์ป๊ธฐ ์ํด ๊ธธ์ ๋ฒ์ด๋์ผํ๋ ๊ณ ํต์ ์ต์ํ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ.
๋ฐ๋ผ์ : &!
์ ๊ฐ์ ํน์ ๊ตฌ๋ฌธ ์ @TSlivede ์ RFC์์ ์ ์ ๋ ๋์์ ๊ธฐ๋ฐ์ผ๋ก # 1995๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์ธ์๋ฅผ ์ ์ ํ๊ฒ ์ ๋ฌํ๊ธฐ์ํ ์ตํธ ์ธ์ผ๋ก ๋ง ์ ๊ณต๋์ด์ผํฉ๋๋ค. https://github.com/PowerShell/PowerShell-RFC/pull/90. ํฅํ PowerShell ๋ฒ์ ์ด ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ค๋จํ๋๋ก ํ์ฉ ๋ ๊ฒฝ์ฐ์ด ๋์์ ๋ํ๋ด์ผํ๋ ๊ฒ์ &
๋ฅผ ์ฌ์ฉํ ์ง์ ํธ์ถ / ํธ์ถ์
๋๋ค.
์ฌ์ฉ์ ๊ด์ ์์ ์ด๊ฒ์ ๋ค์์ ์๋ฏธํฉ๋๋ค. ๋ด๊ฐํด์ผ ํ ์ผ์ _PowerShell's_ ๊ตฌ๋ฌธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ ๊ฒ์ ๋๋ค. https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -640711192
์๋ฅผ ๋ค์ด, ํ์ฌ ์๋ ํ๋๋ก ์๋ํ์ง _ ์๋ _ ๋ค์ ๋ช
๋ น (์ง์ ๋๋ &
ํ์ฌ ํธ์ถ ํ ๋- ์ด ๋ฌธ์ ๋ฌธ์ ์ฐธ์กฐ)
PS> &! bash -c 'echo "one two"'
one two # Currently (invoked with & instead of &! or with neither) prints only 'one',
# because PowerShell passes the entire argument (brokenly) as "echo "one two"",
# which the target program sees as *2* verbatim arguments `echo one` and `two`
ํ์ฌ / ์ด์ PowerShell ๋ฒ์ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์๋ ์ฌ์ฉ์๋ https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -303345059์์ ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ ๊ฐ๋จํ ํจ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค (์ ํ ์ฌํญ์ https : //์์ ๋ ผ์ ๋จ). github.com/PowerShell/PowerShell/issues/1995#issuecomment-649560892) ๋ฐ https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -562334606์์ ๋ ์ ๊ตํ ๋ฒ์
์ถ์ : (์ฌ๋ณผ ๊ธฐ๋ฐ๋ฟ๋ง ์๋๋ผ) ์ฐ์ฐ์์ ๋ฐ๊ฒฌ ๋ฌธ์ ๋ ๊ทธ ์์ฒด๋ก ํด๊ฒฐํ ๊ฐ์น๊ฐ์๋ ๋ณ๋์ ๋ฌธ์ ์
๋๋ค. ํด๊ฒฐ์ฑ
์ ์ฐ์ฐ์ ์กฐํ๋ฅผ ํ์ฉํ๋๋ก Get-Help
๋ฅผ _ ๊ฐํํ๋ ๊ฒ์
๋๋ค _-# 11339๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์์ ์๋ฃจ์
์ ๋ํ ๋งํฌ.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ์์๋์ง ์๋๋ก # 1995๋ฅผ ์์ ํ ์ ์๋ค๊ณ ๊ฒฐ๋ก ์ ๋ด๋ฆฐ ๊ถํ์ด ์๊ธฐ ๋๋ฌธ์-๊ฒฐ๊ตญ ๊ธฐ์กด์ ๋ชจ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ค๋จ๋ฉ๋๋ค. # 1995 (์ฃผ์) ์ฐธ์กฐ-์ฐ๋ฆฌ๊ฐ ํ ์์๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํ์ ์ง์ํ๋ ๊ฒ์ ๋๋ค. ๊ฐ๋ฅํ ํ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ ์ ํ ๋์์ ์ํํ์ฌ ํญ์ ๊ธฐ๋ณธ๊ฐ์ด์ด์ผํ๋ ๋์์ ์ป๊ธฐ ์ํด ๊ธธ์ ๋ฒ์ด๋์ผํ๋ ๊ณ ํต์ ์ต์ํํฉ๋๋ค.
@ mklement0 ์ตํธ ์ธ์ด https://github.com/PowerShell/PowerShell/issues/1995 ์ ์ผ๋ถ์์ผ๋ฉฐ ๊ฑฐ๋ถ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ๋์๊ฒ๋ ํฌ๋ง์ฐฌ ์๊ฐ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋ด๊ฐ ์๋ชป?
@AndrewSav , ์ฐ๋ฆฌ๋ ์๋ ๊ตฌ์ฑ ๋๋ ํ๊ฒฝ ์ค์ ๋ณ์๋ฅผ ํตํ ์ตํธ ์ธ์ ๋ํด์๋ง ๋ ผ์ํ์ต๋๋ค.
๊ทธ๋ฌ๋ @joeyaiello ๋ https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -653164987์์ ๋ฌธ์ ๋ฅผ ์ข ๊ฒฐ ํ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ต๋๋ค (๊ฐ์กฐ ์ถ๊ฐ๋จ).
์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ง์ง๋ ๋ชจ๋ ๊ฒ์ ํ๊ดด์ ์ธ ๋ณํ์ ์ง๋์ง ์์ผ๋ฏ๋ก ์๋ก์ด ์ด์์๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
์๋ก์ด ์ฐ์ฐ์๋ ์ผ์ข ์ ์ตํธ ์ธ์ด์ง๋ง ๋ฌธ์ ๊ฐ์๋ ์ฐ์ฐ์์ ๋๋ค (ํ์ํ ๊ฒ์ ์ํ๊น์ง๋ง ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๋๊ฐ์ ๋๋ค).
์ด ์ ์์ # 1995๋ ํด๊ฒฐํ๋ค๊ณ ์๋ ค์ ธ ์์ง๋ง (์ฃผ๋ก) _other_ shell์ ๊ตฌ๋ฌธ์ ์์ฉํ๋ ๊ฒ์ ๋ชฉํ๋กํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ ๋ฌธ์ ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ํด๊ฒฐํ ๊ฐ์น๊ฐ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ๋ด ์ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ ์ฐ์ฐ์๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.ํ์ง๋ง # 1995๋ฅผ ์์ (https://github.com/PowerShell/PowerShell-RFC/pull/90์ ํตํด)ํ๋ ๋ฐ๋ง ์ฌ์ฉํฉ๋๋ค. ์ฆ, PowerShell์ _own_ (non-other-shell-emulating) ์ค๋ฅ๋ฅผ ์์ ํฉ๋๋ค. ์ธ๋ถ ํ๋ก๊ทธ๋จ์ผ๋ก ์ ๋ฌ๋๋ ์ธ์ ์ฒ๋ฆฌ.
&
๋์ &!
(๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฒฐ์ ํ ํ์)์ ํญ์ ์ฌ์ฉํด์ผํฉ๋๋ค (์ธ๋ถ ํ๋ก๊ทธ๋จ์ ๋ํด &
๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์์). .&!
๋ &
์ฒ๋ผ ์๋ํด์ผํฉ๋๋ค (๋ฌธ์ ๊ฐ ์์ ์). ๋ฐ๋ผ์ &!
์ผ๊ด๋๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.๋ค๋ฅธ ์
ธ์์ ๋ช
๋ น ์ค ์ฌ์ฌ์ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋ซํผ์ ์ ํฉํ ๊ธฐ๋ณธ ์
ธ (Windows์์ cmd /c
์ ํธ์ถํ๋ Invoke-NativeShell
/ ins
cmdlet์ ๊ตฌํํ๊ฒ ์ต๋๋ค. , /bin/sh -c
Unix ๊ณ์ด ํ๋ซํผ์ ๊ฒฝ์ฐ)) _single string_๋ก ์ ๋ฌ ๋ ๋ช
๋ น ์ค์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ๋ช
๋ น ์ค์ '
๊ฐ ์์ผ๋ฉด ์ผ๋ฐ ์์ ๋ฐ์ดํ ๋ฌธ์์ด์ด ์๋ํฉ๋๋ค. ์ :
ins 'ls | ๊ณ ์์ด -n '
'
์์ผ๋ฉด _doubled_; ์ :
ins '์์ฝ'์๋ ํ์ธ์ '| ๊ณ ์์ด -n '
๋๋ ๋ช ๋ น ์ค์ ์ ํ ๊ฑด๋๋ฆฌ์ง ์์ผ๋ ค๋ ๊ฒฝ์ฐ here-string์ ์ฌ์ฉํ ์ ์์ต๋๋ค (์ด๋ฏธ @TSlivede์ ํ์๋จ).์ด ๊ตฌ๋ฌธ์ ์กฐ๊ธ ๋ ๋ฒ๊ฑฐ๋กญ์ง ๋ง ํญ์ ์๋ํด์ผํฉ๋๋ค.
ins @ '
์์ฝ '์๋
'| ๊ณ ์์ด -n
'@
๋ํ _expandable_ (๋ณด๊ฐ) ๋ฌธ์์ด ( "..."
๋๋ @"<newline>...<newline>"@
)์ ์ฌ์ฉํ์ฌ _PowerShell_ ๋ณ์๋ฅผ ๊ธฐ๋ณธ ์
ธ์ ์ ๋ฌ ๋ ๋ฌธ์์ด ( --%
๋ ์ง์ํ์ง ์์) :
$ foo = '์๋
'
@ "
์์ฝ '$ foo'| ๊ณ ์์ด -n
"@
๋ ธํธ :
Invoke-NativeShell
cmdlet์ cmd /c
/ /bin/sh -c
ํธ์ถ์ ๋ํ ์๋นํ ์์ ๋ํผ๋ก, ์ง์ ์ง์ ๋ง๋ค ์ ์์ง๋ง ๊ทธ๋ด ํ์๊ฐ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค. ํน์ ์คํ ํ์ผ ์ด๋ฆ๊ณผ ๋ช
๋ น ์ค ์ ๋ฌ ๊ตฌ๋ฌธ์ ์๊ณ ์์ด์ผํฉ๋๋ค.-OutVariable
์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ -Error*
๋งค๊ฐ ๋ณ์๊ฐ _stderr_์์ ์๋ํ๋๋กํ ์ง ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค (๋์นญ์ ๊ฒฝ์ฐ Invoke-Command
๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์ด๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์
๋๋ค.)-c
ํ์ฌ _multiple_ ์ธ์๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์-์คํํ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ์ฒซ ๋ฒ์งธ ์ฝ๋์ $0
(!)๋ก ์์ํ๋ ํด๋น ์ฝ๋์ ์ ๋ฌํ ์ธ์๋ฅผ ํ์ํ๋ ์ธ์-์ : bash -c 'echo $@' _ 1 2 3
-์ ํ์ ์ถ๊ฐ ์ธ์๋ ์ง์๋์ด์ผํฉ๋๋ค.cmd
๋ฐ sh
๊ฐ์ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ก ์ธํด ์ ์์ ๋ฐ๋ผ _not_ ์ด์ ๊ฐ๋ฅํฉ๋๋ค.์ด๊ฒ์ด PowerShell์ _own_ argument-passing (# 1995)์ ์์ ํ๋ ๊ฒ์ด ์ค์ํ ์ด์ ์
๋๋ค. ๊ทธ๋ฌ๋ฉด ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ํธ์ถํ๋ ์ ๋ขฐํ ์ ์๊ณ ์ง์ ํ ํฌ๋ก์ค ํ๋ซํผ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค.ํผ์ฆ์ ๋ง์ง๋ง ์กฐ๊ฐ์ _documentation_์ ๋๋ค.
https://github.com/MicrosoftDocs/PowerShell-Docs/issues/5152 ๋ ๋จ์ผ ์์น์์ ์ธ๋ถ ํ๋ก๊ทธ๋จ ํธ์ถ (์ : about_Native_Calls
)์ ๋ํ ๊ฐ๋
์ ๋์๋ง ํญ๋ชฉ์ ์์ฑํ๊ธฐ์ํ ์ค๋ ์ ์์
๋๋ค. ์ธ๋ถ ํ๋ก๊ทธ๋จ ํธ์ถ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ธก๋ฉด์ ๋ค๋ฃน๋๋ค. ์ด๋ฏธ ๋ค๋ฃฌ ๋ด์ฉ (์ถ๊ฐ ๋ฉํ ๋ฌธ์๋ก ์ธํ ๊ตฌ๋ฌธ์ ํจ์ , ์์ ๋ฐ์ดํธ ํ์ดํ ๋ผ์ธ ๋ถ์ฌ, PowerShell ์ค๋ฅ ์ฒ๋ฆฌ์์ ๋น ํตํฉ ๋ฑ) ์ธ์๋ ๋น๋ฉดํ ๋ฌธ์ ๋ ๋
ผ์ํด์ผํฉ๋๋ค.
ํฌํจ ๋ "
(๋ฐ _empty_ ์ธ์)๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด ์ด์ ๋ฒ์ (๊ณง ์ถ์ ๋ ์์ )์์ ๋ถ๋ฆฌ๋๋ ๋ฐฉ์ (ํ์ฌ ๋ณ๋์ ์ ์ https://github.com/MicrosoftDocs/PowerShell-Docs์์ ๋
ผ์ ๋จ) / issues / 2361) ๋ฐ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ (์๋ \
# 1995์ ๋์ฐ๋ฏธ ํจ์ ์ค ํ๋๋ฅผ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋๋ ์ฌ์ฉ,์ด ์ค ํ๋๋ ์ฃผ์ ์ ์ง์ ํฌํจ ํ ์์์๋งํผ ๊ฐ๊ฒฐํจ).
์ ์ ํ ์ธ์ ์ ๋ฌ์ ๋ณด์ฅํ๊ธฐ ์ํด ํฅํ ๋ค์ดํฐ๋ธ (์ธ๋ถ) ์คํ ํ์ผ์ ํธ์ถํ๋ ๋ฐ &!
์ฌ์ฉํด์ผํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
Invoke-NativeShell
/ ins
์ (๋ฅผ) ์ฌ์ฉํ์ฌ _ ํ๋ซํผ ๊ณ ์ ์
ธ์ฉ์ผ๋ก ์์ฑ๋ ๋ช
๋ น ์ค์์๋ ๊ทธ๋๋ก _ ์คํํ ์ ์์ต๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ ์ค๋๋ ์ฌ์ฉ์๋ ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ์ด ์ ํ ๋ช ํํ์ง ์์ต๋๋ค.
๊นจ์ง ๋์์ ์์ ํ ํ ์ฌ์ฉ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๊ฒ๋ฉ๋๋ค.
์์ด ping 127.0.0.1
๋ฅผ ์คํํ๋ ๊ฒ์ด ๋๋ฌด ๋ง์ง ์์ต๋๊น?
์, @iSazonov๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ์ ์ฃผ์ ๊ด์ฌ์ฌ์ ๋๋ค. ์ด๋ฏธ ํผ๋์ค๋ฝ๊ณ ๋์์ด๋์ง ์์ต๋๋ค. ๋ฌธ์ํ๋ ํผ์ฆ์ ์ผ๋ถ์ผ๋ฟ์ ๋๋ค. ๊ด์ฐฎ์ ๋ฌธ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋๋ผ๋ _5 ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ _์ด ์๋ค๋ ์ฌ์ค๋ง์ผ๋ก๋ ๊ฐ๊ฐ ์กฐ๊ธ์ฉ ๋ค๋ฅด๊ฒ ํ๋ํ๋ ๊ฒ์ ํญ์ ํผ๋์ ์ผ๊ธฐ ํ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ UX์ ๋ํด ์ ํ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ ๋ง์ ๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ๊ธฐ์กด ์ฌ๋ก๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ์ ํํด์ผํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ UX์ ๋ํด ์ ํ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๋ ๋ง์ ๊ฒ์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ๊ธฐ์กด ์ฌ๋ก๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ์ ํํด์ผํฉ๋๋ค.
์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ด์ผํ๋ฏ๋ก ํ ์ ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋น๋น ๋๊ณ ์๋ค๊ณ ๋๋๋๋ค. https://github.com/PowerShell/PowerShell/issues/1995 ๋ ๋ฐ๋ก ๊ทธ ์ด์ ๋๋ฌธ์ ํ์๋์์ต๋๋ค.
@iSazonov :
์๋ก์ด ์ด์์๋ฅผ ๋์ ํ์ง ์๋๋ผ๋ ๊ธฐ์กด์ ์ง์นจ ๋ถ์กฑ์ ํด๊ฒฐํด์ผํฉ๋๋ค.
์ ์ ๋ about_Native_Calls
์ฃผ์ ๋ฅผ ํตํด ํฌ๊ด์ ์ผ๋ก
ํนํ Start-Process
ํญ๋ชฉ์์ ์ฌ์ฉ์ด ์ ์ ํ์๊ธฐ์ ๋ํ ์ง์นจ์ด ํ์ฌ ๋ถ์กฑํฉ๋๋ค. https://github.com/MicrosoftDocs/PowerShell-Docs/issues/6239 ์ฐธ์กฐ
๊ฐ๋จํ ์์ฝํ๋ฉด :
_console_ (ํฐ๋ฏธ๋) ํ๋ก๊ทธ๋จ์ ํธ์ถํ๋ ๋ฐ Start-Process
๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค (Windows์์๋ง ์ฌ์ฉํ ์์๋ ํ๋ก๊ทธ๋จ์ _ ์ ์ฐฝ์์ ์คํํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ธ).
&
๋ฅผ ํตํ ์ง์ ํธ์ถ ๋ฐ ํธ์ถ์ _equivalent_์
๋๋ค. (์คํฌ๋ฆฝํธ ๋ธ๋ก์ ์ ์ณ๋๊ณ ), &
๋ ๋ช
๋ น ์ด๋ฆ ๋๋ ๊ฒฝ๋ก๊ฐ _quoted_์ด๊ฑฐ๋ _variable references_๋ฅผ ํฌํจ ํ ๋๋ง๋ค _syntactic_ ์ด์ ๋ก ๋ง ํ์ํฉ๋๋ค.
๊นจ์ง ๋์์ ์์ ํ ํ ์ฌ์ฉ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ๊ฒ๋ฉ๋๋ค.
์ง์ ํธ์ถ
- & ์ด์์
- ์์ ํ๋ก์ธ์ค
- &! ์ด์์
- ์์ -ProcessV2
์๋, ์์ ๊ฒ Start-ProcessV2
, ๋จ์ง _new parameter_, -IndividualArguments
์ฐธ์กฐ - https://github.com/PowerShell/PowerShell/issues/5576#issuecomment -552124719
์, &!
(๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฒฐ์ ํ ๋ชจ๋ ๊ธฐํธ)๊ฐ ์์ง๋ง ์ค์ ๋ก _ &
๋ฐ ์ง์ ํธ์ถ _์ ๋ชจ๋ ๋์ฒดํฉ๋๋ค (์ ์ด๋ _ ์ธ๋ถ ํ๋ก๊ทธ๋จ _์ ๊ฒฝ์ฐ _,ํ์ง๋ง ์ฌ์ฉํ ์ ์์). _all_ ๋ช
๋ น ํ์)-ํต์ ํ๊ธฐ ์ฌ์์ผํฉ๋๋ค.
์์ด
ping 127.0.0.1
๋ฅผ ์คํํ๊ธฐ์ ๋๋ฌด ๋ง์ง ์์ต๋๊น?
ping 127.0.0.1
์ (๋) ๊ณ์ ์๋ํ์ง๋ง bash -c 'echo "one two"'
๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํด์ผํฉ๋๋ค.
&! bash -c 'echo "one two"'
๊ทธ๊ฒ์ ๋ถํํ ์ผ์ด์ง๋ง-์ง์ ํธ์ถ / &
๋์ _ ์์ ํ ์ ์์ _์ ๊ฐ์ํ ๋-๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋คํํ๋ ์ธ์ฐ๋ ๊ฒ์ ๊ฐ๋จํ ๊ท์น์
๋๋ค. _ ์์ธก ๊ฐ๋ฅํ ์ธ์๊ฐ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ๋๊ธฐ๋ฅผ ์ํ๋ค๋ฉด &!
_
์ ํ์ ๋์ฒด ํ์-๊ตฌ์ฑ ( powershell.config.json
) ๋๋ ํ๊ฒฝ ์ค์ ๋ณ์-ํจ์ฌ ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ค์ ๋ณ์์ ๋์ ๋ฒ์ ์ง์ ์ ์๋ํ์ง ์๊ฒ ์ค๊ณ๋์ง ์์ ๋ ๊ฑฐ์ ์ฝ๋์ ์ตํธ ์ธ์ ์ ์ฉํ๋ ๊ฒ์ ๋๋ฌด ์ฝ๊ฒ ๋ง๋ญ๋๋ค. https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -650262164 ์ฐธ์กฐ
๊ตฌ์ฑ์ ์ธ์ ์ ์ฒด์ ์ ์ฉ๋๋ฏ๋ก ์ตํธ ์์์ด ์์ ํ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ ๊ฒฝ์ฐ ๋ชจ๋ ํน์ ํธ์ถ๊ณผ _ ๋ถ๋ฆฌ ๋ _ ์กฐ์น๊ฐ ํ์ํ๋ฉฐ, ์ฃผ์ด์ง ํธ์ถ์ ๋ณด๋ฉด ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋์ํ ์ง ์๋ ค์ฃผ์ง ์์ต๋๋ค. ๋ฐ๋ฉด์ &!
๋ ์ด๋ค ๋์์ด ๋ฐ์ํ ์ง ์์ฌ ํ ์ฌ์ง๊ฐ ์์ต๋๋ค.
์ต์ข ์ฌ์ฉ์์๊ฒ๋ ๊ณ์ฐ๊ธฐ๋ฅผ ์์ํ๊ณ ์ถ๊ฐ ์์ ์์ํ 5 ๊ฐ์ ๋ฒํผ์ ์ฐพ์ ๊ฒ์ฒ๋ผ ๋์ฐํด ๋ณด์ ๋๋ค. ๐
์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฌํ ํฉ๋ณ์ฆ์ ๋๋นํ ์์์ ์ ๋๋ก ๊ฐ์ ํ๊ณ ์ถ๋ค๋ฉด, ์๋ง๋ ์ด๊ฒ์ ๋์์ ๋จ์ํํ๊ณ V8.0์ ๋ฆด๋ฆฌ์คํ๊ธฐ ์ํด ๋ธ๋ ์ดํน ์ฒด์ธ์ง (์ง์ ํธ์ถ ๋ฐ &
)๋ฅผ ์์ฉํ๊ธฐ์ ์ถฉ๋ถํ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ์ ์๊ตฌ๊ฐ ๊ทธ๋ค์ง ๊ฐํ์ง ์๋ค๋ฉด, testargs
ํ๋ก๊ทธ๋จ์ด ํ์ํ๋ ๋ด์ฉ๊ณผ ๋ฐฉ๋ฒ์ ๋ํ ๊ถ์ฅ ์ฌํญ์ ํ์ํ๋๋ก ์ง๋จ ( prog.exe param1 param2 -Whatif
๋ฐ Start-Process -WhatIf์ ๋ํด์๋ ๋์ผ)์ ์ถฉ๋ถํ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ด์ค์ผ์ดํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํฉ๋๋ค.
์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ ๋๋ฒ๊ฑฐ๋ฅผ ํ ์คํธํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ์๊ฐ์ ํ ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ํ ํ ์ธ์ ์์๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋จ์์ฑ, ๊ฐ๊ฒฐ์ฑ ๋ฐ ๋ช ํ์ฑ์ ์ํ๋ฉฐ ์ด๊ฒ์ด ๋ชจ๋ ๊ฒ๋ณด๋ค ์ค์ํฉ๋๋ค.
@iSazonov :
๊ทธ๋ฌ๋ฉด ์๋ง๋ ์ด๊ฒ์ ๋์์ ๋จ์ํํ๊ณ V8.0์ ๋ฆด๋ฆฌ์คํ๊ธฐ ์ํด ๋ธ๋ ์ดํน ๋ณ๊ฒฝ (์ง์ ํธ์ถ ๋ฐ &)์ ์์ฉํ๊ธฐ์ ์ถฉ๋ถํ ๊ฒ์ ๋๋ค.
๋น์ ์ ํ์คํ _my_ ํฌํ๊ถ์ ๊ฐ์ง๊ณ ์์ง๋ง,์ด ๊ณํ์์ง์งํ๋ ํ์ด ์์ต๋๊น? [_update_-# 13129 ์ฐธ์กฐ]
์ด ์ ๋์ ๋ณํ๋ฅผ ๊ฐ์ ธ ์ค๋ฉด ๋ง์นจ๋ด ๋ชจ๋ ๊ณผ๊ฑฐ์ ์ง์ ๋ค๋ฃฐ ์ ์์ต๋๋ค. # 6745 ์ฐธ์กฐ
๊ทธํ ๋ก ๊ฐ์ ํ๊ณ ์ถ๋ค๋ฉด
๊ทธ๋ ๊ฒ ๋ง์ด ์ํ๋ ๋ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
# 1995, ๋ง์ ๊ด๋ จ ๋ฌธ์ ๋ฐ ์๋ง์ ์คํ ์ค๋ฒํ๋ก ์ง๋ฌธ์ ์ํด ์ ์ฆ ๋ ๋ฐ์ ๊ฐ์ด ์๋ชป๋ ์ธ์ ํต๊ณผ๋ก ์ธํ ์๋ ๊ฐ์ ๊ณ ํต์ ๋๋ด๊ธฐ ์ํด.
์ด์ ์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ๋ฏ์ด ์ธ์๋ก ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ํธ์ถํ๋ ๊ฒ์ ๋ชจ๋ shell_์ _core ๋ช ๋ น์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ญ์ฌ์ ์ผ๋ก Windows ์ ์ฉ ์์ ์๋ ๊ฐ๋ฅํ ์ธ๋ถ CLI๊ฐ ๋ถ์กฑํ์ฌ ์ ๋๋ก ํธ์ถ ํ ์ ์๊ฒ๋์๊ณ , PowerShell์ ๋ฒฝ์ผ๋ก ๋๋ฌ์ธ์ธ ์ ์ (PowerShell ๋ค์ดํฐ๋ธ ๋ช ๋ น ๋ง ํธ์ถ)์ ๋จธ๋ฌผ๋ ๋ ์ฌ์ฉ์๋ ๊ณ ํต์ ๋๋ผ์ง ๋ชปํ์ต๋๋ค. ํ์ง๋ง ์๊ฐ์ ๋ณํ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ฐ๋ฐ, CI ๋ฐ ๋ฐฐํฌ ์์
์ ์ค์ํ ๋ค์ํ ํฌ๋ก์ค ํ๋ซํผ CLI ์๋์ ์ด๊ณ ์์ต๋๋ค.
PowerShell์ ์
ธ๋ก ์ฌ๊ฐํ๊ฒ ๋ฐ์๋ค์ด๋ ค๋ฉด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นฐ ์์๋ v8.0์ด ๋ฐ์ํ๋๋ผ๋ (์๊ฐ๋ฝ์ด ๊ต์ฐจ๋จ) ๋ฆด๋ฆฌ์ค๊ฐ ์ค๋ ๊ฑธ๋ฆด ์ ์์ผ๋ฉฐ ์์ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค.
๋ฌธ์์ ๋ํด ์ ์ ๋ ๊ฐ์ ์ฌํญ์ด ํ์ํ๋งํผ, ์ฝ๊ฒ ์ฌ์ฉํ ์์๋ ๋ฐํ์ ์๋ฃจ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ๋ค๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๊ณ ํต์ ๋์ด ์ค ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ฐ์ฐ์๋ ๋ชป ์๊ฒผ์ง ๋ง ํ์์ด ์ด๋ป๋ ๊ฐ์ _necessitates_ ์ถ๊ฐ ๊ตฌ๋ฌธ (ํ์ดํ์ด ๋ ๋ง์)์ด ์๋ ๋นํ๊ดด ์๋ฃจ์ ์ ๋๋ค.
๋ณด๊ธฐ ํํ๊ณ ์
๋ ฅํ๊ธฐ ์ฌ์ฐ ๋ฉฐ ์ธ์ด๋ฅผ "์ค์ผ"ํ์ง ์๋ &!
์ ๋์์ iep
ํจ์์ ๊ฐ์ ๊ฐ๊ฒฐํ ์ด๋ฆ์ผ๋ก ๋ด์ฅ _function_์ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. ( I nvoke- E xternal P rogram) ์ฌ๊ธฐ ์ ํ์๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ์ํ
(์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ค๋ฅธ ๊ธฐ๋ฅ (์ : pause
)์ ๋ํํ๊ฑฐ๋ cmd.exe
์ฌ์ฉ์ (์ : cd..
[sic])๋ฅผ ์์ฉํ๋ ํจ์๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.)
๋ฐ๋ผ์ bash -c 'echo "one two"'
๊ฐ ์ ๋๋ก ์๋ํ๋๋กํ๋ ค๋ฉด iep bash -c 'echo "one two"'
ํธ์ถํฉ๋๋ค.
๋๋๋ณด๋ค ํ์ค์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด :
# Pass JSON to an external utility (Unix example)
# Without `iep`, the embedded double quotes are lost and *broken JSON* is passed.
iep /bin/echo '{ "foo": "bar" }'
๋ค์ ๋งํ์ง๋ง, ์ฐ๋ฆฌ๋ ๊ถ๊ทน์ ์ผ๋ก ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ์ํ ์๋น์ค์์ _compromise_์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ์ต์ข ์ฌ์ฉ์์๊ฒ ํ์ฐ์ ์ผ๋ก ์ฑ๊ฐ์ ์ผ์ ๋๋ค.
์ง๋จ (prog.exe param1 param2 -Whatif ๋ฐ Start-Process -WhatIf์ ๊ฒฝ์ฐ ๋์ผ)์ ๊ฐ์ ํ์ฌ testargs ํ๋ก๊ทธ๋จ์ด ํ์ํ๋ ๊ฒ๊ณผ ์ด์ค์ผ์ดํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ถ์ฅ ์ฌํญ์ ํ์ํฉ๋๋ค.
์ง์ / &
๊ธฐ๋ฐ ํธ์ถ์ cmdlet ํธ์ถ์ด ์๋๊ณ ๋ชจ๋ ์ธ์๊ฐ ํต๊ณผ ์ธ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฏ๋ก -WhatIf
๋ฅผ ๊ณตํต ๋งค๊ฐ ๋ณ์๋ก ์ทจ๊ธํ๋ ๊ฒ์ ์ฃผ์ ๋ณ๊ฒฝ์ ํด๋นํฉ๋๋ค (ํ์ง๋ง ์ค์ ๋ก).
๊ทธ๋ฌํ ๋ณ๊ฒฝ์ ๊ธฐ๊บผ์ด ๋ฐ์๋ค์ด๊ณ ์ถ๋ค๋ฉด, ์ฐ๋ฆฌ๋ (๋ํ) -DoItRight
์ค์์น (๋๋ --%
์ ์ ์ฌํ ๊ธฐํธ ๊ธฐ๋ฐ ์ค์์น)๋ฅผ ์ตํธ ์ธ์ผ๋ก ์ง์ํ ์ ์์ต๋๋ค. ๊ณ ์ ๋ ํ๋-๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ iep
-prefix / &!
์ ๊ทผ ๋ฐฉ์๋ณด๋ค ๋ ๋์๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
(๋ด ์๊ฐ์ ๊นจ์ง์ง ์๋ ์ง๋จ ์ต์
์ ํ์ฌ -WhatIf
์ง์ํ์ง ์๋ Invoke-Command
์ ํฅ์์ํค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฌธ์ํ ๋ ์ตํธ ์ธ์ ์ ๊ณตํ๋ค๋ฉด ํ๋, ๋๋ ์ด๊ฒ์ด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.)
์ ๋ @iSazonov์ ๋์ํฉ๋๋ค. ์ํฉ์ด ์๋ํด์ผํ๋ ์์
์ ์ํํ๊ธฐ์ํ ๋ ๋ค๋ฅธ ์ผ์ ์๊ฐํ๋ ๊ฒ์ด ์ด์์ ์ด์ง ์์ง๋ง @ mklement0์์ ์ธ๊ธํ๋ฏ์ด ์ ๋๋ก ์์ ๋๋ ๋ธ๋ ์ดํน ๋ฆด๋ฆฌ์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋งค์ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ฐ๋ฆฌ ์ค ๋ง์ ์ฌ๋๋ค์ ์ต๋ํ ๋นจ๋ฆฌ ํด๊ฒฐ์ฑ
์ด ์ ์คํ ํ์ํฉ๋๋ค. ๋ด๊ฐ ๋ณผ ์ ์๋ฏ์ด ํ์ฌ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ
์
https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -562334606 ๋ง๋์?
@ mklement0 cmdlet์ ์ฐ๋ฆฌ๊ฐ ์์ ํ๋ ค๋ ๊ฒ๊ณผ ๋์ผํ ๋งค๊ฐ ๋ณ์์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ iep / invoke-external ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ์๋ ํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ํ์ ๋ฌธ์ ์ ๋๋ค. cmdlet / ํจ์ ๋ด์์ ๋ชจ๋ ๊ฒ์ ์จ๊ธฐ๋ ค๊ณ ํ๋ค๋ฉด, ๋ญ๊ฐ๊ฑฐ๋ ์ฌ๊ตฌ์ฑ ์๋๋ฅผ ์ทจ์ํด์ผํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์์ฒญ๋๊ฒ ๋ณต์ก ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋๋ฉด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ต๋๊น?
@oising :
๋ช
ํํ๊ฒํ๋ ค๋ฉด ๋ค์ ๋งํฌ iep
๊ธฐ๋ฅ (๋ด๊ฐ _not_ ๊ฐ์น๋ฅผ ์ถ๊ตฌํด ์๊ฐ # 1995, _this_ ์ ์์ ์ฃผ๋ก์ ๋ํด ๊ทธ๋ ์ง ์์ ๊ฒ์ ์์ ์์ ์ฃผ์ฅ๋๋ก ), ๋น๋ก ์์
์ด์ต์์ด๋ค์ ์๋ ์ธ๊ธ ํ ๊ฒ์ ๋ฉ๋ชจ๋ฅผ ํ _also_ ํด๊ฒฐ # 1995.
PowerShell์ ์์ฒด ๊ตฌ๋ฌธ ๋ถ์์ ๊ด์ฐฎ์ผ๋ฉฐ _PowerShell_ ๋ช ๋ น์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋์กฐ์ ์ผ๋ก, _external ํ๋ก๊ทธ๋จ _์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ์ฌํ๊ฒ ์์๋์์ผ๋ฉฐ, ์ด๊ฒ์ด iep
์์ ์ฌํญ์
๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช
๋ น ์ค์ด ๊ตฌ์ฑ ๋ ๋ _ ์ฅ๋ฉด ๋ค์์ _ ์ธ์์ _ ๋ค์ ์ธ์ฉ ๋ฐ ์ด์ค์ผ์ดํ _ ๊ฒฐํจ์ผ๋ก ์ธํด ์์๋์์ต๋๋ค.
https://github.com/PowerShell/PowerShell-RFC/pull/90 ์ ์ ์ ํ ์์ ์ฌํญ์ ์ ์ํฉ๋๋ค (์ญ ํธํ์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฉ์๊ฐ์๊ณ ์์ง ๋ต๋ณ๋์ง ์์ ๋ช ๊ฐ์ง ์ฌ์ํ ์ง๋ฌธ์ด ์์). ์ต๊ทผ์ System.Diagnostics.ProcessStartInfo.ArgumentList
๋ฅผ ๋์
ํ์ฌ ์ ์ ํ ์ฌ ์ธ์ฉ ๋ฐ ์ด์ค์ผ์ดํ๋ฅผ ์ํํฉ๋๋ค (PowerShell์ ์์ฒด ๊ตฌ๋ฌธ ๋ถ์์์ ์์ฑ ๋ ์ธ์ ๋ชจ์ ๋ง ์ ๋ฌํฉ๋๋ค). ๋ถ์์ ์ผ๋ก _on Windows_์์๋ง ํ์ํฉ๋๋ค. Unix์์๋ ํ๋ก์ธ์ค ์์์ ์ธ์๋ฅผ ์ ๋ฌํ ๋ _ ๋ช
๋ น ์ค์ด ์์ต๋๋ค _ (์ ์ธ๋ถ) : ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๊ทธ๋๋ก ์ ๋ฌํฉ๋๋ค.
์์ปจ๋ :
iep
๋ฅผ ๋ด์ฅ ํจ์๋ก ์ ๊ณตํ๋ ๊ฒ์ ์ ์ ํ ์์ (์ค๋จ ๋ณ๊ฒฝ์ ๋งฅ๋ฝ์์)์ด ๊ตฌํ ๋ ์์์ ๋๊น์ง ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์ ์ ํ ์ธ์๋ฅผ ์ ๋ฌํ๊ธฐ์ํ ๊ฐ๋จํ ์์ ์ต์
์
๋๋ค.
Invoke-NativeShell
( ins
) cmdlet์ _its_ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ _ ๋ค๋ฅธ ์
ธ _ (๋ค์ดํฐ๋ธ ์
ธ์) ๋ช
๋ น ์ค์ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ์์ ๋ฐฉํธ์ด ์๋ ์ ์ ํ ์๋ฃจ์
์
๋๋ค. ์ ์ฐธ์กฐ .
ํ์ฌ, PERL ๋ช ๋ น์ ์๋ผ๋ด์ด ๋ถ์ฌ ๋ฃ๊ธฐ๊ฐ Python์์ ์์๋๋ก ์คํ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆผ์ ์ด๋. ์ด๊ฒ์ ๋ชจ๋ ์ ๋จ๊ธฐ์ ๋ถ์ฌ ๋ฃ๊ธฐ์ ํฐ ๋จ์ ์ด ๋ ๊ฒ์ ๋๋ค. ํ์ด์ฌ์๋์ด๋ฅผ์ํ ํน๋ณํ ์ฐ์ฐ์๊ฐ ์์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ์ ์์ ์ดํด ํ์ จ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ด ๋งํ๋ ๊ฒ์ _ ์ ํํ๊ฒ _ ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ๋๋ค. ์ ๋ต์ ์ผ๋ก ๋๋ฌธ์๋ก ๋ ํํธ๋ฅผ ์ข ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค .D
# NEW SOLUTION: the entire pipeline AS ABOVE is sent to WSL, then the results are returned to powershell
# and piped, in powershell, to foreach-object
(& --% wsl ls | grep -i "foo") | % { "match {0}" -f $_ }
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น? ํ์ดํ๊ฐ
--%
๋ค์ ๋ํ๋๋ฉด ๊ทธ๊ฒ์ ๋ ๋ค๋ฅธ ๋ฉ์ฒญํ ๋ฌธ์ ์ธ ์ธ์์ ๋๋ค. ์ฐ์ฐ์ ์ฐ์ ์์๋ฅผ ๋คํ ์ง ์์ต๋๋ค. ์ค์ฒฉ ๋ ํ์ดํ ๋ผ์ธ ๋๋ ํ์ ์์ ํฌํจ ๋ ๊ฒฝ์ฐ powershell์ ๋ํ ๊ตฌ๋ฌธ ๋ถ์์ ๋ค์ ์์ํฉ๋๋ค.
์๊ฐ?
๋น์ ์ด ๋์น ๊ฒ์ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ๋ํ ์ธ์๋ก ๋ซ๋ ๊ดํธ๋ฅผ ์ ๋ฌํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ธ DWIM ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง PowerShell์ HAL์ด ์๋๋๋ค.
๋ชจ๋ ์์ธํ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฌ๊ธฐ์ ๋ ์์ ์ผ๋ก ๋งํ๊ณ ์์ต๋๋ค. ํต์ฌ ๋ด์ฉ์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ ๋ช ๊ฐ์ง ์ค์ํ ์ ์ ์๋ ค๋๋ฆฝ๋๋ค.
์ด์ ๋ด๊ฐ ์ฝ์ ์ฝ๋ฉํธ :
#!
( &!
๋๋ $!
์ค ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ํต์ญ์ฌ๋ฅผ ์ง์ ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์์)์ ๋ง์ถ๋ ค๋ ์ ์ ๋ ์๊ตฌ์ ๋ํด์ฃผ์ํฉ๋๋ค. . $! net <stuff>
์ ๊ฐ์ ์์
์ํ๊ณ ์ถ๋ค๋ฉด net.exe
๋ ๋ด ์ธํฐํ๋ฆฌํฐ๊ฐ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ Windows๊ฐ ์๋ ๊ฒฝ์ฐ "๋ค์ดํฐ๋ธ"์์
์ ์ฌ์ ํ โโsh / bash / whatever ์ด์ ์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค. ์ง ์กด์ฌ์ ์คํ์ ์ ๋ฌํฉ๋๋ค. ์ ๋ด๊ฐ ํ์ด์ฌ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์์ผ๋ ค๋ *.py
๋ฌธ์์ด์ $! /usr/bin/python *.py
๋๋ $! python *.py
๋ด๊ฐ ๋ฐฐ์ฌ๋ ์์ ๋ค์ ๊ธ ๋ก๋นํ๊ณ ์ถ์ง. python
์ ์ผ์นํ๋ ๋ชฉ๋ก.--%
๋ฅผ ์ ํธํฉ๋๋ค. ๊ฒ์ ๊ฐ๋ฅ์ฑ์ด ๋ฌธ์ ์ด๋ฉฐ, ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ 10 ๋
๋์์ด ๊ฒ์ ๊ฐ๋ฅ์ฑ์ ์ฐ๊ตฌํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ( ์ง๊ธ์ Google์ด ๊ฐ๋ฅํฉ๋๋ค! , ๊ทธ๋ฅ ๊ทธ๋ ๊ฒํ๊ฒ ์ต๋๋ค. (์ ๋ @ SteveL-MSFT๋ฅผ ๋ง๋ ์ฌ๋์ด์์ต๋๋ค.) ๋์ฒด ๊ณ ๋ ค ์ฌํญ์ผ๋ก ๊ทธ์ ์ ์์ ๋ฃ์ต๋๋ค.)ํ์ง๋ง ์ง๋ฌธ : ์ฌ๊ธฐ์ &
ํธ์ถ ์ฐ์ฐ์๋ ํ์ํฉ๋๊น? --% native.exe do /some $stuff
์ค์ ์์ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?--%
๋์์ผ๋ก ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝํ์ง ๋ง์์ผํฉ๋๋ค.ํ์ง๋ง "์๋ก ๋ง๋ค๊ธฐ"๋ฅผ ์ํ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์ "์ด ์คํ ํ์ผ ์์ ์ค๋ ์์น์ ํจ๊ป ํ์๋ฉ๋๋ค.@jazzdelightsme ์์
๋ํ ๋ชจ๋ ๊ฒ์ ์กฐ์ ํ ํ์์์ด StackOverflow์์ ๋ช ๋ น์ ๋ณต์ฌ / ๋ถ์ฌ ๋ฃ๊ธฐ ๋งํ๋ ๊ฐ์ฅ ์ ๋ฌธ์ ์ธ ์ฌ์ฉ์๋ฅผ์ํ ๊ฒ์ ๋๋ค.
์ ์๊ฐ์ ์ด๊ฒ์ ์๋๋ฆฌ์ค์ ๊ฑฐ๋ํ ์ธก๋ฉด์ด๋ฉฐ ์๋ง๋ ๊ฐ์ฅ ํฐ ๊ฒ์ ๋๋ค. ๋น์ ์ด Bash์ ๊ฐ์ ์์ ์๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ์น ์ฃผ๋ณ์ ๋ฌธ์์ ๋๋ค.
๋๊ธ์ ๊ฒํ ํ ๋ ์์ง ๋ต๋ณํด์ผ ํ ๋ ๊ฐ์ง ์ง๋ฌธ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
--%
์ข์ํฉ๋๋ค. ์๋ํ๋ฉด ์ด๋ฏธ "์์ ์ฒ๋ผํ๋ ์ผ์ํ์ธ์"์ฐ์ฐ์๋ก ๋ช
์ฑ์ ์ป์ ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์๋ก์ด ๊ฒ์ ๋ฐ๊ฒฌ ํ ์ ์๋๋ก ์ฌ์ค์ ํด์ผ ํ ๊ฒ์
๋๋ค. ๋๋ @ mklement0 ๊ณผ ๊ฐ์ ์ฃผ์ฅ์ ์ดํดํ๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ด๋ ๊ฒํ๋ฉด --%
์ ๊ธฐ์ ์ ์๋ฏธ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์
๋๋ค (๊ทธ๋ฆฌ๊ณ @ SteveL-MSFT๋ ๋์๊ฒ์ด ์ฃผ์ฅ์ํ์ต๋๋ค).ํ์ง๋ง ์ ๋ ์๊ฐํ์ง ์์ต๋๋ค. ์ผ์์์๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ "cmd์์ํ๋ ์์
์ ์ํํฉ๋๋ค"๋ผ๋ ๊ด์ ์์ --%
๋ฅผ ์๊ฐํ๊ณ ์์ต๋๋ค. ๋๋์ด ๊ฐ์ ์ "๋ค์ดํฐ๋ธ ์์ด ์ฌ๊ธฐ์์ํ๋ ์ผ์ํ๋ค"๋ผ๊ณ ์ฐ์ฐ์์ ์ ์์ ์ฑ๋ฌธํํ๋ ๊ฒ์ ๋ฌด๋ฆฌ๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค.์ง๊ต ์ ์ผ๋ก, ์ฐ๋ฆฌ๊ฐ ์ง์ํ ์๋ ์๊ณ ์ํ์ง ์์ ์๋์๋ ๋ ๋ค๋ฅธ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํ์ต๋๋ค.
Windows์์ cmd๋ (ํจ๊ณผ์ ์ผ๋ก) PATH
์กฐํ์ ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค. ๊ทธ๋ฌ๋ PowerShell์์๋ ํ์ฌ ๋๋ ํฐ๋ฆฌ๊ฐ PATH
์๋ ๊ฒฝ์ฐ EXE (๋๋ PATHEXT
๋ชจ๋ ํญ๋ชฉ)๋ฅผ ์คํํ๊ธฐ ์ํด ์ฌ์ฉ์๊ฐ ./
๋ฅผ ๋ฏธ๋ฆฌ ์ถ๊ฐํด์ผํฉ๋๋ค.
๊ทธ๋์ ๋ด ์ด๋ฆฐ ์ง๋ฌธ์ : ์ค์ ๋ก ์ ์ฒด ๋ช
๋ น ๋ฌธ์์ด์ cmd์ ์ ๋ฌํ๊ณ ์ถ์ต๋๊น? ์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์ฌ / ๋ถ์ฌ ๋ฃ๊ธฐ ์๋๋ฆฌ์ค๋ฅผ ๋ฐ๊ฒํ๋ ค๋ฉด ๋๋ต์ ์๋ผ๊ณ ์ ์ํฉ๋๋ค. ์ผ๋ถ ํ์ฌ ๋ฌธ์ / ํํ ๋ฆฌ์ผ์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์ํ๋ ๋๊ตฌ๋ฅผ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋์ ์์ธํ ์ค๋ช
ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. PATH
. ๊ทธ๊ฒ์ ์๋ง ๋ง์ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ค์ํ์ง ์์ต๋๋ค,ํ์ง๋ง ๋ ์ฌ๊ธฐ ์ด๊ฑฐ ํ ์ํ๋ค.
- ๋๋ ์ฌ์ ํ ์์ ํ ์๋ก์ด ๊ฒ์ ๊นจ๊ธฐ๋ก ๊ฒฐ์ ํ vNext / 8.0์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค.
์, ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๊ฐ ์์ฒญ๋๊ฒ ์ด๋ ค์ด ๋ฐฉ์์ผ๋ก ์ค๋จํ์ง ์๊ณ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ ๋ ์ฌ๋ฌ๋ถ์ ๋ํด ์ ๋ชจ๋ฅด์ง๋ง ์ฌ๋ฌ ๋ฒ์ ์ ์์ฑํ ๋ ์ด๋ฌํ ๋ณต์กํ ๋ฐ์ธ๋ / ํ์ ์ฐจ์ด์ ์ ๋ชจ๋ ๋ค๋ฃจ๊ณ ์ถ์ง๋ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๋ ๊ฒ์ ๋ฐ๋ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ฌ๋๋ค์์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ITT์์๋ ์ฌ๋๋ค์๊ฒ๋ ๋ค๋ฃจ์ด์ผ ํ PITA ์ผ ๊ฒ์ ๋๋ค.
- @oising์ด ์ ์ํ ๊ฒ์ฒ๋ผ
--%
๋ฅผ ์ ํธํ๋ฉฐ ์ ๋ฉด์ ์ฌ์ฉํ๊ธฐ ์ํด ์ค๋ฒ๋ก๋๋์์ต๋๋ค. (...)--% native.exe do /some $stuff
์ค์ ์์ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋๋ ์ด๊ฒ์ ์ ๋ง๋ก ์ข์ํ๋ค. ์ด์์ ์ผ๋ก๋ CreateProcess
/ exec
ํธ์ถ์ ์ต๋ํ ๊ฐ๊น์ต๋๋ค (nix env var ์ฒ๋ฆฌ ๋ฐ ์ธ / ์์ ๋ฆฌ๋๋ ์
๋๋ ์ฝ์ ์ฐ๊ฒฐ ํฌํจ). ๋๋ cmd.exe
/ bash
์์ ํ ๋์๊ฐ ์๋ ์์ต๋๋ค.
๋๋ --%
์์ &
์ (๋ฅผ) ์ ์งํ๋ ๊ฒ์ ์ง์ฐฉํ์ง ์์ต๋๋ค. ๋๋ ์ ์ด๋ ๋ด ๋จธ๋ฆฌ ์์ ์ง์์ / ์ฐ์ฐ์์ฒ๋ผ ์์ --%
๋ฅผ ์ทจ๊ธํ๋ค๋ ์๊ฐ์ ์ ๋นํ ํ ์์๋ค. ์ฌ๋ฌ ์ค์ ์ด๋ป์ต๋๊น? --%
๋ฅผ @"
๋ฐ "@
์ ํจ๊ป var ๋์ฒด ๋ฐ ํ์ ํํ์์ ์ฌ์ฉํ๊ณ ์์ ๋ฐ์ดํ @'
๋ฐ '@
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌํฐ๋ด์ ์ ๋ฌํ ์ ์์ต๋๊น? ์ฌ๊ธฐ์ ๋ฌธ์์ด์ด ์์ผ๋ฉด ํ ์ค๋ฟ์
๋๊น?
@oising์ด ์ ์ํ ๊ฒ์ฒ๋ผ ์ด์์๋ก์-%๋ฅผ ์ ํธํฉ๋๋ค.
๋๋ฅผ ์ํด ์๋ํฉ๋๋ค.
ํ์ง๋ง ์ง๋ฌธ : ์ฌ๊ธฐ์ & call ์ฐ์ฐ์๋ ํ์ํฉ๋๊น?
--% & $computedPathToNativeExe foo;@workspace
ํ ๊ด์ฐฎ์ต๋๋ค. ์ด๊ฒ๊ณผ ํจ๊ป ํธ์ถ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค.
ํ์ฌ๋ ํ ์์๋ ์ผ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ ๊ทธ๋๋ก ๋ค์ดํฐ๋ธ ์์ ์ ๋ฌํด์ผํ๋ค๊ณ ๋งํฉ๋๋ค.
๋์ํฉ๋๋ค.
์ด ๊ฐ์ ์ ์ฐ์ฐ์์ (-%) ์ ์์ "๋ค์ดํฐ๋ธ ์์ด ์ฌ๊ธฐ์์ํ๋ ์ผ์ํ๋ค"๋ก ์ฑ๋ฌธํํ๋ ๊ฒ์ ๋ฌด๋ฆฌ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ํ ๋์ํ์ต๋๋ค!
๋ํ ์ด๊ฒ์ ์คํ ํ์ผ์ ์ธ์ ์ ๋ํด์๋ง ์ ์ ๋ ์คํ ํ์ผ ์์ env vars๋ฅผ ์ ์ํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ ธ ์ค๋ ๋ฐฉ๋ฒ ์ผ ์ ์์ต๋๋ค (# 3316) :
--% JEKYLL_ENV=production jekyll build
๊ทธ๋ฅ ์๊ฐ.
@rkeithhill , call native operator
์ ์์ด๋์ด๋ ๋ผ์ธ์ด PowerShell์ ์ํด ์ฒ๋ฆฌ๋์ง ์๊ณ OS์ "๊ธฐ๋ณธ ์
ธ"์ ๊ทธ๋๋ก ์ ์ก๋๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์์ด ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์์ --% & $computerPathToNativeExe foo;@workspace
๋ ์๋ํ์ง ์์ต๋๋ค. ํ์ฌ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์ ์ ํ๊ฒ ์ด์ค์ผ์ดํํด์ผํฉ๋๋ค. ๋ ๋ฒ์งธ ๊ฒฝ์ฐ --% JEKYLL_ENV=productoin jekyll build
๋ ์๋ํฉ๋๋ค.
์ด ๋ผ์ธ์ PowerShell์ ์ํด ์ฒ๋ฆฌ๋์ง ์๊ณ ๊ทธ๋๋ก OS์ "๊ธฐ๋ณธ ์ ธ"๋ก ์ ์ก๋ฉ๋๋ค.
์ข์ต๋๋ค. ๊ทธ๊ฒ ํฉ๋ฆฌ์ ์
๋๋ค. ๊ทธ๋ฌ๋์ด --% JEKYLL_ENV=productoin jekyll build
์ Linux / macOS์์๋ง ์๋ํ์ง๋ง Windows์์๋ ์๋ํ์ง ์์ต๋๋ค. ์ ์ด๋ PowerShell์ ๋์ ์์ด๋ ์๋ํ์ง ์์ต๋๊น?
@rkeithhill ์ ํ์ฌ ์ ์ ๋๋๋ก OS "๊ธฐ๋ณธ"์ ธ์ ์์กดํ๋ฏ๋ก Windows์์๋ ์๋ํ์ง ์์ต๋๋ค. ํ๋ก์ธ์ค์ ๋ํด env var๋ฅผ ์ ์ธํ๋ PowerShell์ ๊ฒฝ์ฐ์ด๋ฅผ ๋ ผ์ํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์ด๋ ธ์ต๋๋ค.
@ PowerShell / powershell-committee๊ฐ ์ค๋์ด ๋ฌธ์ ๋ฅผ ๋
ผ์ํ์ผ๋ฉฐ, ๊ทธ ๋
ผ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ๊ธฐ ์ํด ์๋ ์ ์์ ์
๋ฐ์ดํธํ์ต๋๋ค. ์คํ์ ์ธ ๊ธฐ๋ฅ ๊ตฌํ์ ์งํํ๊ณ ์์
์ฝ๋๊ฐ์๋ ์ฌ์ฉ์๋ก๋ถํฐ ๋ ๋ง์ ํผ๋๋ฐฑ์๋ฐ์ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ ํ ์ด์์๋ฅผ ์ํด์๊ธธ์ ์ด๊ณ ์์ง๋ง ์ง๊ธ์ --%
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฌ๊ธฐ์
$foo
๋ ๋ฆฌํฐ๋ด ํ์ผ ์ด๋ฆ์ด๊ณ$PWD
๋ WSL ๋ด์ ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์์ ์์&&
๋ฅผ ์ด์ค์ผ์ดํํด์ผ PowerShell์ด โโ์๋ WSL ๋ด์์ ์คํ๋๋๋ก ํ ์ ์์ต๋๋ค.
$foo
๋ฐ $PWD
๋ชจ๋ sh
ํ๊ฐํ ๋ณ์ ์ฐธ์กฐ์
๋๋ค.
์ด๋ฌํ ์คํ์ ์ถ๋ ฅ์ ๋ค์ PowerShell๋ก ํ์ดํํ๋ ค๋ฉด ์ฌ์ฉ์๋ ๋จผ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ์ ์ฅํด์ผํฉ๋๋ค.
$out = --% ls *.txt
$out | select-string hello
ํ์ฌ
&
ํธ์ถ ์ฐ์ฐ์์ ๋ฌ๋ฆฌ PowerShell ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ค์์ ์ฐธ๊ณ ํ์ธ์.
--% $commandline
$commandline
๋ฌธ์ ๊ทธ๋๋ก ( cmd
) ๋๋ ์ ํ์ฅ ํ ( sh
์๋) ์คํํ๋ ค๊ณ ์๋ํฉ๋๋ค. PowerShell์ ํด๋น ๋ณ์๋ฅผ ํ์ธํ์ง ์์ต๋๋ค.
์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ ๋ฌธ์ ๋
&n
์ ์ ๋ ฅ ํ ํ ๋ถ์ฌ ๋ฃ๊ธฐ ๋งํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.
--%
๋ค์ ๋ถ์ฌ ๋ฃ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค.
wsl
๋ํ ์์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ ๊ฒ?
--%
์ดํ์ ๋ชจ๋ ์ธ์๊ฐ "default"์ ธ๋ก ์ ๋ฌ๋๋ฏ๋ก PowerShell ๋ก์ ํ์ดํ ๋ผ์ด๋์ ์ง์ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ณ์๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
์ด๊ฒ์ ๋ฐ๋ณต์ ๋๋ค.
์ ์ฉํ ๊ฒ์ ์ถ๊ฐํ๋ ค๋ฉด ํผ๋ฒ์ ์ ์ํฉ๋๋ค.
์ ์ฐ๋ฆฌ๋ herestring Literal๊ณผ ๊ฐ์ ๊ฒ์ ๊ฐ์ง ์ ์์ต๋๋ค.
@! ""! @
๋ฐ๋ผ์ ์์ฒด ๋ฌธ์ ๊ฐ์๋-% ๋์ ์ด ์์ ์ ์ํํ๋ ์ค์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ ๊ฒํ๋ฉด "๋ ๋์"๋์์ธ ์ ๋ต์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ฃ์ง ์ผ์ด์ค๊ฐ ํด๊ฒฐ๋์ด์ผํ๋ About_Strings์ ์์น ํ ์ ์์ต๋๋ค.
๊ทธ๋ฅ ์๊ฐ.
@!"โฆ"!@
์ด Invoke-NativeShell @"โฆ"@
๋ณด๋ค ๋ ๋์ ๋ฐฉ๋ฒ์ ๋ณด์ง ๋ชปํ์ต๋๋ค. PowerShell์ ์ข ๋ Brainfuck์ฒ๋ผ ๋ง๋ค๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์์ต๋๊น?
๋ฟก ๋นต๋จ
@!"โฆ"!@
์ดInvoke-NativeShell @"โฆ"@
๋ณด๋ค ๋ ๋์ ๋ฐฉ๋ฒ์ ๋ณด์ง ๋ชปํ์ต๋๋ค. PowerShell์ ์ข ๋ Brainfuck์ฒ๋ผ ๋ง๋ค๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๊น?
๋๋ @ romero126 ์ด ํ ์ค์ herestring ๋ฆฌํฐ๋ด์ ์ ์
Invoke-NativeShell @!"complicated native command with "quotes" and | pipe"!@
๋์ ์
Invoke-NativeShell @"
complicated native command with "quotes" and | pipe
"@
์ด๋ฌํ ํ ์ค์ง๋ฆฌ herestring์ ๊ณ ๋ คํ ๊ฒฝ์ฐ @"""โฆ"""@
๋ฐ @'''โฆ'''@
์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. IMO๋ @!"โฆ"!@
๋ณด๋ค ์
๋ ฅํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
@ romero126 ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ช ํํ ํ ์ ์์ต๋๊น?
@ yecril71pl ์ค๋ฅ๋ฅผ ์ก์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
--%
๊ฐ ๋ช
๋ น ์ค ๋๋ ๋ฐฐ์น ํ์ผ๋ก ์คํ๋๋์ง ์ฌ๋ถ๋ ์ง์ ๋์ง ์์ต๋๋ค.
๋๋ @ romero126 ์ด ํ ์ค์ herestring ๋ฆฌํฐ๋ด์ ์ ์
Invoke-NativeShell @!"complicated native command with "quotes" and | pipe"!@
๋์ ์
Invoke-NativeShell @" complicated native command with "quotes" and | pipe "@
์ด๋ฌํ ํ ์ค์ herestring์ ๊ณ ๋ คํ ๊ฒฝ์ฐ
@"""โฆ"""@
๋ฐ@'''โฆ'''@
์ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.@!"โฆ"!@
๋ณด๋ค IMO ์ ๋ ฅ์ด ๋ ์ฝ์ต๋๋ค.@ romero126 ๋น์ ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ช ํํ ํ ์ ์์ต๋๊น?
๊ตฌ๋ฌธ ๋ถ์๋์ง ์์ "๊ฑฐ์ ์์"๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Strings์ ์ ์ฐ์ฑ์ ์ถ๊ฐํ๋ฉด์ด ํ์
์ ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@TSlivede ๋๋ ๋น์ ์ด ๋งํ ๊ฒ์ ๊ฑฐ์ ์์ ํ ๋์ํฉ๋๋ค. ์ฝ๊ฐ์ ์ฐจ์ด ๋ง ์์ต๋๋ค. ๋ฐ์ดํ ์์ ์๋ฌด๊ฒ๋ ์ฝ์
ํ์ง ์๊ณ ๋จ์ผ ํ๊ณผ ์ฌ๋ฌ ํ์ ๋ชจ๋ ์ฒ๋ฆฌ ํ ์ โโ์์ด์ผํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒํ๊ธฐ ์ํด ์ด๋ค ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ์ ๋ ์ด๋ ค ์์ต๋๋ค. ์ฝ์
ํธ์ ๋ ์ง์คํ๊ณ ์์ต๋๋ค ..
์ด ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ "Invoke-NativeShell"์ด ํ์์๋ ๋ง์ ์ ์ฐ์ฑ์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ฆ, ๋ฌธ์์ด์ฒ๋ผ ์์ ๋กญ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ด ์ ์ฌ์ ์ผ๋ก ๋ฉ์ง ๋ชจ์ต์ ์คํ ์ดํ์ด ๋ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ํผ๋ฒ์ ๋ํ ์ฐ๋ฆฌ๊ฐ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌ ํ ์์์ ๋ ๊ฑฐ์ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ฐํด๋ฅผ ๋๋ฆฌ๋ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋น ๋ฅธ ์ :
# For this scenario let @!"<text>"!@ be our HereString Verbatim
Invoke-NativeShell @!"complicated native command with "quotes" and | pipe"!@
# or
Invoke-NativeShell @!"
Complicated native command with "quotes" and pipe and <tabs>
"!@
#or
$r = @!"
complicated native command with custom arguments: {0}
"!@ -format "foo"
Invoke-NativeShell $r
์ด ์ฃผ์ ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์์ @ mklement0์ด ๋ค๋ฃจ๋ ๋ฌธ์ ๋ ๋ค๋ฃจ์ง ์์ต๋๋ค. ๋ฌธ์ ์ ์ฌ์ค์ ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ์ปด ๋๋์๊ฒ ๋จ์ผ ๋ฌธ์์ด์ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ง์ ๊ฒฝ์ฐ์ ๊ทธ๋ค์ ๋ถ๋ฆฌ๋์ด์ผํฉ๋๋ค.
๊ตฌ๋ฌธ ๋ถ์๋์ง ์์ "๊ฑฐ์ ์์"๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Strings์ ์ ์ฐ์ฑ์ ์ถ๊ฐํ๋ฉด์ด ํ์ ์ ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด '
๋ฐ @'
์ ๋ชฉ์ ์
๋๋ค.
์ด ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ "Invoke-NativeShell"์ด ํ์์๋ ๋ง์ ์ ์ฐ์ฑ์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ฆ, ๋ฌธ์์ด์ฒ๋ผ ์์ ๋กญ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ด ์ ์ฌ์ ์ผ๋ก ๋ฉ์ง ๋ชจ์ต์ ์คํ ์ดํ์ด ๋ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ๋ช
๋ น์ ๋ฌธ์์ด ์ํ์ค๋ฅผ ๋ฐํํฉ๋๋ค. @!"
์ ์ดํดํ ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์คํ
์ดํ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๊ตฌ๋ฌธ ๋ถ์๋์ง ์์ "๊ฑฐ์ ์์"๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Strings์ ์ ์ฐ์ฑ์ ์ถ๊ฐํ๋ฉด์ด ํ์ ์ ๋ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด
'
๋ฐ@'
์ ๋ชฉ์ ์ ๋๋ค.์ด ์์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ "Invoke-NativeShell"์ด ํ์์๋ ๋ง์ ์ ์ฐ์ฑ์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ฆ, ๋ฌธ์์ด์ฒ๋ผ ์์ ๋กญ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ด ์ ์ฌ์ ์ผ๋ก ๋ฉ์ง ๋ชจ์ต์ ์คํ ์ดํ์ด ๋ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ๋ช ๋ น์ ๋ฌธ์์ด ์ํ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
@!"
์ ์ดํดํ ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์คํ ์ดํ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋๋ ๋น์ ์ด ํผ๋์ค๋ฌ์ํ๋ ๊ฒ ๊ฐ์์. ๋ด๊ฐ ๋งํ ์์ ์ผ๋ก.
์์ ๋ฐ์ดํ์ ํฐ ๋ฐ์ดํ๋ $ variable ๋ง ํ์ฅํ๊ฑฐ๋ ํ์ฅํ์ง ์์ต๋๋ค. ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์ด์ค์ผ์ดํํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ์ ๋ฅผ ์ ํํ์ฌ ๋ ์ด์ ์ ์์ ์ธ ์ฑ๊ฒฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋์ ์ ์ง๊ธ์ฒ๋ผ ์ ๋๋ก ์๋ํฉ๋๋ค. ๋๋ ์ฌ์ ํ &!๋ฅผ ํฌํจํด์ผํ๋ ์ด์ ์ ์ ์ฒด ์์ ์ธ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํด์ผํฉ๋๋ค. ๋ช
๋ น.
๋ ๋์ ํด๊ฒฐ์ฑ ์ด ์๋ค๋ฉด ๋๋ ๋ชจ๋ ๊ท์ ๋๋ค. ๋๋ ์ด๊ฒ์ด &๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฒฝ์ฐ์ ๋ง๋ค๊ณ ์๊ฐํฉ๋๋ค!
์์ ๋ฐ์ดํ์ ํฐ ๋ฐ์ดํ๋ $ variable ๋ง ํ์ฅํ๊ฑฐ๋ ํ์ฅํ์ง ์์ต๋๋ค. ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์ด์ค์ผ์ดํํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ์ ๋ฅผ ์ ํํ์ฌ ๋ ์ด์ ์ ์์ ์ธ ์ฑ๊ฒฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋์ ๋์ ์ ์ง๊ธ์ฒ๋ผ ์ ๋๋ก ์๋ํฉ๋๋ค. ๋๋ ์ฌ์ ํ &!๋ฅผ ํฌํจํด์ผํ๋ ์ด์ ์ ์ ์ฒด ์์ ์ธ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํด์ผํฉ๋๋ค. ๋ช ๋ น.
์ด๋ค ์บ๋ฆญํฐ๋ฅผ ํ์ถํด์ผํ๋ฉฐ ๊ทธ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@ romero126 ์ด์ ๋ฌด์จ ๋ง์ํ๋์ง ํผ๋ ์ค๋ฝ์ต๋๋ค. powershell ์ here ๋ฌธ์์ด์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๊น?
๋๋ ์ด์ ์ ์ฌ๊ธฐ์์ powershells์ ๊ตฌ๋ฌธ์ด ์ฑ๊ฐ์ ๋ฌธ์์ด์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง (์ ์ด๋ ๋๋ก๋ ์ฒ์๊ณผ ๋ ๋ถ๋ถ์ ์ค ๋ฐ๊ฟ์ด ์์ด์ผํ๋ค๋ ์ ์์ ์ง์ฆ์ด๋ฉ๋๋ค ...) ์ง๊ธ์ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ ๋ถ๋ช ํ ๋งํ ์ ์์ต๋๊น?
@TSlivede , ์ฌ๊ธฐ ๋ฌธ์์ด์ด ๊ตฌ๋ฌธ ์ ์ผ๋ก ๋ค์ ๋ฒ๊ฑฐ ๋กญ๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค.
๊ฐ์ ์ ์ ์ํ๋ ๊ธฐ์กด ์ ์ # 2337์ด ์์ผ๋ฉฐ ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ๋ค์ฌ ์ฐ๋ ๋ฐ ์ด์ ์ ๋ง์ถ๊ณ ์์ง๋ง @lzybkr ์ https : // github ์์ Rust์ ์ ์ฌํ _single-line _ (-also) ๋ณํ์ ์ ์ํฉ๋๋ค
# `ins` is `Invoke-NativeShell`
ins @' python -c 'print("hi")' | cat -n '@
ํ์์ ๋ฐ๋ผ _multiple_ '
์ @
๋ฅผ ๊ฒฐํฉํ์ฌ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋ฅผ ํผํ ์ ์์ต๋๋ค (์ : @'' can use @' here ''@
.
์ฆ, ์ด๊ฒ์ PowerShell ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ํ ์ผ๋ฐ์ ์ธ ๊ฐ์ ์ฌํญ์ด๋ฉฐ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ Invoke-NativeShell
์์๋ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
# 2337์ด ์ฃผ๋ก ๋ค๋ฅธ ๊ฒ์ ์ด์ ์ ๋ง์ถ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ # 13204์์ ์ด์ ์ ๋ง์ถ ์ ์์ ์์ฑํ์ผ๋ฉฐ ๊ฑฐ๊ธฐ์ ๋ํ๋ฅผ ๊ณ์ํ ๊ฒ์ ์ ์ํฉ๋๋ค.
ํ์ถ์ ํ์์ฑ์ ํผํ ์ ์์ต๋๋ค.
์ด ์ค๋ ๋์์ ์ด๊ฒ์ ๋ช ๋ฒ ๋ดค์ต๋๋ค.
์ ๋ชจ๋๋ฅผ ์์ํ๊ธฐ ์ํด ํ ํฌ ๋์ด์ ์ ๋ํ ๋ชจ๋ ์ธ๋์ผ์ดํฐ์๋ ์ด์ค์ผ์ดํ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค. ํด๋น ๋ชจ๋๋ฅผ ๋ ๋๋ ํ ํฌ ๋์ด์ ์ ๋ํ ์ธ๋์ผ์ดํฐ๋ฅผ ํด๋น ๋ฌธ์์ ๋ฌธ์ ํ์๊ณผ ๊ตฌ๋ณํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค๋๋ ๊ฐ์ฅ ์์ฐ์ค๋ฌ์ด ํํ๋ ์์ ๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด์ ๋๋ค.
'
: ์์ ๋ฐ์ดํ ํ ํฐ ํ ์์'
: ์์ ๋ฐ์ดํ ํ ํฐ ํ ์ข
๋ฃ''
: ์์ ๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ๋ด์ ๋ฆฌํฐ๋ด ์์ ๋ฐ์ดํ๋ฅผ ์์ฑํฉ๋๋ค.์ด์๋ ๋ถ๊ตฌํ๊ณ ํ์ถ์ ๋ํด ์ด์ผ๊ธฐํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
--%
์ฐ์ฐ์๋ ๋ชจ๋๋ฅผ ์ข
๋ฃํ๋ ๋๋ฌด ๋ง์ ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ( |
, &&
, ||
, ;
, ์ค ๋ฐ๊ฟ) ๋ฌธ์์ด์ ํ์ฉํฉ๋๋ค. ๊ทธ ์์ ( '
๋ฌธ์ ์ ๊ฑฐ)์คํ ๊ฐ๋ฅํ ํธ์ถ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ค๋ ๊ฒ์ ์ค์ ๋ก ๋ฐฐ์ด ๊ตฌ๋ฌธ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
(์ด๊ฒ์ * nix์ ๊ธฐ๋ณธ ๊ฐ๋
์
๋๋ค. exec
๋ ๋ฐฐ์ด์ ์์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. Windows์์๋ ๋ฐฐ์ด์ ๊ฐ์ ธ ์์ ํน์ ๋ฌธ์์ด ๊ตฌ๋ฌธ์ผ๋ก ์ง๋ ฌํํ๊ณ CommandLineToArgvW
ํตํด ์ ๋ฌํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฆ, ๋ ๊ฐ์ ์ด์ค์ผ์ดํ๊ฐ ํ์ํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
--%
๋ช
๋ น์ด ์ ์ถ์ด ๊ตฌ๋ฌธ์ด๋๊ธฐ ์ ;
์๋ง๋?
์๋ง๋?์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
;
๋๋ ๊ฐํ ๋ฌธ์๋ฅผ ์ด๋ป๊ฒ ์ ๋ฌํฉ๋๊น?
๋ฆฌํฐ๋ด์ ์ด๋ป๊ฒ ์ ๋ฌํฉ๋๊น?๊ธฐ๋ณธ ๋ช ๋ น ์ค์ ๋ฐฐ์ด์ด ์๋๋๋ค. ๋ฌธ์์ด ๋๋ AST์ ๋๋ค. PowerShell์ ๋ค์ดํฐ๋ธ ์ ธ์ AST์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด ๋ง ๋จ์ต๋๋ค.
๊ธฐ๋ณธ ๋ช ๋ น ์ค์ ๋ฐฐ์ด์ด ์๋๋๋ค. ๋ฌธ์์ด ๋๋ AST์ ๋๋ค.
์ด ์ฃผ์ฅ์ ๋ํ ๊ทผ๊ฑฐ๋ฅผ ์ ๊ณตํ์ง ์์์ต๋๋ค.
๋ค์์ PowerShell์ด โโ๋ช ๋ น์ ๋ํ AST๋ฅผ ๋น๋ํ๋ ์์น์ ๋๋ค (๋ช ๋ น์ด ์ด๋ค ์ข ๋ฅ์ ๋ช ๋ น์ธ์ง ํ์ธํ ๋ ๋ฐํ์๊น์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ข ๋ฅ์).
๋ช ๋ น ์์ (๋งค๊ฐ ๋ณ์ ๋ฐ ์ธ์ ํฌํจ)๊ฐ ๋ฐฐ์ด์ ์ถ๊ฐ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด PowerShell์์ ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
> { ping 192.168.0.1 }.Ast.EndBlock.Statements[0].PipelineElements[0].CommandElements
StringConstantType : BareWord
Value : ping
StaticType : System.String
Extent : ping
Parent : ping 192.168.0.1
StringConstantType : BareWord
Value : 192.168.0.1
StaticType : System.String
Extent : 192.168.0.1
Parent : ping 192.168.0.1
์ด ๋ฐฐ์ด์ ์ฌ๊ธฐ์์ ํํ์์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ฌ๊ธฐ์์ ํ์ดํ ๋ผ์ธ ํธ์ถ๋ก ์ ๋ฌ๋ฉ๋๋ค ( Expression.NewArrayInit(typeof(CommandParameterInternal[]), pipelineExprs)
๋ ์ธ์๊ฐ ์ ๋ฌ๋๋ ์์น์
๋๋ค).
๋ฐํ์์ ์ปดํ์ผ ๋ ํํ์์ด ์คํ๋๋ฉด ์ด ๋ฉ์๋ ํธ์ถ์ด ๋๋ฉฐ, ์ฌ์ฉํ ๋ช ๋ น ํ๋ก์ธ์๋ฅผ ๊ฒฐ์ ํ๋ ๋ค์ ํธ์ถ๋ก ์ ๋ฌ๋ฉ๋๋ค.
๊ฒฐ๊ตญ ํ์ดํ ๋ผ์ธ์ด ํธ์ถ๋๋ฉด ํด๋น ์ธ์ ๋ฐฐ์ด์ NativeCommandParameterBinder
์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ช
๋ น์ ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
๊ฐ ์ธ์์ ์ด๋ค ์ข
๋ฅ์ ๋ฌธ์์ด์ด ์ฌ์ฉ๋์๋์ง์ ๊ฐ์ AST ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์ธ์ ๋ฐฐ์ด์ ๊ฐ์ ธ ์์ NativeCommandProcessor
์์ ์ธ์ ํธ์ถ์์ํ ์ ๋ฌธ์์ด์ ๋ง๋ญ๋๋ค.
์ด๋ ํ์ฌ ํ๋ก์ธ์ค ํธ์ถ์ ์ฌ์ฉํ๋ .NET API๊ฐ ๋ฐฐ์ด์ ์ ๋ฌํ๊ณ .NET์ด ํธ์ถ์ ๋ค์ ๋น๋ ํ ์ ์๋๋กํ๋ .NET Core์ ์๋ก์ด ๋ฒ์ ์ด ์๋๋ผ ์ด์ "๋จ์ผ ๋ฌธ์์ด์ ๋ชจ๋ ์ธ์"๋ฒ์ ์ด๊ธฐ ๋๋ฌธ์ ์ํ๋ฉ๋๋ค. ํ๋ซํผ ํน์ ๋ฐฉ์์ผ๋ก ํ์์ ๋ฐ๋ผ.
ํ์ง๋ง์ด API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด * nix์์ ์ง์ fork
/ exec
ํธ์ถ ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ exec
๋ ๋ฐฐ์ด์ ์ฌ์ฉํฉ๋๋ค. syscall์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ง์ ์ ์ธ ๋ฐฉ๋ฒ์ด๋ฉฐ ์ด๋ ๊ถ๊ทน์ ์ผ๋ก ์ถ ์ด์ ์ธ์ ๊ตฌ๋ฌธ์ ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
@rjmholt :
_ ๊ธฐ๋ฅ์ ์ผ๋ก _ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ ์ด๋ฏธ ๊ธฐ์กด ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ์์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. _ ๋ค์ดํฐ๋ธ ๋ช
๋ น ์ค์ ๋จ์ผ ๋ฌธ์์ด๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ _ ์๋ก์ด Invoke-NativeShell
/ ins
cmdlet์ ํตํด ๊ฐ๋ ฅํ๊ฒ ๊ถ์ฅํฉ๋๋ค.
์ฌ๊ธฐ์ ์์์ ์ ๋ฐฐ์ด์ด ์๋๋ผ _ โโ๋จ์ผ ๋ฌธ์์ด _์
๋๋ค. _ ์ ์ฒด ๋ช
๋ น ์ค _-๋์ ์
ธ์ ์ํด ๊ตฌ๋ฌธ ๋ถ์ ๋จ _- ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ PowerShell์ ๋ฐ์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ํฉ๋ฆฌ์ ์
๋๋ค. --%
์ ๊ฐ์ ๋ค๋ฅธ ์์ ๊ตฌ๋ฌธ์ PowerShell์
Invoke-NativeShell
๊ฐํด์ผ ํ ์ผ์ ์ ์ฒด ๋ค์ดํฐ๋ธ ์
ธ ๋ช
๋ น ์ค์ด ํฌํจ ๋ ๋จ์ผ ๋ฌธ์์ด์ CLI๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ์
ธ์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค.
Unix ์์ ์ด๊ฒ์ ๋ค์์ ์๋ฏธํฉ๋๋ค. exec
์ ๋ฌ ๋ ์ธ์ _array_์ ๋ ๋ฒ์งธ ์์๋ก ๋ฌธ์์ด์์๋ ๊ทธ๋๋ก ์ ๋ฌํ๊ณ _as whole_์ ์ ๋ฌํฉ๋๋ค ( -c
๊ฐ ์ฒซ ๋ฒ์งธ ์ธ์ ๋ฐฐ์ด ์์์ด๊ณ /bin/sh
์คํ ํ์ผ); ๊ฐ๋จํ ์๋ฅผ ์ฌ์ฉํ์ฌ .NET ์ฉ์ด๋ก ํํ๋ฉ๋๋ค. ์ฌ๊ธฐ์ printf "'%s'" foo | cat -n
๋ ์ ๋ฌํ ๋ช
๋ น ์ค์ ํฌํจํ๋ ๋จ์ผ ๋ฌธ์์ด์ ์ถ ์ด์ ๋ด์ฉ์
๋๋ค ( .Arguments
์๋๋ผ .ArgumentList
์ฌ์ฉ์ ์ ์ํ์ญ์์ค .Arguments
; '
์ ๋ ๋ฐฐ๋์ด ์์ ์ ์ํฐํฉํธ์
๋๋ค.)
$psi = [Diagnostics.ProcessStartInfo]::new('/bin/sh'); $psi.ArgumentList.Add('-c'); $psi.ArgumentList.Add('printf "''%s''" foo | cat -n'); [Diagnostics.Process]::start($psi).WaitForExit()
Windows์์,์ด ์๋จ์ : ์์ฉ cmd
์ ๋จ์ ์ ์ฑ์ฐ๊ธฐ lpCommandLine
์ ์ธ์ CreateProcess
ํจ๊ป (์ดํ lpApplicationName
์ ๊ฐ์ผ๋ก ๊ฐ์ cmd.exe
๋ฅผ ๊ฐ๋ฆฌํค๋ ํ๊ฒฝ ๋ณ์ ComSpec
) : "/c " + cmdLine
, ์ฌ๊ธฐ์ cmdLine
๋ ์ ์ฒด ๋ช
๋ น ์ค ๋ฌธ์์ด ๊ทธ๋๋ก์
๋๋ค. ๊ฐ๋จํ ์์ ํจ๊ป .NET ์ฉ์ด๋ก ํํ๋ฉ๋๋ค. ์ฌ๊ธฐ์ echo a^&b & ver
๋ ํต๊ณผ ํ ๋ช
๋ น ์ค์ด ํฌํจ ๋ ๋จ์ผ ๋ฌธ์์ด์ ์ถ ์ด์ ๋ด์ฉ์
๋๋ค.
$psi = [Diagnostics.ProcessStartInfo]::new($env:ComSpec); $psi.Arguments = '/c ' + 'echo a^&b & ver'; [Diagnostics.Process]::start($psi).WaitForExit()
os.system()
์ฌ์ฉํ๋ Python๊ณผ ๊ฐ์ ๋ค๋ฅธ ์คํฌ๋ฆฝํ
์ธ์ด์์๋ ์ฌ์ฉ๋๋ ์ ์์
๋๋ค. (์๋ง๋ ์ํ๊น๊ฒ๋) ์๋ฏธ๋ %
๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํ ํ ์์๊ณ for
๋ฃจํ ๋ณ์๋ ๋จ์ผ %
(์ : %i
์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ์
๋๋ค. %%i
%i
๋์ %%i
); ๋ฃจํ ๋ณธ๋ฌธ ๋ช
๋ น ์์ @
๋ฅผ ๋ถ์ฌ์ ์์ฝ๋์ง ์๋๋กํด์ผํฉ๋๋ค (์ : for %i in (*.txt) do <strong i="56">@echo</strong> %i
).์ด ํ๋ก์ธ์ค๋ _ ์ต์ข ์ฌ์ฉ์์๊ฒ _ ํฌ๋ช ํฉ๋๋ค _, ๊ทธ๋์ ๊ทธ๋ค์ด ์ง์คํด์ผ ํ ๊ฒ์ _PowerShell's_ string-literal ๊ตฌ๋ฌธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํค๊ธฐ ๋งํ๋ฉด ๋ค์ดํฐ๋ธ ์ ธ ๋ช ๋ น ์ค _verbatim_์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
ins @'<newline>...<newline>'@
ํ์์ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ ๋ค์ดํฐ๋ธ ์
ธ ๋ช
๋ น ์ค์ ๊ทธ๋๋ก _ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ์กด์ ๋ค์ํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ์์ ์ฌ์ฉํ ์์๋ ๋ฐฉ๋ฒ์ ์ ์ _interpolating_์ ๊ฐ์ฉ์ฑ์ผ๋ก ์ธํด ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ธ์. ๋ฌธ์์ด ํ์ ( @"<newline>...<newline>"@
)-๋ช
๋ น ์ค์์ _PowerShell_ ๋ณ์ ๋ฐ ์์ ์ฌ์ฉํ ์์๋ ๊ธฐ๋ฅ์ด ํฌํจ๋ฉ๋๋ค (์ด๋ ๊ฒ ํ ์์๋ ๊ฒ์ --%
์ ์ฃผ์ ๋จ์ ์ค ํ๋์
๋๋ค).
๋ด ์ด์ ์๊ฒฌ์ด ์ ์ํ ๊ฒ์ _์ด ์ ์๊ณผ๋ ๋ถ๋ฆฌ ๋ _ ์๋ก์ด ์ผ๋ฐ ํํ์ ์์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด _์
๋๋ค (๊ทธ๋ฆฌ๊ณ ๊ตฌ๋ฌธ ๋ถ์ ๋
ผ๋ฆฌ๋ ์ ์ ์๋์ด ์์ต๋๋ค). ๊ทธ๋ฌ๋ ์ธ๊ธํ๋ฏ์ด Invoke-NativeShell
ํตํ๋ _ ๋ ํธ๋ฆฌํฉ๋๋ค _.
์ด๋ฏธ ํ ์์๋ ๊ฒ ๋์ ( Invoke-NativeShell
/ ins
๋ช
๋ น ๊ฐ์ ) :
# ALREADY WORKS: Literal here-string
ins @'
python -c 'print("hi")' | cat -n
'@
์ ์ ๋ ์๋ก์ด ๋จ์ผ ํ ์์ ๋ฆฌํฐ๋ด์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋จ์ํ ํ ์ ์์ต๋๋ค.
# PROPOSED, more convenient syntax: new raw literal.
ins @' python -c 'print("hi")' | cat -n '@
์ด ์๋ก์ด ์์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ ์ธ๋ถ ์ฌํญ์ ๋ํด ํ ๋ก ์ด ํ์ํ๋ฉด ์ฌ๊ธฐ๊ฐ ์๋๋ผ # 13204์์ ์ํํ๋๋กํ๊ฒ ์ต๋๋ค.
๊ทธ๋์ ์๋ ์๋๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ ์์ ๋ค์ ์ฝ์ผ๋ฉด ์ค์ ๋ก /bin/sh -c '<command>'
+ cmd ๋ฒ์ ์ ๋ํ ๋ ๋์ ๊ตฌ๋ฌธ๊ณผ ๊ฐ ๋์ ์
ธ์ ๋ํ ํน์ ๋ฌธ์์ด ์ด์ค์ผ์ดํ ๋
ผ๋ฆฌ๋ฅผ ์์ฒญํ๋ ๊ฒ์
๋๋ค. ๋๋ ํน๋ณํ ๊ตฌ๋ฌธ๊ณผ ํ์ ๋ฐ ๋ค์ดํฐ๋ธ ๋ช
๋ น ํ๋ก์ธ์๋ก ์์
ํด์ผํ๋ ์ด๊ธฐ ๊ฐ๋
์ ๊ธฐ๋ฐ์ผ๋กํ์ต๋๋ค. .NET์ ProcessStartInfo.Arguments
์์ฑ ์ ๋ฐ์ดํ ์ ๋ฌ ์ธก๋ฉด์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ ๊ฐ
๊ทธ๋ฌ๋ ์ค์ ๋ก Arguments
๋ฌธ์์ด์ ๊ทธ๋๋ก ์ ๋ฌ๋ฉ๋๋ค . ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐํด์ผ ํ ์ผ์ ์ด๋ฌํ ๋ฌธ์์ด์ ์ง์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค.
์ด ๊ฒฝ์ฐ ์๋ก์ด ๊ตฌ๋ฌธ์ด ์ ํ ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค (ํ ํฐ ํ ๋
ผ๋ฆฌ๋ฅผ ๋ณต์กํ๊ฒํ๊ณ ์ฌ๋๋ค์ ํผ๋์ค๋ฝ๊ฒํ๋ ๊ฒ ๊ฐ์ต๋๋ค). ๋์ ์ด๊ฒ์ ๋จ์ง ์๋ก์ด ๋ช
๋ น ์ธ ins
์
๋๋ค. .NET์๋ ์ฌ๊ธฐ ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ๋ก ๋ค์ ๊ตฌํํด์ผํ๋ ๋ช ๊ฐ์ง ๋
ผ๋ฆฌ๊ฐ ์์ง๋ง ์ด์จ๋ ์กฐ๊ธ ๋ ๋๋ํด์ผํ๋ฏ๋ก ๊ด์ฐฎ์ต๋๋ค.
@rjmholt ์ ์๊ฒฌ์ ๋ํ ์ผ๋ถ ์๊ฒฌ https://github.com/PowerShell/PowerShell/issues/13068#issuecomment -660231641
์ ๋ชจ๋๋ฅผ ์์ํ๊ธฐ ์ํด ํ ํฌ ๋์ด์ ์ ๋ํ ๋ชจ๋ ์ธ๋์ผ์ดํฐ์๋ ์ด์ค์ผ์ดํ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค. ํด๋น ๋ชจ๋๋ฅผ ๋ ๋๋ ํ ํฌ ๋์ด์ ์ ๋ํ ์ธ๋์ผ์ดํฐ๋ฅผ ํด๋น ๋ฌธ์์ ๋ฌธ์ ํ์๊ณผ ๊ตฌ๋ณํด์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ๋์ํ๋ฉฐ ์ฌ๊ธฐ์ ์ธ๋ผ์ธ ๋ฌธ์์ด ๊ตฌ๋ฌธ์ด ํ์ถ์ ํ์์ฑ์ ์์ ํ ํผํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
-% ์ฐ์ฐ์๋ ๋ชจ๋ (|, &&, ||,;, ๊ฐํ)๋ฅผ ์ข ๋ฃํ๋ ๋๋ฌด ๋ง์ ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ๊ทธ ์์ ๋ฌธ์์ด์ ํ์ฉํฉ๋๋ค ( '๋ฌธ์ ์ ๊ฑฐ).
--%
์ ๋ํด ๋งํ ๋ ๊ธฐ์กด --%
์ค์์น๋ฅผ ์ธ๊ธํ์ญ๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ง๊ธ --%
๊ฐ ์ฝ ์คํผ๋ ์ดํฐ๋ก ์ ์๋์์ผ๋ฏ๋ก ๊ทํ์ ์๊ฒฌ์์์ด๋ฅผ ๋ช
ํํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์คํ ๊ฐ๋ฅํ ํธ์ถ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ค๋ ๊ฒ์ ์ค์ ๋ก ๋ฐฐ์ด ๊ตฌ๋ฌธ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
์ ์์ ๊ธฐ๋ณธ ์ (sh ๋๋ cmd๋ฅผ) ํธ์ถํ๊ณ ํธ์ถ ์ฐ์ฐ์ ํ ๋ฌธ์ ๊ทธ๋๋ก ๋ชจ๋ ๊ฒ์ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค --%
์ฒ๋ผ sh -c ...
. ๋ฐ๋ผ์ ๋์ ์คํ ํ์ผ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ powershell์ด โโ์๋๋๋ค. ์ด ๊ฒฝ์ฐ _ ๋ฐฐ์ด ๊ตฌ๋ฌธ _์ด ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ฃ ?
๊ตฌ๋ฌธ์ ์ด๋ป๊ฒ ๋๋ผ๊น์? ๊ฐํ ๋ฐ; ์๋ง๋?
๋ ผ์์ ์ด๋ป๊ฒ ๋ถ๋ฆฌํฉ๋๊น? '๊ณต๊ฐ'์ผ๊น์?
์ถ ์ด์ ๊ตฌ๋ฌธ ๋ถ์์ ๊ฐํ์ผ๋ก ๋๋ฉ๋๋ค. ์ธ์์ ์ผ๋ถ๋ก ์ ์ค์ ์ ๋ฌํ๋ ค๋ฉด bash์์ ์ง์ ์ํํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก \n
๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๊ธฐ๋ณธ ๋ช ๋ น ์ค์ ๋ฐฐ์ด์ด ์๋๋๋ค. ๋ฌธ์์ด ๋๋ AST์ ๋๋ค.
์ด ์ฃผ์ฅ์ ๋ํ ๊ทผ๊ฑฐ๋ฅผ ์ ๊ณตํ์ง ์์์ต๋๋ค.
๋ค์์ PowerShell์ด โโ๋ช ๋ น์ ๋ํ AST๋ฅผ ๋น๋ํ๋ ์์น์ ๋๋ค (๋ช ๋ น์ด ์ด๋ค ์ข ๋ฅ์ ๋ช ๋ น์ธ์ง ํ์ธํ ๋ ๋ฐํ์๊น์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ข ๋ฅ์).
์ด ์ ์์ด ๊ตฌํ๋๋ฉด PowerShell์ด โโAST๋ฅผ ์ ํ ๋น๋ํ์ง ์๋ ํน์ ๊ตฌ์กฐ๊ฐ ๋์ ๋ฉ๋๋ค.
๊ธฐ๋ป์, @rjmholt.
.NET์๋ ์ฌ๊ธฐ์ ๋ํ ๋ช ๊ฐ์ง ๋ ผ๋ฆฌ๊ฐ ์์ผ๋ฉฐ์ด๋ฅผ ๋ค์ ๊ตฌํํด์ผํฉ๋๋ค.
์ด์ ์ฃผ์์ ๋ช
๋ น์ด ๋ณด์ฌ ์ฃผ๋ฏ์ด ์ค์ ๋ก๋ ์๋ฌด๊ฒ๋ ๋ค์ ๊ตฌํํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Windows์์๋ WinAPI์ ๋ํ ์ ์ฒด ๋ช
๋ น ์ค ๋ฌธ์์ด ํต๊ณผ์ .Arguments
๋ฅผ ์ฌ์ฉํฉ๋๋ค. Unix์์๋ .ArgumentList
๋ฅผ ์ฌ์ฉํ์ฌ exec
์ ์ง์ ์ฌ์ฉ๋๋ _array_ ์ธ์๋ฅผ ์์ฑํฉ๋๋ค.
์ด ์ ์์ด ๊ตฌํ๋๋ฉด PowerShell์ด โโAST๋ฅผ ์ ํ ๋น๋ํ์ง ์๋ ํน์ ๊ตฌ์กฐ๊ฐ ๋์ ๋ฉ๋๋ค.
์ด ๋ชฉ์ ์ ์ํด ์ค๊ณ๋ ๋ค๋ฅธ AST ์ ํ์ ๋น๋ํฉ๋๋ค. AST์ ์ผ๋ถ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์๊ณผ ๋์ผํ๋ฉฐ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
_ ๊ธฐ๋ฅ์ ์ผ๋ก _ ๋ชจ๋ ์๊ตฌ ์ฌํญ์ ์ด๋ฏธ ๊ธฐ์กด ๋ฌธ์์ด ๋ฆฌํฐ๋ด ํ์์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. _ ๋ค์ดํฐ๋ธ ๋ช ๋ น ์ค์ ๋จ์ผ ๋ฌธ์์ด๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ _ ์๋ก์ด
Invoke-NativeShell
/ins
cmdlet์ ํตํด ๊ฐ๋ ฅํ๊ฒ ๊ถ์ฅํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก Invoke-NativeShell
cmdlet ์์ด๋์ด๊ฐ ๋ง์์ ๋ญ๋๋ค. ์ด๋ค๋ฉด์์๋ ํธ์ถ ์ฐ์ฐ์ --%
๋ณด๋ค ๋ซ์ต๋๋ค. ๋ด๊ฐ์ด ์์ด๋์ด์ ๋ํด ๋ค์๋ ์ฃผ์ ๊ด์ฌ์ฌ๋ --%
+ Ctrl + v ๋ณด๋ค ํ์ดํ์ด ๋ ๋ง๊ณ here-string์ ๋ณด๊ฐํ๋ ๊ฒ๊ณผ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ฌ์ฉ์์๊ฒ ๋ ๋ค๋ฅธ ๋ถ๋ด์ด๋ผ๋ ๊ฒ์
๋๋ค (_ ๊ฐ์ธ์ ์ผ๋ก ins
๋ผ๊ณ ์๊ฐํฉ๋๋ค) --%
_)๋ณด๋ค ์
๋ ฅํ๊ธฐ๊ฐ ํจ์ฌ ์ฝ์ต๋๋ค.
๋ด๊ฐ์ด ์์ด๋์ด์ ๋ํด ๋ค์๋ ์ฃผ์ ๊ด์ฌ์ฌ๋
--%
+ Ctrl + v๋ณด๋ค ํ์ดํ์ด ๋ ๋ง๊ณ here-string๊ณผ here-string์ ๋ณด๊ฐํ๋ ๊ฒ์ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ฌ์ฉ์์๊ฒ ๋ ๋ค๋ฅธ ๋ถ๋ด์ด๋ผ๋ ๊ฒ์ ๋๋ค (_ ๊ฐ์ธ์ ์ผ๋กins
--%
_)๋ณด๋ค ์ ๋ ฅํ๊ธฐ๊ฐ ํจ์ฌ ์ฝ์ต๋๋ค.
PSRL์ด ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ถ์ฌ ๋ฃ์ ๊ฒฝ๋ก๋ฅผ ๋๋ฌ์ธ๋ ํค ์ฒ๋ฆฌ๊ธฐ์ ๋ํ ๋ฌธ์ ์ ์ ์ฌํ๊ฒ PSRL์ CommandAst
์ฝ๊ณ ins
์ฝ๊ณ ๋ถ์ฌ ๋ฃ์ ๋ฌธ์์ด์ ์ ๋๋ก ์ด์ค์ผ์ดํ ํ ์ ์์ต๋๋ค.
์ด ๋ชฉ์ ์ ์ํด ์ค๊ณ๋ ๋ค๋ฅธ AST ์ ํ์ ๋น๋ํฉ๋๋ค. AST์ ์ผ๋ถ๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฃผ์๊ณผ ๋์ผํ๋ฉฐ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค.
๋ฌผ๋ก , ๋๋ฌด๋ ์ฌ์ ํ ๊ฒ์ ๋๋ค. ์คํ๋ ๋ช ๋ น์ ์๋ฏธ๋ฅผ ๋ฐ์ํ์ง ์์ต๋๋ค.
์์ ํ๋ก์ธ์ค cmd.exe ๋ฆฌ๋๋ ์ stdin / stdio ๋ฐ ๋ฌธ์ ๊ทธ๋๋ก ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ bash์ ๋์ผํ NativeCommand๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
๋คํ ์ด๋ค์, @ daxian-dbw.
@SeeminglyScience ์์ด๋์ด๋ฅผ
๋ฆฌํฐ๋ด here-string๊ณผ here-string์ ๋ณด๊ฐํ๋ ๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ ๋ค๋ฅธ ๋ถ๋ด์ ๋๋ค.
--%
์ ๋ฌ๋ฆฌ @"<newline>...<newline>"@
์ฌ์ฉํ๋ฉด _PowerShell_ ๋ณ์ ๋ฐ ํํ์์ ๊ฐ์ ๊ธฐ๋ณธ ๋ช
๋ น ์ค์ ์ง์ ํตํฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ _plus_๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌผ๋ก ์ฌ์ฉ์๊ฐ ์์ ๋ฐ์ดํ (verbatim)์ ํฐ ๋ฐ์ดํ (๋ณด๊ฐ) ๋ฌธ์์ด์ ์ฐจ์ด์ ๊ณผ $
์ ํ์ `
์ด์ค์ผ์ดํ์ ๋ํด ์๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ง๋ง ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. (๊ณ ๊ธ) ์ต์
์ด ์์ต๋๋ค.
์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ ์ฌ์ฉ์๋ฅผ ๋๊ธฐ ์ํด ์ ์ ๋ PSReadLine ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก @'<newline>...<newline>'@
(verbatim)์ผ๋ก ์ค์ ๋์ด์ผํฉ๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ์ฐ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ PowerShell์ ๊ณ ์ ํ ๊ตฌ๋ฌธ ์๊ตฌ ์ฌํญ์ ์๊ณ ์ดํดํ ํ์๊ฐ์๋ ์ฌ๊ณ ๋ฐฉ์์ ์ฅ๋ คํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋์ _ ๊ทธ๋ค์ด ๊ฐ์ ธ ์ค๋ ํ์ ๊ณ ๋ คํ์ฌ ์ดํด๋ฅผ ์ด์งํ๊ณ ์ํฉ๋๋ค.
ํ์ง๋ง ์ฌ์ฉ์๊ฐ PowerShell์ _own_ ๊ตฌ๋ฌธ (์ ์์ _cross-platform_)์ ์ฌ์ฉํ๋๋ก ์ฅ๋ คํ๋ ค๋ฉด ์์๋๋ก ์๋ํด์ผํฉ๋๋ค .
์ด๋ฅผ ์ํด์๋ # 1995๋ฅผ ์์ ํด์ผํฉ๋๋ค . ์ด์์ ์ผ๋ก๋ ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝ์ ํ์ฉํ๊ฑฐ๋ ์ต์
์ด ์๋ ๊ฒฝ์ฐ ์ต์ ์์ _opt-in_์ ํตํด ์์ ํด์ผํฉ๋๋ค.
์์ฝ:
--%
(์ฌ๊ธฐ์์ ์ ์ ๋ ์๋ก์ด ์ฐ์ฐ์ ํ์)์ ๊ฐ์ ๊ฒ, ์ ์์ _platform-specific_ ๊ธฐ๋ฅ์ # 1995 ์์ ์ ๋์ฒด ํ ์ ์์ต๋๋ค .
Invoke-NativeShell
( ins
)๋ ์ ์ ๋ --%
์ฐ์ฐ์์ ๋ชจ๋ ์ ํ์ ํผํ๊ณ @joeyaiello๊ฐ ์ธ๊ธ ํ "ํธ๋ฉ ๋์ด"์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. ์์ฑ๋ ๋ช
๋ น ์ค์ ์คํํ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ PowerShell์ ๊ตฌ๋ฌธ์ ์ ์ฉ ํ ํ์์์ด ๋ค์ดํฐ๋ธ ์
ธ์ ๊ฒฝ์ฐ
--%
์ ์๋ _argument_ ํ์์ผ๋ก ๋ง ์ ์ง๋์ด์ผํ๋ฉฐ _Windows ์ ์ฉ _ ๊ธฐ๋ฅ์ผ๋ก ์ ์ง๋์ด์ผํฉ๋๋ค (๊ธฐ์ ์ ์ผ๋ก๋ ์๋์ง๋ง _ ํจ๊ณผ์ ์ผ๋ก _). ์ฆ, ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค.
--%
์ ์ ์ผํ ๋ชฉ์ ์ Windows_์์ _edge ์ผ์ด์ค๋ฅผ ์์ฉํ๋ ๊ฒ์
๋๋ค : ํ์ํ msiexec
์ ๊ฐ์ ์
์ฑ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ ๋ ๋ช
๋ น ์ค์ ๋ช
์ ์ ์ธ์ฉ์ ์ ์ด ํ ์ ์์ต๋๋ค. ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ํํ์ ์ธ์ ๋ด ์ธ์ฉ.PS v7.x์์ ์ ๊ฐ ์ ๋ง๋ก ์ํ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์ค ํ๋๋์ด RFC ์์ ๋
ผ์ ๋ ๊ฒ์ฒ๋ผ set -e
์ ๊ฐ์ด ๋ด ์คํฌ๋ฆฝํธ๋ฅผ ์ค์งํ๋ ์ค๋ฅ ์ฝ๋์ ํจ๊ป ๊ธฐ๋ณธ ๋ช
๋ น์ ์ข
๋ฃํ๋ ๊ธฐ๋ฅ์
๋๋ค. ๊ทธ์ ๋ํ ํด๊ฒฐ์ฑ
์ด ๊ฐ์ ๊ฒฝ์ฐ Invoke-NativeCommand
, ๊ทธ ๋ฆฌ์คํ
์ ํผ๋ ๊ฒ Invoke-NativeShell
?
๋ด๊ฐ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ ํธ์ถ์ ์ํ๋๋งํผ msbuild, cl, cmake, Conan, npm ๋ฑ์ ํธ์ถ ํ ๋ ๋น๋ ๋ฐ ํ
์คํธ ์คํฌ๋ฆฝํธ๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ด๋ฌํ ๊ธฐ๋ณธ ๋ช
๋ น์ด ์ข
๋ฃ๋๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ํ๋ฅผ ์กฐ๊ธ ์์ผ๋ก ์ฌ์ํ๋ ค๊ณ ํฉ๋๋ค. ํญ์ $ LASTEXITCODE๋ฅผ ํ์ธํ๋ ๊ฒ์ ๊ธฐ์ตํ ํ์์์ด 0์ด ์๋ ์ข
๋ฃ ์ฝ๋. ๊ตฌํ์ด $PSNativeCommandInErrorActionPreference
๊ฐ์ ๋ค๋ฅธ ํ๊ฒฝ ์ค์ ๋ณ์๋ฅผ ํตํด ์ด๋ฃจ์ด ์ก๋ค๋ฉด ์ด๊ฒ์ด ๋ค์ดํฐ๋ธ ์์ ํธ์ถ์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค-๋ค์ดํฐ๋ธ "๋ช
๋ น"๊ณผ ๋ชจ๋ ๊ฒ์
๋๊น?
๋ด๊ฐ์ด ์์ด๋์ด์ ๋ํด ๋ค์๋ ์ฃผ์ ๊ด์ฌ์ฌ๋
--%
+ Ctrl + v๋ณด๋ค ํ์ดํ์ด ๋ ๋ง๊ณ here-string๊ณผ here-string์ ๋ณด๊ฐํ๋ ๊ฒ์ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ฌ์ฉ์์๊ฒ ๋ ๋ค๋ฅธ ๋ถ๋ด์ด๋ผ๋ ๊ฒ์ ๋๋ค (_ ๊ฐ์ธ์ ์ผ๋กins
--%
_)๋ณด๋ค ์ ๋ ฅํ๊ธฐ๊ฐ ํจ์ฌ ์ฝ์ต๋๋ค.PSRL์ด ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ถ์ฌ ๋ฃ์ ๊ฒฝ๋ก๋ฅผ ๋๋ฌ์ธ๋ ํค ์ฒ๋ฆฌ๊ธฐ์ ๋ํ ๋ฌธ์ ์ ์ ์ฌํ๊ฒ PSRL์
CommandAst
์ฝ๊ณins
์ฝ๊ณ ๋ถ์ฌ ๋ฃ์ ๋ฌธ์์ด์ ์ ๋๋ก ์ด์ค์ผ์ดํ ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด๋จ๊น์?
$c = gcm ins
& $c ...
PSRL์ ๊ฑฐ๊ธฐ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ธ์ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ ๊ฒ์ ๋๋ค. stateful์ด์ด์ผํ๊ณ invoke-nativeshell์ ๋ํ ๋ณ์นญ์ ํ์ธํ ๋ค์ commandinfo๋ฅผ ํธ์ถ ํ ๊ฒ์ธ์ง ํ์ ํ ๋ค์ args๋ฅผ ์ ๊ฑฐํด์ผํฉ๋๊น? ๊ฐ์ง ๋ช ๋ น์ ํน์ ์ผ์ด์ค๋ก ์ฌ์ฉํ๋ค๋ ์๊ฐ์ด ์ ๋ง ์ซ์ต๋๋ค.
๋ฆฌํฐ๋ด here-string๊ณผ here-string์ ๋ณด๊ฐํ๋ ๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ ๋ค๋ฅธ ๋ถ๋ด์ ๋๋ค.
--%
์ ๋ฌ๋ฆฌ@"<newline>...<newline>"@
์ฌ์ฉํ๋ฉด _PowerShell_ ๋ณ์ ๋ฐ ํํ์์ ๊ฐ์ ๊ธฐ๋ณธ ๋ช ๋ น ์ค์ ์ง์ ํตํฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ _plus_๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@ mklement0์ ํ๋ก์ฐํ์ง ์์ต๋๋ค. ์ --%
์๊ฒ ์ด๊ฒ์ ๊ฐ๋ฅด์น์ง ๋ชปํฉ๋๊น? ๋๋ ์ด๋ฏธ ์ด๊ฒ์ ์ ์ค ์ผ์ด์ค๋ก ์ ๊ณตํ์ต๋๋ค.
๊ฐ์ง ๋ช ๋ น์ ํน์ ์ผ์ด์ค๋ก ์ฌ์ฉํ๋ค๋ ์๊ฐ์ด ์ ๋ง ์ซ์ต๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ์ง ๋ช
๋ น์ด ์์ผ๋ฉฐ ์ง์ ํ cmdlet ์ธ Invoke-NativeShell
ins
๋ณ์นญ์ผ๋ก ์ง์ ๋ฉ๋๋ค.
gcm ins
( Get-Command ins
)๋ ins
๋ณ์นญ์ ๋ํ ์ ๋ณด๋ฅผ [System.Management.Automation.AliasInfo]
์ธ์คํด์ค ํ์์ผ๋ก ์ ๊ณตํ๋ฉฐ ๋์ค์ &
์ ๋ฌํ ์ ์์ต๋๋ค &
์
๋๋ค.
๋ฐ๋ผ์ ์์ ๋ ์๋ ํ๋๋ก ์ ํํ๊ฒ ์๋ํฉ๋๋ค. gcm
( Get-Command
) ์ฐํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ์ ํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ _yourself_๋ฅผ ์
๋ ฅํด์ผํฉ๋๋ค. @SeeminglyScience์ ์ ์์ด ๊ตฌํ ๋ ๊ฒฝ์ฐ PSRL _could_๊ฐ ์ ๊ณตํ๋ _ ์ต์
ํธ์ ๋ช
๋ น ์ค์บ ํด๋ฉ _ :
$c = gcm ins
& $c @'
python -c 'print("hi")' | cat -n
'@
๋๋ # 13204์์ ์ ์ํ ์๋ก์ด ์์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ด ๊ตฌํ ๋ ๊ฒฝ์ฐ :
$c = gcm ins
& $c @' python -c 'print("hi")' | cat -n '@
๋ฌผ๋ก PowerShell์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ๊ตฌ๋ฌธ์ ์ต์ํ๋ค๋ฉด ์ผ๋ฐ ์์ ๋ฐ์ดํ ๋ฌธ์์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ์ฒด '...'
๋ฌธ์์ด์ ํฌํจ ๋ '
๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆฌ๋ฉด๋ฉ๋๋ค.
$c = gcm ins
& $c 'python -c ''print("hi")'' | cat -n'
์
--%
์๊ฒ ์ด๊ฒ์ ๊ฐ๋ฅด์น์ง ๋ชปํฉ๋๊น?
--%
์๋ ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ์์ด์ Powershell ํ์ดํ ๋ผ์ธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ํ์ฉ๋์ง ์๋ ์ ํ์
๋๋ค ( (...)
์ํด๋ก์ ๋ ๋ชจ๋ ์ถ๋ ฅ์ ์ ํ ์์ง์ ์๋ฏธํ๋ฏ๋ก ์ต์
์ด _not_์
๋๋ค. _streaming_ ์ฒ๋ฆฌ๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ผ์ธ).
Unix์์ --%
์ _both_ ์ง์ (์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋์ง ์์) $
๋ฅผ PowerShell ๋ฉํ ๋ฌธ์๋ก _and_ POSIX- ์
ธ ๋ฉํ ๋ฌธ์๋ก ์ง์ํ ์ ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, _ ๋ค๋ฅธ ์
ธ์ ๊ตฌ๋ฌธ _์ PowerShell์ _no_ ์ ๋นํ ํ ์ ์์ง๋ง ์ด์ ์ด ์์ต๋๋ค. ๋ค์ดํฐ๋ธ ์
ธ ๋ช
๋ น ์ค์ _ ๋ฌธ์์ด _๋ก ins
ํ๋ฉด ๋ชจ๋ ๊ฐ๋
์ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง๋๋ค.
Invoke-NativeShell์ PowerShell์ด โโ๊ธฐ๋ณธ ์ ธ์ด ์๋์ ์๋ฏธํฉ๋๋ค. ๊ทธ ๊ฐ์ ์ ํญ์ ์ ํํ๊ณ ํญ์ ๊ทธ๋์ผ ํ๋๊ฐ?
@oising ์ ์ค ์ผ์ด์ค๋ ๋๊ตฐ๊ฐ๊ฐ README ๋๋ ๋ค๋ฅธ ๊ฒ์์ ๊ธฐ๋ณธ ๋ช
๋ น์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ๋ ๊ฒ์
๋๋ค. ins
SPACE CTRL + v ๋ฅผ ์
๋ ฅํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ ์์
์ ์ํํ๋ ๊ฒฝ์ฐ ํ์์ฒ๋ผ ์์ ์ ๋ฌธ์์ด์ ๋น๋ํ๊ณ ์ด์ค์ผ์ดํํฉ๋๋ค.
๋ฟก ๋นต๋จ
ํ์ง๋ง ์ฌ์ฉ์๊ฐ PowerShell์ _own_ ๊ตฌ๋ฌธ (์ ์์ _cross-platform_)์ ์ฌ์ฉํ๋๋ก ์ฅ๋ คํ๋ ค๋ฉด ์์๋๋ก ์๋ํด์ผํฉ๋๋ค .
์ด๋ฅผ ์ํด์๋ # 1995๋ฅผ ์์ ํด์ผํฉ๋๋ค . ์ด์์ ์ผ๋ก๋ ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝ์ ํ์ฉํ๊ฑฐ๋ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ ์ต์ ์์ _opt-in_์ ํตํด ์์ ํด์ผํฉ๋๋ค.
์ด๊ฒ์ ins
/ --%
์ ๋ํ ํ ๋ก ๊ณผ๋ ๋ณ๊ฐ์
๋๋ค. ๋์ํ์ง ์๋ ๊ฒฝ์ฐ ํด๋น ๋ฌธ์ ๊ฐ ์ ๋ช
๋ น / ๊ตฌ๋ฌธ์ ์ํฅ์ ๋ฏธ์น๋ ์ด์ ๋ฅผ ๋ช
ํํ ํ ์ ์์ต๋๊น?
@SeeminglyScience , ์, ๊ทธ๊ฒ์ ๋ณ๊ฐ์ด์ง๋ง์ด ์ค๋ ๋์์๋ ๋ช
ํํ์ง ์์ต๋๋ค.
# 1995๊ฐ ์ฌ๊ธฐ์ ๋์จ ์ ์ผํ ์ด์ ๋์ด ๋ฌธ์ ๋ฅผ ์ํด ์๋ ๋ซ ํ๊ธฐ ๋๋ฌธ์ด๋ฉฐ (๋คํํ ๋ค์ ์ด๋ ธ์ง๋ง) ์ฌ๊ธฐ OP๋ ์ฌ์ ํ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒ์ด๋ผ๊ณ ๋งํฉ๋๋ค ( "์ด ๋ฌธ์ ๋ ํด๊ฒฐ๋์ด์ผํฉ๋๋ค :"). .
๋ฐ๋ผ์ ins
/ --%
์ (๋) # 1995 ์ฃผ์๊ฐ _not_๋๋ฉฐ, ์ด๋ ๊ธด๊ธํ๊ฒ ์์ฒด ์์ ์ด ํ์ํ๋ค๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ถ์์ต๋๋ค.
(PowerShell์ ์์ฒด ์ธ์ ์ ๋ฌ์ด ์ ๋๋ก ์๋ํ๋ ๊ฒฝ์ฐ์๋ง ์์ฌ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ PowerShell์ ์์ฒด ๊ตฌ๋ฌธ์ ์์ ํ ๋ฐฐ์ฐ๊ณ ์์ฉ ํ ๊ฒ์ ๊ถ์ฅ ํ ์ ์์ต๋๋ค.
@ SP3269 , ์ฐ๋ฆฌ๊ฐ ๋๋ฌํ๋ฉด ๊ทธ ๋ค๋ฆฌ๋ฅผ ๊ฑด๋ ์ ์์ต๋๋ค ๐.
ํ์ง๋ง ์ง์งํ๊ฒ :
"๋ค์ดํฐ๋ธ"๋ฅผ "ํธ์คํธ ํ๋ซํผ [ํจ๋ฐ๋ฆฌ] ์ฉ์ผ๋ก ํน๋ณํ ์์ฑ ๋จ"์ผ๋ก ์๊ฐํ๋ฉด PowerShell์ด โโ์ฃผ์ด์ง ํ๋ซํผ์์ ๊ธฐ๋ณธ ์์คํ ์ ธ์ด๋์ด์ผํ๋๋ผ๋ ์ด๋ฆ์ ์ฌ์ ํ โโ์ ํฉ ํ ๊ฒ์ ๋๋ค (์ํ๋ ๋ฐ๊ฐ ์์ง๋ง ์๊ฐํ์ง ์์ต๋๋ค). ์ ์ด๋ ๊ฐ๊น์ด ๋ฏธ๋์๋ ํ์ค์ ์ด์ง ์์ต๋๋ค.)
๋์ :
Invoke-[System]DefaultShell
๊ฐ ๊ฐ์ฅ ์ ํํ ์ด๋ฆ์ด์ง๋ง (PowerShell์ด โโ์์คํ
์ ๊ธฐ๋ณธ ์
ธ์ด๋๋ ๊ฒฝ์ฐ ๋ ์ด์ ์ ์ฉ๋์ง ์์ง๋ง) PowerShell ์ธ๊ณ์์ "๋ค์ดํฐ๋ธ"๊ฐ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ฉ์ด ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
Invoke-LegacyShell
์ Windows์์ ์ฝ๊ฐ์ ํ๋น์ฑ์ ๊ฐ์ง๊ณ ์์ง๋ง Unix ์ฌ์ฉ์๋์ด ์ฉ์ด๋ฅผ ๋๋ฌด ์น์ ํ๊ฒ ๋ฐ์๋ค์ด์ง ์์ ๊ฒ์
๋๋ค.
๋๋ ์ฌ๊ธฐ์์ ๋ชจ๋ ์ฌ๋์ ๋๊ธฐ, ์์ด๋์ด ๋ฐ ๋ฌธ์ ๋ฅผ ์ถ์ ํ๋ ค๊ณ ์๋ํ๊ณ ์๋ ์์ ํ ํผ๋์ ํ๊ธฐ ์์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ( @ mklement0 ๊ณผ ๋๋ ์ ์ด๋) ์ด๊ฒ์ ๋์ผํ ๊ฐ๋
์ ๋ฌธ์ ์ ๋ํ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฒฌํด์ ๋ํ ๋ ๊ฐ์ง ๋ค๋ฅธ ํด๊ฒฐ์ฑ
์ผ๋ก๋ณด๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ์ ์ํ ๊ฒ์ _parser_์ ๋ํ ํํธ๋ก --%
๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ &
์ฐ์ฐ์์ ํจ๊ป ํ์ฑ๋๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๊ฒ์
๋๋ค (๋ฐ๋์ --%
๋
๋ฆฝํ์ ์ฌ์ฉํ์ง ์์). ๋ฐ๋ฉด์ Michael์ ins
๋ฅผ powershell์ ์์ฒด ๋ด๋ถ ๋ค์ดํฐ๋ธ ๋ช
๋ น ๋ธ๋ก์ปค ๋ฐ ์ธ์ ํ์๋ฅผ ๋์ฒดํ๋ ๋๋กญ ์ธ cmdlet์ผ๋ก๋ณด๊ณ ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ๋์ strings / here๋ฅผ ์ฌ์ฉํ์ฌ powershell์ ํ์๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ์ง ์์ต๋๋ค. -์๋ ๋ ๋งค๊ฐ ๋ณ์๋ฅผ ์บก์ฒํ๊ธฐ์ํ ๋ฌธ์์ด ( --%
๊ณผ ํจ๊ป ์ฌ์ฉํ ์๋ ์์)
-%์๋ ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ์์ด Powershell ํ์ดํ ๋ผ์ธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์ ์ ์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ins / invoke-nativecommand๋ณด๋ค ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ๋ ์ด์ ๋ถ์กฑํ์ง ์์ต๋๋ค. LHS์์ ๊ตฌ๋ถํ๊ฑฐ๋ ๊ณต๊ธํด์ผํ๋ ๊ฒฝ์ฐ here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ผ ๋ช ๋ น๋ฌธ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ด๋ค ๋ฐฉ๋ฒ์ ์ ํํ๋ ๋ช
๋ น ์ค์ ์ ๋ฌํ๊ธฐ ์ํด ๋ค์ดํฐ๋ธ ์
ธ์ ์ ํํด์ผํ๋ ๊ฒ ๊ฐ์ต๋๋ค. Windows์์๋ ํ๊ฒฝ ๋ณ์ COMSPEC
(๊ธฐ๋ณธ๊ฐ์ %systemroot%\system32\cmd.exe
), Linux์์๋ SHELL
(๊ธฐ๋ณธ๊ฐ์ /bin/bash
)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค %systemroot%\system32\cmd.exe
SHELL์ด ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ /bin/sh
๋์์ผ๋กํด์ผํฉ๋๋ค (๋๋ถ๋ถ์ ๊ฒฝ์ฐ bash์ ๋ํ ์ฌ๋ณผ๋ฆญ ๋งํฌ).
-%์๋ ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ์์ด Powershell ํ์ดํ ๋ผ์ธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์ ์ ์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ins / invoke-nativecommand๋ณด๋ค ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ๋ ์ด์ ๋ถ์กฑํ์ง ์์ต๋๋ค. LHS์์ ๊ตฌ๋ถํ๊ฑฐ๋ ๊ณต๊ธํด์ผํ๋ ๊ฒฝ์ฐ here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ผ ๋ช ๋ น๋ฌธ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก cmd --% /c someapp | someOtherApp
๊ฐ์ ๊ฒ์ ํธ์ถ ํ ์์๊ณ cmd๊ฐ ํ์ดํ ๋ผ์ธ์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค. PowerShell์ ์ฌ์ ํ โโํ์ดํ ๋ผ์ธ (๊ทธ๋ฆฌ๊ณ Unix ์ฌ์ฉ์์๊ฒ ์ ์ฉ ํ &&
๋ฐ ||
&&
๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ฒ)์ ๊ธฐ๋ณธ ๋ช
๋ น์ ์ ๋ฌํ๋ ๋์ PowerShell ํ ํฐ์ผ๋ก ํด์ํฉ๋๋ค. ์ธ์ ๋ฌธ์์ด.
Linux์ SHELL (๊ธฐ๋ณธ๊ฐ์
/bin/bash
)
์๋์ : Unix ๊ณ์ด ํ๋ซํผ์ _system_ ์
ธ์ _invariably_ /bin/sh
์
๋๋ค.
์ด๊ฒ์ ์ฃผ์ด์ง _user's_ ๋ํ ํ ์
ธ ( $env:SHELL
๋ฐ์๋จ-๊ทธ๋ฌ๋ ์ํ๊น๊ฒ๋ ํ์ฌ _PowerShell_์ด ์ฌ์ฉ์์ ์
ธ์ธ ๊ฒฝ์ฐ # 12150 ์ฐธ์กฐ)๊ณผ๋ ๋ค๋ฆ
๋๋ค. ์ด๋ (a) ๊ตฌ์ฑ ๊ฐ๋ฅํ๊ณ (b) ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. _defaults to_ /bin/bash
,ํ์ง๋ง macOS๊ฐ ์ต๊ทผ์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ์ํ ๊ธฐ๋ณธ ๋ํ ํ ์
ธ๋ก /bin/zsh
๋ก ์ ํ ํ ๊ฒ์ผ๋ก ์
์ฆ ๋์ ๋ฏ์ด ๊ทธ๊ฒ์ ์ฃผ์ด์ง ๊ฒ์ด ์๋๋๋ค.
Windows์์ ํ๊ฒฝ ๋ณ์
COMSPEC
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ข์ ์ ์ Windows์์ ์์คํ ์ ธ (๋ช ๋ น ์ธํฐํ๋ฆฌํฐ)์ ์ฐธ์กฐํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ทธ์ ๋ฐ๋ผ ์ ์ ์ํ ๋ช ๋ น์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
PS v7.x์์ ์ ๊ฐ ์ ๋ง๋ก ์ํ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ ์ค ํ๋๋์ด RFC ์์ ๋ ผ์ ๋ ๊ฒ์ฒ๋ผ
set -e
์ ๊ฐ์ด ๋ด ์คํฌ๋ฆฝํธ๋ฅผ ์ค์งํ๋ ์ค๋ฅ ์ฝ๋์ ํจ๊ป ๊ธฐ๋ณธ ๋ช ๋ น์ ์ข ๋ฃํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ๊ฐ์ ๊ฒฝ์ฐInvoke-NativeCommand
, ๊ทธ ๋ฆฌ์คํ ์ ํผ๋ ๊ฒInvoke-NativeShell
?๋ด๊ฐ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ ํธ์ถ์ ์ํ๋๋งํผ msbuild, cl, cmake, Conan, npm ๋ฑ์ ํธ์ถ ํ ๋ ๋น๋ ๋ฐ ํ ์คํธ ์คํฌ๋ฆฝํธ๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ ์ด๋ฌํ ๊ธฐ๋ณธ ๋ช ๋ น์ด ์ข ๋ฃ๋๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ์ํ๋ฅผ ์กฐ๊ธ ์์ผ๋ก ์ฌ์ํ๋ ค๊ณ ํฉ๋๋ค. ํญ์ $ LASTEXITCODE๋ฅผ ํ์ธํ๋ ๊ฒ์ ๊ธฐ์ตํ ํ์์์ด 0์ด ์๋ ์ข ๋ฃ ์ฝ๋. ๊ตฌํ์ด
$PSNativeCommandInErrorActionPreference
๊ฐ์ ๋ค๋ฅธ ํ๊ฒฝ ์ค์ ๋ณ์๋ฅผ ํตํด ์ด๋ฃจ์ด ์ก๋ค๋ฉด ์ด๊ฒ์ด ๋ค์ดํฐ๋ธ ์์ ํธ์ถ์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค-๋ค์ดํฐ๋ธ "๋ช ๋ น"๊ณผ ๋ชจ๋ ๊ฒ์ ๋๊น?
์ด๋ฅผ Start-NativeExecution
build
๋ชจ๋์ Start-NativeExecution
์ด ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ณด์๋ค. ๋์ค์ 0์ด ์๋ ์ข
๋ฃ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด Start-NativeExecution
์ Invoke-NativeShell
์ ํํ ์ด๋ป๊ฒ ๊ฒฐํฉํด์ผํฉ๋๊น? PR # 3523๊ณผ ๊ฐ์ ๊ฒ์ด์ด ํตํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์๋ํ๊ธฐ๋ฅผ ์ ๋ง ๋ฐ๋๋๋ค. ๋ ์ฌ๋์ด ํจ๊ป ์๋ํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํธ์ถ ๋ค์ดํฐ๋ธ๊ฐ cmdlet (Invoke-NativeShell ๋-%)์ผ๋ก ๊ตฌํ๋๋ ๊ฒฝ์ฐ -ErrorAction Stop
๊ตฌํํ์ฌ 0์ด ์๋ ์ข
๋ฃ ์ฝ๋์์ ๋ฐ์ (์ข
๋ฃ ์ค๋ฅ) ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
-%์๋ ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ์์ด Powershell ํ์ดํ ๋ผ์ธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์ ์ ์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ins / invoke-nativecommand๋ณด๋ค ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ๋ ์ด์ ๋ถ์กฑํ์ง ์์ต๋๋ค. LHS์์ ๊ตฌ๋ถํ๊ฑฐ๋ ๊ณต๊ธํด์ผํ๋ ๊ฒฝ์ฐ here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ผ ๋ช ๋ น๋ฌธ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก
cmd --% /c someapp | someOtherApp
๊ฐ์ ๊ฒ์ ํธ์ถ ํ ์์๊ณ cmd๊ฐ ํ์ดํ ๋ผ์ธ์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค. PowerShell์ ์ฌ์ ํ โโํ์ดํ ๋ผ์ธ (๊ทธ๋ฆฌ๊ณ Unix ์ฌ์ฉ์์๊ฒ ์ ์ฉ ํ&&
๋ฐ||
&&
๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ฒ)์ ๊ธฐ๋ณธ ๋ช ๋ น์ ์ ๋ฌํ๋ ๋์ PowerShell ํ ํฐ์ผ๋ก ํด์ํฉ๋๋ค. ์ธ์ ๋ฌธ์์ด.
์, ํ์ฌ ๋์ @ vexx32๋ฅผ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ --%
์ ํ์ฌ ํ๋์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ง ์์ต๋๋ค (์ ์ด๋ ์ ๋ ์๋๋๋ค). ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํฅ์์ํค๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์๋ก ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๋๋์ด ๋๋ ์ด์ ๋ ๋ฌด์์
๋๊น? :)
์์์ ๋งํ๋ฏ์ด, --%
์ ํจ๊ป ์๋ํ๋๋ก &
์ ํฅ์์ํฌ ์ ์์ผ๋ฏ๋ก ์ด๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค . ๋ํ ์์ ์ ๋ค์ดํฐ๋ธ exec ๋ ์ธ์๊ฐ์๋ ์
ธ์ ๋ช
์ ์ ํธ์ถ์ ๋ํด ๋ช
ํํํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋
ธ๋ จํ Windows ์ฌ์ฉ์์๊ฒ๋ ๋ค๋ฅธ ์คํ ํ์ผ์ "์คํ"ํ๋ ค๋ฉด ์ด๋ป๊ฒ ๋ cmd.exe (์)๊ฐ ํ์ํ๋ค๋ ์ง์์ ์ธ ํผ๋์ ์์ธ์
๋๋ค. linux / osx์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค.
์, _current_ ๋์ @ vexx32๋ฅผ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋
--%
์ _current_ ํ๋์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ง ์์ต๋๋ค (์ ์ด๋ ์ ๋ ์๋๋๋ค)-์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํฅ์์ํค๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์๋ก ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๋๋์ด ๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? :)
๋ฐ๋ผ์ --%
์กฐ์ ์ ๋ํ ํ์ฌ ํผ์น๋ ๋ช
๋ น ์ด๋ฆ์ด ์ผ๋ฐ์ ์ผ๋ก์๋ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์์๋ ๋ชจ๋ ํญ๋ชฉ์ด์๋ ๊ทธ๋๋ก (์ ์ค๊น์ง) ๊ตฌ๋ฌธ ๋ถ์ --%
๋ฐ ๊ธฐ๋ณธ ๋ช
๋ น ํ๋ก์ธ์๊ฐ ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ณด์๋ค. ๋์ค์ 0์ด ์๋ ์ข ๋ฃ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด
Start-NativeExecution
์Invoke-NativeShell
์ ํํ ์ด๋ป๊ฒ ๊ฒฐํฉํด์ผํฉ๋๊น? PR # 3523๊ณผ ๊ฐ์ ๊ฒ์ด์ด ํตํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ์๋ํ๊ธฐ๋ฅผ ์ ๋ง ๋ฐ๋๋๋ค. ๋ ์ฌ๋์ด ํจ๊ป ์๋ํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํธ์ถ ๋ค์ดํฐ๋ธ๊ฐ cmdlet (Invoke-NativeShell ๋-%)์ผ๋ก ๊ตฌํ๋๋ ๊ฒฝ์ฐ-ErrorAction Stop
๊ตฌํํ์ฌ 0์ด ์๋ ์ข ๋ฃ ์ฝ๋์์ ๋ฐ์ (์ข ๋ฃ ์ค๋ฅ) ํ ์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
ํ์ฌ Start-NativeExecution { Invoke-NativeShell <strong i="10">@whatever</strong> }
์
๋๋ค.
์ด ์ ์ ์ ํ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ins / invoke-nativecommand๋ณด๋ค ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ ๋ ์ด์ ๋ถ์กฑํ์ง ์์ต๋๋ค. LHS์์ ๊ตฌ๋ถํ๊ฑฐ๋ ๊ณต๊ธํด์ผํ๋ ๊ฒฝ์ฐ here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋จ์ผ ๋ช ๋ น๋ฌธ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
Invoke-NativeShell
๋ ์ผ๋ฐ ๋ช
๋ น์ด๊ธฐ ๋๋ฌธ์ ๋ซ๊ธฐ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ _need_ํ์ง ์์ง๋ง --%
์ ๊ณตํฌ๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
Linux์ SHELL (๊ธฐ๋ณธ๊ฐ์
/bin/bash
)์๋์ : Unix ๊ณ์ด ํ๋ซํผ์ _system_ ์ ธ์ _invariably_
/bin/sh
์ ๋๋ค.
๋๋ ๊ทธ ์ผ์ด ์คํ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ง๋ค๊ณ ์คํํ๋ ๊ฒ๊ณผ ๋์ผํด์ผํ๋ค๊ณ ์๊ฐํ๋ค. ์ด๊ฒ์ ์ฌ๋ฐ๋ฅธ ์์ ์ ํํ๋ ์์
์ ์ด์ ์ฒด์ ์ ์์ํ๊ณ ์ฐ๋ฆฌ๋ ์ ๊ฒฝ ์ฐ์ง ๋ง์์ผํ๋ค. #!
์์ํ๋ ๊ฒฝ์ฐ๋ ํฌํจ๋ฉ๋๋ค.
Invoke-NativeShell
์ ๊ธฐ๋ณธ ๊ฐ๋
์ ๊ธฐ๋ณธ ์
ธ์ _CLI_์ ํธ๋ฆฌํ ๋ํผ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค.
Unix์์๋ ์ด๊ฒ์ผ๋ก ์ถฉ๋ถํ๋ฉฐ ๋ณด์กฐ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํ๋ฉด ์ถ๊ฐ ์ค๋ฒ ํค๋๊ฐ ๋ฐ์ํ ๋ฟ๋ง ์๋๋ผ $0
(์คํฌ๋ฆฝํธ ํ์ผ ๊ฒฝ๋ก)์ ์์์ ๊ฐ์ด๋ณด๊ณ ๋๋ ๋ฐ๋ฉด CLI๋ฅผ ํตํ ํธ์ถ์๋ ์์๋๋ก /bin/sh
๊ฐ ํฌํจ๋ฉ๋๋ค sh -c 'echo $0' foo
)์ ํจ๊ป ์ฝ๋ ์ธ์๋ฅผ ๋ฐ๋ผ ๋ช
์ ์ ์ผ๋ก ์ค์ ํ ์๋ ์์ต๋๋ค.
#!/bin/sh
๋ก ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์ /bin/sh
์ง์ ํธ์ถํ๋ ๊ฒ์ฒ๋ผ ๋ช
์ ์ ์ผ๋ก ์ ์ฒด ๊ฒฝ๋ก๋ก ์์คํ
์์ ๋์์ผ๋ก ์ง์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค).Windows์์ ๋ฐฐ์น ํ์ผ _would_๋ฅผ ํตํ ์คํ์ %
์ด์ค์ผ์ดํ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ผ๋ฏ๋ก ์ด์ ์ ์ ๊ณตํฉ๋๋ค (ํ์ง๋ง $env:ComSpec
์์ ํ ์์๋ ์์คํ
์
ธ ์ฐพ๊ธฐ ์์
์ ์์ํ๋ ๊ฒ์ ์๋). ๊ทธ๋ฆฌ๊ณ ์์์ ์ธ๊ธ for
๋์.
ํ์๋ฅผ ์์๋ก ๋ค๋ฃจ๊ธฐ ์ํด (์ฌ์ฉ์๊ฐ ์์ ์ ๋ณด์กฐ ๋ฐฐ์น ํ์ผ์ ์์ฑํ ํ์๊ฐ ์๋๋ก) ๊ฐ๋
์ ๋ช
ํ์ฑ์ ์ํด ๋ค์์ ์ ๊ณต ํ ์ ์์ต๋๋ค.
-AsBatchFile
_opt-in_์ผ๋ก ์ ํํฉ๋๋ค.
์ฆ ๋์ค์ ๋๋ค์ ์๋ค๋ ํฉ์๊ฐ์๋ ๊ฒฝ์ฐ ๋งํ๋ค cmd
์ฌ์ฉ ๋ช
๋ น ์ค ์ปท ์ค ํ์ด์คํธ (๋ง์์ _batch - file_ ์๋ฏธ๋ก ๊ธฐ๋ก ๋์ด %%i
๋ณด๋ค๋ %i
๋ฃจํ ๋ณ์๋ก, ์ถ์ด %
as %%
), ์๋ง๋ ํญ์ aux๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ค์ผ์ดํํ๋ ๊ธฐ๋ฅ. ๋ฐฐ์น ํ์ผ _on Windows_ (Unix์์ CLI๋ฅผ ๊ณ ์ํ๋ฉด์)๊ฐ ๋ ๋์ ์๋ฃจ์
์
๋๋ค. ์ ๋ ์ด๊ฒ์ ๋ํด ๊ฐํ๊ฒ ๋๋ผ์ง ์์ง๋ง ํนํ ๋ค๋ฅธ ์คํฌ๋ฆฝํ
์ธ์ด์ ๋ค๋ฅธ ๋์์ ๋ํ๋ด๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ๋ช
ํํ๊ฒ ๋ฌธ์ํํด์ผํฉ๋๋ค.
๋ฟก๋ฟก
๋์๊ฒ ๋งํฌํ๋ ๋ค์ดํฐ๋ธ ์ค๋ฅ ํตํฉ RFC ๋ # 1995์ฒ๋ผ ๊ธด๊ธํ๊ฒ ํด๊ฒฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋ ๋ค PowerShell์์ (๊ฐ๋ ์ ์ผ๋ก ๊ฐ๋ฅํ ํ ๋ง์ด) ์ธ๋ถ ํ๋ก๊ทธ๋จ (๋ค์ดํฐ๋ธ ์ ํธ๋ฆฌํฐ)์ ์ผ๋ฅ ์๋ฏผ์ผ๋ก ๋ง๋๋ ๋ฐ ํ์ํ ๋จ๊ณ๋ฅผ ๋ํ๋ ๋๋ค.
์ผ๋ฅ ์๋ฏผ์ด๋๋ค๋ ๊ฒ์ ๋ค์์ ์๋ฏธํฉ๋๋ค. cmdlet์ ํตํด _๊ฐ ์๋๋ผ _direct_ ํธ์ถ ( &
์ ์ํฉ์ ๋ฐ๋ผ _syntactic_ ์ด์ ๋ก ๋ง ํ์ํจ).
์ฆ, Invoke-NativeCommand
cmdlet ๋๋ Start-NativeExecution
cmdlet์ด ์์ด์ผํฉ๋๋ค.
(์ ์ธ๋ก : Start-NativeExecution
build
๋ชจ๋์ ๋ง์ ํจ์๊ฐ Start
์ ํธ _asynchronous_ ์์
์ธ ๋ฐ๋ฉด Start-NativeExecution
์ด๋ฆ์ด ์๋ชป๋์์ต๋๋ค. https://github.com/MicrosoftDocs/PowerShell-Docs/issues/4474์์ Start-Sleep
).
๋ฐ๋ผ์ Invoke-NativeShell
์๋ ํน๋ณํ ๊ณ ๋ ค ์ฌํญ์ด ํ์ํ์ง ์์ต๋๋ค. PowerShell์ ์ด๋ฏธ ์ํ ํ ๊ฒ์ฒ๋ผ ๋ค์ดํฐ๋ธ ์
ธ ์คํ ํ๋ก์ธ์ค ( cmd
/ sh
๋ณด๊ณ ํ ์ข
๋ฃ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก $LASTEXITCODE
๋ฅผ ์ค์ ํฉ๋๋ค. sh
)๊ฐ ํธ์ถ๋์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ RFC์์ ์ ์ ๋ ๋ฉ์ปค๋์ฆ์ด ์ง์ ํธ์ถ ๋ ์คํ ํ์ผ์ ๋ํด ์๋ํ๋ ๊ฒ์ฒ๋ผ ์๋ํฉ๋๋ค (์ : $PSNativeCommandErrorAction = 'Stop'
๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ $LASTEXITCODE
๊ฐ 0์ด ์๋๋ฉด ์คํฌ๋ฆฝํธ ์ข
๋ฃ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. )
(๋น ๋ฅธ ์ ์ณ๋๊ณ -์ด ํ ๋ก ์ ์ฌ๊ธฐ์ ์ํ์ง ์์ต๋๋ค : _per-call_ ๋ฉ์ปค๋์ฆ์ ๊ดํด์ :
/bin/ls nosuch || $(throw 'ls failed)
์ ๋ง์ฐฌ๊ฐ์ง๋ก /bin/ls nosuch || $(exit $LASTEXITCODE)
(POSIX ์์ /bin/ls nosuch || exit
). # 10967์ ์ ์ฐ๋ฆฌ๊ฐ $(...)
(๋ฌธ๋ฒ์ ํฐ ๋ณํ์์ด)๋ฅผ ํผํ ์ ์๋์ง ์ค๋ช
ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก $LASTEXITCODE
๋ช
์ ์ ์ผ๋ก ์ฐธ์กฐํด์ผํ๋ ๊ฒฝ์ฐ๋ ํผํ ์ ์์ต๋๋ค.)
(์ ์ธ๋ก : shebang ์ค
#!/bin/sh
๋ก ์ ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๊ฒ์/bin/sh
์ง์ ํธ์ถํ๋ ๊ฒ์ฒ๋ผ ๋ช ์ ์ ์ผ๋ก ์ ์ฒด ๊ฒฝ๋ก๋ก ์์คํ ์ ธ์ ๋์์ผ๋ก ์ง์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.)
๊ทธ๊ฒ์ ๋ด๊ฐ ๋งํ๊ณ ์ถ์ ๊ฒ์ด ์๋๋๋ค. ์ด์ ์ฒด์ ์์ด ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ PowerShell์ด โโ๊ธฐ๋ณธ ์
ธ์ด ๋ฌด์์ธ์ง ์ ํ์๊ฐ ์๋ค๊ณ ๋งํ๊ณ ์ถ์์ต๋๋ค. Linux๋ #!
์์ํ์ง ์๊ฑฐ๋ ๋ค์์ผ๋ก ์์ํ๋ ๊ฒฝ์ฐ ์คํ ๊ฐ๋ฅํ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค. #!/usr/bin/env python
์ ๊ฐ์ ๋ค๋ฅธ ๊ฒ, Windows๋ .CMD
์คํฌ๋ฆฝํธ๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ผ๋ฏ๋ก IMHO๋ %COMSPEC%
'n'ํญ๋ชฉ์ ๋ค์ฌ๋ค ๋ณด์ง ์์์ผํฉ๋๋ค. Windows๋ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ ์คํํ ์ ์์ง๋ง ์คํฌ๋ฆฝํธ ํ์ผ์ ํ์ฅ์๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ฏ๋ก์ด ๊ฒฝ์ฐ์๋ ๋ถ๋ช
ํ ์ ์ฉ๋์ง ์์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, Invoke-NativeShell
์ ๋ช
๋ น์ ๊ธฐ๋ณธ ์
ธ์ _CLI_๋ฅผ ํธ์ถํด์ผํ๋ฉฐ, ๋ณด์กฐ ์คํฌ๋ฆฝํธ ํ์ผ (๋ถ์์ฉ ํฌํจ)์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ฑํ์ง ์์์ผํฉ๋๋ค ( ์์์ ๋
ผ์ํ ๋ค๋ฅธ ์ด์ ์ ์ธ).
์์คํ
์
ธ์ ๊ฐ๋ ฅํ๊ฒ ๊ฒฐ์ ํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ์ฌ๊ธฐ์ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ๋ ์์ต๋๋ค. Windows์์ $env:ComSpec
๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ฒ๋ผ Unix์์ /bin/sh
๋ฅผ ํ๋ ์ฝ๋ฉํ๋ ๊ฒ์ด ์๋ฒฝํ๊ฒ ์ ์ ํฉ๋๋ค.
์๋์, ์์คํ
ํธ์ถ ์์ค์ Unix ํ๋ซํผ์ ์คํ ๊ฐ๋ฅํ ์ผ๋ฐ ํ
์คํธ ํ์ผ์ _ shebang ์ค์์ด _ ์คํํ๋ ๋ฐฉ๋ฒ์ _ ์์ง ๋ชปํฉ๋๋ค _; _can_ ์ด๋ฌํ ํ์ผ์ ํธ์ถ ํ ์ ์๋ค๋ ๊ฒ์ POSIX์ ์ ์ฌํ ์์ ํธ๋ฆฌํ ๊ธฐ๋ฅ์
๋๋ค. exec
๋ฅผ ์๋ํ ๋ค์ _for them_์ผ๋ก ์์ฑ๋ ํ์ผ์ ํด์ํ๋๋ก _fall back_; ์ฆ, ์คํ์ค์ธ POSIX์ ์ ์ฌํ ์์ด ํ์ผ ์คํ์ ์ข
๋ฃํ๋ ๋ฐ๋ฉด PowerShell์์ด ์์ ํด๋ฐฑ์ ๊ตฌํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ํ _fails_์
๋๋ค ( Program 'foo' failed to run: Exec format error
์ป์ต๋๋ค).
๋งํ ํ์๋์์ด ์ด๋ฌํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค.
์๋์, ์์คํ ํธ์ถ ์์ค์ Unix ํ๋ซํผ์ ์คํ ๊ฐ๋ฅํ ์ผ๋ฐ ํ ์คํธ ํ์ผ์ _ shebang ์ค์์ด _ ์คํํ๋ ๋ฐฉ๋ฒ์ _ ์์ง ๋ชปํฉ๋๋ค _; ์ฌ์ ํ _can_ ์ด๋ฌํ ํ์ผ์ ํธ์ถ ํ ์ ์๋ค๋ ๊ฒ์ POSIX์ ์ ์ฌํ ์์ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ ๋๋ค.
exec
๋ฅผ ์๋ํ ๋ค์ _ ๋์ฒด _ ํด๋น ํ์ผ์ _for them_์ผ๋ก ํด์ํฉ๋๋ค. ์ฆ, ์คํ๋๋ POSIX์ ์ ์ฌํ ์์ด ํ์ผ ์คํ์ ์ข ๋ฃํ๋ ๋ฐ๋ฉด PowerShell์์ด ์์ ํด๋ฐฑ์ ๊ตฌํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋จ์ํ _fails_์ ๋๋ค (Program 'foo' failed to run: Exec format error
์ป์ต๋๋ค).
csh
๋ POSIX์ ์ ์ฌํ์ง ์์ผ๋ฉฐ ๋ฒ ์ด ์คํฌ๋ฆฝํธ exec
์์ ์คํจํ์ง ์์ต๋๋ค. sh
ํธ์ถํฉ๋๋ค. perl
๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
์ด๊ฒ์ด ๋ด ์์ ์ ๋ง๋๋ ๊ฒ์ด ๋ถ๋ช
ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฌด์์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ _ ๊ฐ ์์ ๋ฌ๋ ค ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ / ์คํฌ๋ฆฝํ
์ธ์ด๋ ๋ค๋ฅธ ์ผ์ํฉ๋๋ค. PowerShell์ ํ์ฌ ์คํจํฉ๋๋ค. ์ ํ์ํด์ผํ๊ณ ๊ทธ ์ ํ์ /bin/sh
์ํ๋ค๋ฉด ๋ค์ ์์ ์ผ๋ก ๋์ ์์ต๋๋ค. /bin/sh
๋ฅผ ๊ฐ์ ํด์ผํฉ๋๋ค.
์ด๊ฒ์ด ๋ด ์์ ์ ๋ง๋๋ ๊ฒ์ด ๋ถ๋ช ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ฌด์์ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ _ ๊ฐ ์์ ๋ฌ๋ ค ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ / ์คํฌ๋ฆฝํ ์ธ์ด๋ ๋ค๋ฅธ ์ผ์ํฉ๋๋ค. PowerShell์ ํ์ฌ ์คํจํฉ๋๋ค. ์ ํ์ํด์ผํ๊ณ ๊ทธ ์ ํ์
/bin/sh
์ํ๋ค๋ฉด ๋ค์ ์์ ์ผ๋ก ๋์ ์์ต๋๋ค./bin/sh
๋ฅผ ๊ฐ์ ํด์ผํฉ๋๋ค.
exec
์ perl
์ (๋) ์ง์ ์์คํ
ํธ์ถ์ด๋ฉฐ perl
๋ ์ด๋ค ์์ผ๋ก๋ ์์ ํ์ง ์์ต๋๋ค. ํนํ ์ธํฐํ๋ฆฌํฐ๋ฅผ _ ์ ํ _ํ์ง ์์ต๋๋ค.
๋ฌผ๋ก ์ฌ์ฉ์๊ฐ ์์ ๋ฐ์ดํ (verbatim)์ ํฐ ๋ฐ์ดํ (๋ณด๊ฐ) ๋ฌธ์์ด์ ์ฐจ์ด์ ๊ณผ
$
์ ํ์ `
์ด์ค์ผ์ดํ์ ๋ํด ์๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ง๋ง ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. (๊ณ ๊ธ) ์ต์ ์ด ์์ต๋๋ค.
๋๋ฟ ์ผ ์๋ ์์ง๋ง -f
ํ๋์ "
์ฒ
๋ฟก ๋นต๋จ
perl์ exec๋ ์ง์ ์์คํ ํธ์ถ์ด๋ฉฐ, perl์ ์ด๋ค ์์ผ๋ก๋ ์์ ํ์ง ์์ต๋๋ค. ํนํ ํต์ญ์ฌ๋ฅผ ์ ํํ์ง ์์ต๋๋ค.
#!
์ค์ด์๋ ์คํฌ๋ฆฝํธ์์ ์๋ํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ค์ด ์๋๋๋ค. Linux์ exec syscall์ #!
์์ด๋ ์๋ํ์ง ์์ต๋๋ค. ์ฝ๊ฒ ํ
์คํธ ํ ์ ์์ต๋๋ค.
user@Programming-PC:/tmp/exec_test$ ls
test.c testscript
user@Programming-PC:/tmp/exec_test$ cat test.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv) {
char *binaryPath = "./testscript";
execl(binaryPath, binaryPath, NULL);
perror("Error");
return 0;
}
user@Programming-PC:/tmp/exec_test$ gcc test.c -o testexecutable
user@Programming-PC:/tmp/exec_test$ chmod +x testscript
user@Programming-PC:/tmp/exec_test$ cat testscript
echo test from script
user@Programming-PC:/tmp/exec_test$ #works from shell:
user@Programming-PC:/tmp/exec_test$ ./testscript
test from script
user@Programming-PC:/tmp/exec_test$ #doesn't work via exec syscall:
user@Programming-PC:/tmp/exec_test$ ./testexecutable
Error: Exec format error
user@Programming-PC:/tmp/exec_test$ vim testscript
user@Programming-PC:/tmp/exec_test$ cat testscript
#!/bin/sh
echo test from script
user@Programming-PC:/tmp/exec_test$ #exec syscall works with #! line:
user@Programming-PC:/tmp/exec_test$ ./testexecutable
test from script
user@Programming-PC:/tmp/exec_test$ uname -a
Linux Programming-PC 4.4.0-176-generic #206-Ubuntu SMP Fri Feb 28 05:02:04 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
user@Programming-PC:/tmp/exec_test$
ํธ์ง : ๋ฐฉ๊ธ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ execlp
๋ฅผ ์ฌ์ฉํ๋ฉด man ํ์ด์ง์ ๋ฐ๋ผ :
ํ์ผ์ ํค๋๊ฐ ์ธ์๋์ง ์๋ ๊ฒฝ์ฐ (์๋ํ execve (2)๊ฐ ENOEXEC ์ค๋ฅ๋ก ์คํจ),์ด ํจ์๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉํ์ฌ ์ ธ (/ bin / sh)์ ์คํํฉ๋๋ค. (์ด ์๋๊ฐ ์คํจํ๋ฉด ๋ ์ด์ ๊ฒ์์ด ์ํ๋์ง ์์ต๋๋ค.)
๊ทธ๋ฌ๋ ์ด๊ฒ์ "linux"์ ๊ธฐ๋ฅ์ด ์๋๋ผ gnu c ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฅ์
๋๋ค. ๋งจ ํ์ด์ง์ ๋ฐ๋ฅด๋ฉด ๋ช
์ ์ ์ผ๋ก / bin / sh๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ์
ธ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ( posix/execvpe.c
( new_argv[0] = (char *) _PATH_BSHELL;
) ๋ฐ sysdeps / unix / sysv / linux / paths.h (๋๋ sysdeps / generic / paths.h ์์ค์ ํ๋ ์ฝ๋ฉ๋์ด ์์ -์ด๋ค ํค๋๊ฐ ์ค๊ณ ...) ( #define _PATH_BSHELL "/bin/sh"
))
๊ทธ๋ฌ๋ ์ด๊ฒ์ "linux"์ ๊ธฐ๋ฅ์ด ์๋๋ผ gnu c ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฅ์ ๋๋ค. ๋งจ ํ์ด์ง์ ๋ฐ๋ฅด๋ฉด ๋ช ์ ์ ์ผ๋ก / bin / sh๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ์ ธ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. (
posix/execvpe.c
(new_argv[0] = (char *) _PATH_BSHELL;
) ๋ฐ sysdeps / unix / sysv / linux / paths.h (๋๋ sysdeps / generic / paths.h ์์ค์ ํ๋ ์ฝ๋ฉ๋์ด ์์ -์ด๋ค ํค๋๊ฐ ์ค๊ณ ...) (#define _PATH_BSHELL "/bin/sh"
))
sysdeps/**/linux
์์ ์๊ธฐ ๋๋ฌธ์ Linux ์ ํ์
๋๋ค. ๋ํ ์ผ๋ฐ์ ์ธ ๊ฒ์ผ ์๋ ์์ง๋ง ์ฌ์ ์ ํ ์ ์์ต๋๋ค. ๋ถ๋ช
ํ ๋ก์ปฌ์ด ์๋๋ผ OS๋ณ๋ก์
๋๋ค.
์, _current_ ๋์ @ vexx32๋ฅผ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋
--%
์ _current_ ํ๋์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ง ์์ต๋๋ค (์ ์ด๋ ์ ๋ ์๋๋๋ค)-์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ํฅ์์ํค๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์๋ก ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ๋๋์ด ๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? :)๋ฐ๋ผ์
--%
์กฐ์ ์ ๋ํ ํ์ฌ ํผ์น๋ ๋ช ๋ น ์ด๋ฆ์ด ์ผ๋ฐ์ ์ผ๋ก์๋ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ์์๋ ๋ชจ๋ ํญ๋ชฉ์ด _as is_ (์ ์ค๊น์ง) ๊ตฌ๋ฌธ ๋ถ์๋๊ณ bash / cmd๋ก ์ง์ ์ ์ก๋๋ค๋ ๊ฒ์ ๋๋ค. here-strings์ ๊ฐ์ PowerShell ๊ตฌ๋ฌธ์ ์ฌ์ง๊ฐ ์์ผ๋ฉฐ--%
๋ฐ ๊ธฐ๋ณธ ๋ช ๋ น ํ๋ก์ธ์๊ฐ ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค ๋ง์์ฌ ... ๋ค๋ค ๋ ํธ๋กคํ๋ ค๋ ๊ฑด๊ฐ์? ๐ ์๋์, Patrick-powershell ํํ์์ ์ฌ์ฉํ๋ ค๋ฉด --%
์ ํจ๊ป here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ฌ๋ฌ ์ค์ ์ํ๋ฉด here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค. ๋ณ์ ๋์ฒด์์ด ๋ค์ค ํ์ ์ํ๋ฉด ์์ ๋ฐ์ดํ here-string์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์จ๋ ,์ด ๊ฒ์์๋ ์คํจ์ด์๊ณ ์ถฉ๋ถํ ๋งํ ๊ฒ ๊ฐ์์. ์ ธ ๋ด์์ ๋ค๋ฅธ ์ ธ๋ก ์ฐ๊ธฐํ๊ธฐ ์ํด cmdlet์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ฌ์ ํ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ํฌ๋ฅธ ๊ฒ๋ฟ์ ๋๋ค. cmdlet์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ ธ์ ์คํํ์ฌ ์ฒ์์ ๋ณด์กฐ ์ ธ์ด ํ์์๋ ๊ธฐ๋ณธ ๋ช ๋ น์ ์คํํ๋ ๊ฒฝ์ฐ ํนํ ์ํฌ ๋ฆ ๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋์ ๋์๊ฐ ๋๋ค.
ํธ์ง : ๋ง์ง๋ง ๋จ์ด
์ด ํญ๋ชฉ์ ์ ๋ชฉ์ "call native operator"์
๋๋ค. &
ํธ์ถ ์ฐ์ฐ์๊ฐ ์ด๋ฏธ ์๊ณ ๋ค์ดํฐ๋ธ ๋ช
๋ น ์ธ --%
์ธ์๋ฅผ ์ ๋ฌํ๋๋ก ์ค๊ณ๋ ํ ํฐ์ด ์ด๋ฏธ์์ ๋ ๋ญ๋น๋๋ ๊ธฐํ๊ฐ ์์ต๋๋ค. ์ง๊ธ์ &
์ ํจ๊ป --%
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ธ์๋์ง ์์ผ๋ฏ๋ก์ด ์๋๋ฆฌ์ค๋ฅผ ํ์ฑํํ๊ณ ์ฌ๊ธฐ์์ ๋
ผ์๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํน์ ๋์์ ์ ๊ณตํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์
๋์ง ์์ต๋๋ค.
powershell ํํ์์ ์ฌ์ฉํ๋ ค๋ฉด
--%
์ ํจ๊ป here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ฌ๋ฌ ์ค์ ์ํ๋ฉด here-strings๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ฐ์ฐ์์ ์์ ์ ๋ง ๊ทธ๋๋ก PowerShell ๊ตฌ๋ฌธ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ ๋ฌธ์์ด ๊ฐ์ ๊ฒ์ ์์ต๋๋ค. ์์ ๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์ ๊ฐ์ ๊ฒ์ ์์ต๋๋ค. "ํ ์คํธ๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด๋ด๊ธฐ"๊ฐ ์๋๋ผ "ํํ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ๊ฐํ๊ณ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๊ฐ์ ๋ณด๋ ๋๋ค"์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ :
--% @'
echo my native command
'@
๋ค์๊ณผ ๊ฐ์ด ๋ฒ์ญ๋ฉ๋๋ค.
cmd.exe /c "@'"
echo my native command
'@
'@
๋ @๋ฅผ ํฌํจํ๋ ์์ ๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด ์์์ ์์์ผ ๋ฟ์ด๋ฏ๋ก ํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ins
์ ํผ์น์ ๊ฑฐ์ ๊ฐ๋๋ก ๊ตฌํ์ ๋ค๋ฅด๊ฒ ์์ํ๊ณ ์์ ์ ์์ง๋ง ์๋ --%
์ ๋ํด ๋
ผ์์ค์ธ ํ์ฌ ํผ์น์
๋๋ค.
๋ํ ์ด๊ฒ์ด ๊ธฐ์กด ๊ธฐ๋ฅ์ด ์๋ํ๋ ๋ฐฉ์์ด๋ผ๋ ์ ๋ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ด ์์ ๋ ๊ฑฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
cmd /c --% @'
echo my native command
'@
๋ค์ ํ๋ฒ ๋งํ๋ค:
ํ์ฌ, & with-%๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ธ์ / ์ ์๋์ง ์์ผ๋ฉฐ ๋ฐ๋ผ์์ด ์๋๋ฆฌ์ค๋ฅผ ํ์ฑํํ๊ณ ์ฌ๊ธฐ์์ ๋ ผ์๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํน์ ๋์์ ์ ๊ณต ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์ ๋์ง ์์ต๋๋ค.
๋ ๋ช
ํํ๊ฒ ์ฒ ์๋ฅผ ์ค๋ช
ํ๊ฒ ์ต๋๋ค. &
์ ํจ๊ป ์ฌ์ฉํ ๋ ์ฌ๊ธฐ ๋ฌธ์์ด์ด --%
๋ค์ ์ค๋๋ก ํ์ฉ
Hah ๊ทธ๊ฑฐ ํฐ ํ-๋ค, ๋ ์ณค์ด์, ๋ฏธ์ ํด์ @oising.
์ด ์์ด๋์ด์ ๋ํด --%
๊ฐ ์ผ๋ถ ์ปจํ
์คํธ์์๋ ๊ตฌ๋ฌธ ๋ถ์์ ์ค์งํ๊ณ ๋ค๋ฅธ ์ปจํ
์คํธ์์๋ "๋ค์ดํฐ๋ธ ์ธ์ ๋ฐ์ธ๋ฉ์์ ๋ ๋์ ์์
์ ์ํ"ํ๋ ๊ฒ์ด ์ฝ๊ฐ ํผ๋ ์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค (๋ง์ฐฌ๊ฐ์ง๋ก Invoke-NativeShell
๋์ ์๋ฏธํ๋ ๊ฒฝ์ฐ).
exec
, @TSlivede๋ฅผ ๋ ๊น์ด ํํค์ณ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์์ฝํด์์ด ์ ์ ์ ๋ซ๋๋กํ๊ฒ ์ต๋๋ค. Linux ๋ฐ macOS ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค.
๋ผ๋ ์ด๋ค ์์คํ
(๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ) ๊ธฐ๋ฅ์ด ์๋ค exec
์ ๋์ค์ ๊ด๋ จ๋ ๊ธฐ๋ฅ ๋ง _family_์ด exec
(๋๋ถ๋ถ ์ ๋์ฌ๋ก) ์ด๋ฆ์ด๋ค.
_system_ ํจ์ ( man
์น์
2
), execve
ํต์ฌ์ _fail_ shebang-less ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ค๊ณ ํ ๋.
์์คํ
ํจ์์์ _ ๋น๋ํ๋ _library_ ํจ์ _ ( man
์น์
3
- man 3 exec
), p
( "๊ฒฝ๋ก"์ ๋ํด ๊ฐ์ ) ์์คํ
์์ ๋ํ ํจ์ค ๋ฐฑ (์ : execlp
)์ด ์์ต๋๋ค.
/bin/sh
ํ๋ ์ฝ๋ฉํ๋ ๋ฐ๋ฉด, BSD ๊ธฐ๋ฐ ์ sh
์ฌ์ฉํ๊ณ sh
์ ์์กดํฉ๋๋ค. $env:PATH
(๋น๋ก man
ํ์ด์ง์ /bin/sh
์์ง๋ง).์ธ๊ธํ๋ฏ์ด _ ์ง์ ์คํ _์ ๊ฒฝ์ฐ ์ฃผ์ POSIX ์ ์ฌ ์
ธ ( bash
, dash
, ksh
๋ฐ zsh
)์ shebang์๋ ์คํฌ๋ฆฝํธ ์คํ์ผ๋ก ๋์๊ฐ๋๋ค. _themselves_, ์ด๋ exec
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ ์ค ๋์ฒด ๋ณํ์ ์ฌ์ฉํ์ง _ ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋์กฐ์ ์ผ๋ก perl
์ ์์ฒด exec
ํจ์๋ ํด๋ฐฑ์ ์์กดํ๋ ๊ฒ์ด ์์ต๋๋ค. ์ ์ฌํ๊ฒ, ์ฃผ์ POSIX ์ ์ฌ ์์ exec
_builtins_๋ bash
์ ์ธํ๊ณ ํด๋ฐฑ์ ์์กดํฉ๋๋ค.
Unix์์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์คํ
์
ธ ๊ฒฝ๋ก์ ๋ํด ํด๋ฐฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋์ผํ ๊ฐ์ ์ ํ ์ ์์ผ๋ฉฐ /bin/sh
๋ณด๋ค sh
/bin/sh
๋ฅผ ๊ถ์ฅ ํฉ๋๋ค. ๋ณด์ ๋ฐ ์์ธก ๊ฐ๋ฅ์ฑ :
sh
์ ์์น๋ฅผ โโ์ง์ ํ์ง ์๋ POSIX ์ฌ์ ์๋ ๋ถ๊ตฌํ๊ณ (์ฆ, ์๋ฐํ ๋งํ๋ฉด BSD ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๊ฐ ํธํ๋ฉ๋๋ค) :
/bin/sh
์ _ ์ฌ์ค์ _ ํ์ค ์์น์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. ์๋ํ๋ฉด shebang ํ์ด _full, literal_ ๋ง ์ง์ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ ์ฒด ๊ฒฝ๋ก๋ก sh
๋ฅผ ์ฐธ์กฐํ๋ ํด๋์ฉ Unix ์ _necessitates_๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ฒฝ๋ก ( #!/bin/sh
).
๋ฐ๋๋ก $env:PATH
sh
๋ฅผ ํตํด $env:PATH
์กฐ์ํ์ฌ ๋ค๋ฅธ sh
๋ฅผ ํธ์ถ ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋์ผํ ์ํ ์์น์ ์ ์ฉ cmd.exe
ํตํด $env:ComSpec
๊ทธ๋์ ์๋ง๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ํธ์ถํ๋ ๊ทธ๋ฐ๋ฐ, GetSystemDirectory
APPEND WinAPI๋ฅผ ๊ธฐ๋ฅ๊ณผ \cmd.exe
ํ ๊ทธ ๊ฒฐ๊ณผ ( $env:ComSpec
๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ ์ด์จ๋ ๋์ฒด๊ฐ ํ์ํฉ๋๋ค).
/bin/sh
์ _ ์ฌ์ค์ _ ํ์ค ์์น์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. ์๋ํ๋ฉด shebang ํ์ด _full, literal_ ๋ง ์ง์ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ ์ฒด ๊ฒฝ๋ก๋กsh
๋ฅผ ์ฐธ์กฐํ๋ ํด๋์ฉ Unix ์ _necessitates_๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฒฝ๋ก (#!/bin/sh
).
์ผ๋ฐ์ ์ผ๋ก #!/usr/bin/env sh
๋ผ๊ณ ๋งํฉ๋๋ค (์์คํ
์คํฌ๋ฆฝํธ ์ ์ธ).
์ผ๋ฐ์ ์ผ๋ก _don't_ : ์ธํฐ๋ท ๊ฒ์ "#! / bin / sh"๋ ์ฝ 3,900,000 ๊ฐ์ ์ผ์น๋ฅผ ์์ฑํ๊ณ "#! / usr / bin / env sh" ๋ ์ฝ 34,100 ๊ฐ์ ์ผ์น๋ฅผ ์์ฑํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก, ๋น์ ์ _shouldn't_ : ๋น์ ์ด ์์, _the_ ์์คํ
์์ ๋์์ผ๋ก ์ง์ ํ /bin/sh
๋ฌด์์ด๋ ์ง,ํ์ง sh
์ ํธ๋ฆฌํฐ๊ฐ ์ฒ์์ ์์ ์ผ์ด $env:PATH
.
sh
๋ผ๋ ์คํ ํ์ผ์ ๋์์ผ๋กํ๋ ์ ์ผํ ์ด์ ๋ ๊ฐ์ฅ ๋ฎ์ ๊ณตํต ๋ถ๋ชจ -assume-POSIX-features-only _system_ ์
ธ, ์ฆ /bin/sh
๋ฅผ ์ด์ ๊ฐ๋ฅํ๊ฒ ๋์์ผ๋ก ์ง์ ํ๊ธฐ์ํ ๊ฒ์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก _don't_ : ์ธํฐ๋ท ๊ฒ์ "#! / bin / sh"๋ ์ฝ 3,900,000 ๊ฐ์ ์ผ์น๋ฅผ ์์ฑํ๊ณ "#! / usr / bin / env sh" ๋ ์ฝ 34,100 ๊ฐ์ ์ผ์น๋ฅผ ์์ฑํฉ๋๋ค.
์น ๊ฒ์์ ์ฌ์ฉ์ ์คํฌ๋ฆฝํธ๋ก ์ ํ ํ ์์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ํนํ ๋ง์ ์ฌ์ฉ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์๋์ง ์์๊ณ ์คํ ๊ฐ๋ฅํ๋ค๊ณ ํด๋ execlp
์ ์์กด ํ ์ ์๊ธฐ ๋๋ฌธ์ ํนํ ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ์ฌ์ฉ์ ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ๋ ๊ฒ ๋งํ๋๋ผ๋ _normal_์ ๋ํด _customary_๋ฅผ ์ฌ์ฉํด์๋ ์๋ฉ๋๋ค. PowerShell์์ ์คํํ ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ์ ์คํฌ๋ฆฝํธ์
๋๋ค. ์ฌ์ฉ์๊ฐ ์
ธ์ ์ํ ๋ ํธ์ง์ฆ์ด ์๋๋ผ๋ฉด /bin/sh
์๋๋ผ sh
๋ฅผ ํธ์ถํฉ๋๋ค.
@oising
๊ธฐ๋ณธ ์ ธ ๋ช ๋ น ์ค _ ๋จ์ผ ๋ฌธ์์ด๋ก ์ ๋ฌ _ (์ด๋ค ๋ฌธ์์ด (-๋ฆฌํฐ๋ด) ํ์์ด ๊ฐ์ฅ ์ฌ์ด ์ง) ๋ฐ _only_ ๋จ์ผ ๋ฌธ์์ด๋ก ์ ๋ฌ (์ ๋์ค์์ ์ง์๋๋ ๋ช ๋ น ์ค ์ธ์์ ๋ํ ์ถ๊ฐ ์ ๋ฌ ( ๋ง) ์์์ ๋ ผ์)-๋์ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ๊ณตํต์ ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋ช ๋ น ์ค์ _single string_์ผ๋ก ์ ๋ฌํ๋ ๊ฒ์ ๋ค์์ ๋ํ ์ ์ ์กฐ๊ฑด์ ๋๋ค.
๋จ์ผ ๋ฌธ์์ด์ ์ ๋ฌํ๋ ๊ฒ์ ํธ์ถ์ด ์ํ ํ ์์
์ ๋ํ _ ์ง์ ๊ฐ๋
์ ํํ _์
๋๋ค. ๋ฐ๋๋ก _individual_ (์ ํ์ ์ผ๋ก ๋งจ๋ง) ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ PowerShell์์ ์ง์ ๋ค๋ฅธ ์
ธ์ ๊ตฌ๋ฌธ์ ์ง์ ํตํฉํ๋ ค๋ ์๋๋ ๊ธฐ์กด --%
์ด๋ฏธ ๊ตฌํ๋์ด์๋ ๊ทผ๋ณธ์ ์ธ ์ ํ๊ณผ ํจ๊ป ํผ๋์ค๋ฌ์ด ํํ์ ์ด๋ํ๋ ํด๊ฒฐ ๋ถ๊ฐ๋ฅํ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋จ์ผ ๋ฌธ์์ด ๋ช
๋ น ์ค์ ์ ๋ฌํ๊ธฐ ์ํด _operator_ ๋๋ _cmdlet_์ ์ ํํ๋ ๊ฒ์ด ์ค์ํ์ง ์๋ค๊ณ ์ฃผ์ฅ ํ ์ ์์ง๋ง (_discoverability_ ์ง๋ฌธ์ ์ ์ธ) &
์ฌ์ฉ์ ๋ํ ๊ฐ๋
์ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. --%
(์์ &
) :
&
๋ํ ์ฐ๋ ค : ๋ช
๋ น ์ค์ด ํฌํจ ๋-quoted-๋ฌธ์์ด์ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ _expression_ ๋ชจ๋์์ ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋ ๋ฐ๋ฉด &
ํ์ฌ _argument_ ๋ชจ๋๋ฅผ ์๋ฏธํฉ๋๋ค (์ฆ : _individual_ ์ธ์, ํ์ํ ๊ฒฝ์ฐ์๋ง ์ธ์ฉ). ๋ฐ๋ผ์ &
์ ์ฐธ์ฌ๋ ํผ๋ ์ค๋ฝ์ต๋๋ค.
--%
์ ๋ํ ์ฐ๋ ค๋ Windows ์ ์ฉ ์ถ์ฒ์ ๊ตฌ๋ฌธ ๋ถ์ ์ค์ง ๊ธฐํธ ์ธ --%
์ ํผ๋์ค๋ฌ์ด ์๋ฏธ์ ๊ดํ ๊ฒ์
๋๋ค. --%
๊ฐ _argument_ ๋ชจ๋์์ ์๋ํ๋ ๊ตฌ๋ฌธ ๋ถ์ ์ค์ง ๊ธฐํธ๋ก ์ฌ์ฉ๋๋ค๋ฉด ํนํ ํผ๋ ์ค๋ฌ์ธ ๊ฒ์
๋๋ค (์ :
& /bin/ls --% dir1 dir2
), & --%
_expression_ ๋ชจ๋์์ ์๋ (์ : & --% '/bin/ls dir1 dir2 >out.txt'
)
ํ ๊ฑธ์ ๋ฌผ๋ฌ์์ ํ์ฌ ๊ตฌํ ๋ ํ์ฑ ์ค์ง ๊ธฐํธ ์ธ --%
์ดํด ๋ณด๊ฒ ์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ๊ด๋ จ๋์ง ์์ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ ์๋์์ต๋๋ค (๋น์์๋ Windows์๋ง ํด๋น).
(a) ๋ค๋ฅธ ํ๋ซํผ์๋ ์ ์ฉ๋๋ ์ฌ์ฉ ์ฌ๋ก : cmd.exe
/ ๋ค์ดํฐ๋ธ ์
ธ์ฉ์ผ๋ก ์์ฑ๋ _command lines_์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ ํ ์ ์์ผ๋ฏ๋ก PowerShell์ ๊ตฌ๋ฌธ์ ์ ์ฉ ํ ํ์๊ฐ ์์ต๋๋ค.
(b) ํญ์ Windows ์ ์ฉ ๋ฌธ์ : PowerShell์ ์ผ๋ฐ์ ์ธ ๋นํ์ธ๋ ๋ค์ ์ธ์ฉ์ด ์ ๊ณต ํ ์์๋ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์ธ์ฉ ์คํ์ผ์ด ํ์ํ _rogue CLI_ (์ฆ, _single_ ์ธ๋ถ ์ฝ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ํธ์ถ)๋ฅผ ํธ์ถํ๊ฒ ์ต๋๋ค. , ์ต์ข ์ ์ผ๋ก ์ด๋ฌํ CLI _verbatim_์ ๋ํด WinAPI๋ก ์ ๋ฌ๋๋ ๋ช ๋ น ์ค์ ๋ง๋ค ์์๊ฒํ์ฌ. (๋ฌธ์ ์ค๋ช ์ ์ด๊ฒ์ผ๋ก ์ ํํ๊ธฐ ์ํด PowerShell์ ์ฌ ์ธ์ฉ์ด ์ผ๋ฐ์ ์ผ๋ก ์ ๋๋ก ์๋ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ๊ฒฐ์ฝ ์์์ต๋๋ค-์ด๊ฒ์ด # 1995์ ์ฃผ์ ์ ๋๋ค).
--%
์ (a)์ (b) ๋ชจ๋์ ๋ํ ์๋ฃจ์
์๋์ ํผ๋์ค๋ฌ์ด _conflation_์ผ๋ก ๊ตฌํ๋์์ผ๋ฉฐ ๊ฒฐ๊ตญ ๋ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ํด๊ฒฐํ์ง ๋ชปํ์ต๋๋ค.
(a)์ ๋ํ ํด๊ฒฐ์ฑ
์ผ๋ก ๊ด๊ณ ๋์์ง๋ง ์ค์ ๋ก๋ _ ์๋ฎฌ๋ ์ด์
ํ๋ ์ ์ผํ cmd
exe ๊ธฐ๋ฅ์ด %...%
-์คํ์ผ ํ๊ฒฝ ๋ณ์ ์ฐธ์กฐ _์ ํ์ฅ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ์ฌ๊ฐํ ์ ํ์ด ์์ต๋๋ค.
_single_ cmd
๋ช
๋ น ๋ง ์ง์ํฉ๋๋ค. |
(๋ฐ
&&
๋ฐ ||
, ๋น์ ๊ตฌํ๋์ง ์์๋๋ผ๋) cmd
๋ํ ํจ์ค ๋ถ๋ถ์ ์์ ์ ์ผ๋ก ์ข
๋ฃํฉ๋๋ค.
_single_ &
- cmd
s ๋ค์ค ๋ช
๋ น ๊ตฌ๋ถ ๊ธฐํธ-_is_๊ฐ ํต๊ณผํ์ง๋ง,์ด ์ญ์ _not_ ๊ฒฐ๊ณผ๋ก ๋ค์ค ๋ช
๋ น์ ์ง์ํฉ๋๋ค. ์๋ํ๋ฉด-์ดํ cmd
t ์ค์ ๋ก ๊ด๋ จ๋จ- &
๊ฐ _verbatim ๋์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ๋จ _; ์
echoArgs.exe --% a & b
๋ฐํฅ๋์ง ์๋ a
๋ค์ ํธ์ถ b
๊ทธ๊ฒ์ด ๊ทธ๋๋ก ์ธ์๋ฅผ ์ ๋ฌ a
, &
๋ฐ b
~ echoArgs
.
์ธ์ฉ๋์ง ์์ ์ธ์์์ cmd
์ ์ด์ค์ผ์ดํ ๋ฌธ์ ( ^
)๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๊ธฐ์กด ํ๊ฒฝ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ %...%
ํ ํฐ์ _invariably_ ํ์ฅ๋ฉ๋๋ค. ^
๋ฅผ ํตํด์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ ์๋๊ฐ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค (์ :
echoArgs.exe Don't expand %^USERNAME%
๋ cmd
ํ์ฅ์ ๋ฐฉ์งํ๊ณ _ ^
_๋ฅผ ์ ๊ฑฐํ๋ฉฐ PowerShell์์ echoArgs.exe --% Don't expand %^USERNAME%
๋ก ํธ์ถ ๋ ๋ ^
์ ์งํฉ๋๋ค.
(b)์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ถ์กฑํ์ต๋๋ค.
--%
์ดํ %...%
๋ฅผ ํตํด ์ฐธ์กฐํ๋ environment_ variable_; ์$env:FOO='foo'; echoArgs.exe --% %FOO%!
(a)์ ๋ํ ์ ์ ํ ํด๊ฒฐ์ฑ
์ ์ฌ๊ธฐ์ ์ค๋ช
๋๋๋ก Invoke-NativeShell
/ ins
์
๋๋ค.
(b)์ ๋ํ ์ ์ ํ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
--%
์ง์ins
์ ๋ง์ฐฌ๊ฐ์ง๋ก ํต๊ณผ ๋ช
๋ น ์ค์ ๊ตฌ์ฑํ๋ _ ๋จ์ผ ๋ฌธ์์ด _ ๋ค์ _ ์ ์ฒด์ ์ผ๋ก _, ๋ค์ ๋ฌธ์์ด ๋ณด๊ฐ์ ํตํด _PowerShell_ ๋ณ์ ๋ฐ ํํ์์ ํตํฉ ํ ์์๋ ๊ธฐ๋ฅ์ด ์์ด์ผํฉ๋๋ค (๋๋ ๋ฌธ์์ด์ ๊ตฌ์ฑํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ)msiexec --% "/i installer.msi INSTALLLOCATION=`"$loc`""
, $loc
ํฌํจํ๋ 'c:\foo\bar none'
๋ ๊ทธ๋๋ก ๋ช
๋ น ์ค /i installer.msi INSTALLLOCATION="c:\foo\bar none"
๊ฐ ์ ๋ฌ๋์ด msiexec
์ ๋นํ์ค ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค. <prop>=<value>
์ธ์์์ <value>
๋ถ๋ถ ๋ง ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ต๋๋ค.์ด๊ฒ์ด _ ํธ๋ฆฌํ์ง๋ ์์ง๋ง, Windows์์ ์ ๋ฌ๋๋ ๋ช ๋ น ์ค ๊ธฐ๋ฐ ์ธ์ ์ธ ๋ฌด์ ๋ถ ์ํ์ ๋ํ ๊ฐ๋ ฅํ ์๋ฃจ์ ์ ๋ํ ๋๊ฐ์ ๋๋ค.
@ mklement0 ํ์์ ์ฌ๋ ค ๊น์ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค (ํ์์ฒ๋ผ).
๊ทธ๋์ ์ ๋ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
(b)์ ๋ํ ์ ์ ํ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
- -%๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋งํผ ํน๋ณํ๊ฒ ์ง์
- ๊ทธ๋ฆฌ๊ณ ins์ ๋ง์ฐฌ๊ฐ์ง๋ก ํต๊ณผ ๋ช ๋ น ์ค์ ์ ์ฒด์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋จ์ผ ๋ฌธ์์ด์ด ๋ค์ ์์ผํฉ๋๋ค.>-๋ค์ ๋ฌธ์์ด ๋ณด๊ฐ (๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก)์ ํตํด PowerShell ๋ณ์ ๋ฐ ์์ ํตํฉ ํ ์์๋ ๊ธฐ๋ฅ ๋ฌธ์์ด ๊ตฌ์ฑ)
- ์ : msiexec-% "/ i installer.msi INSTALLLOCATION =
"$loc
" ", $ loc์ 'c : foobar none'์ด ํฌํจ ๋ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋ช ๋ น ์ค / i installer.msi INSTALLLOCATION ="c : foobar msiexec์ ๋นํ์ค ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.= ์ธ์ ๋ง ๋ถ๋ถ์ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผํฉ๋๋ค.
์ด๊ฒ์ (a)์ (b) ๋ชจ๋์ ๋ํ ์ผ๋ฐํ ๋ ์๋ฃจ์
์ผ๋ก ์ค๋ช
ํ๋ ค๊ณ ์๋ํ ๊ฒ์
๋๋ค.ํ์ง๋ง ์ฌ์ ํ (a)๊ฐ ํด๊ฒฐํด์ผ ํ ๋
๋ฆฝ์ ์ธ ๋ฌธ์ ๋ก ์กด์ฌํด์ผํ๋ค๋ ์ฌ์ค์ ์์ง ๋ชปํฉ๋๋ค. ๋ด๊ฐ ์ ๋ง๋ก ์ด๋ ค์์ ๊ฒช๊ณ ์๋ ๊ฒ์ (b)๊ฐ &
๋ํด _ ๊ตฌ์ฒด์ ์ผ๋ก _ ๊ตฌํ๋๋ค๋ฉด, ์ (a)๋ ๋ค๋ฃฐ ์ ์์ต๋๊น? ์๋ฅผ ๋ค์ด ins ...
๋ & cmd --% ...
ํ ์์๋ ๊ฒ์ ๋ํด ๋ฌด์์ ์ ๊ณตํฉ๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ &
๊ฐ --%
๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋ ๊ฒ ์ธ์๋ ํฐ ๋ณํ๊ฐ ์๋ ๊ฒ์
๋๋ค. (๋ง๋ ์๋๋ ์ผ์ฒ๋ผ ๋ณด์
๋๋ค.) comspec, shells์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ์๋ ๋ณด๋์ค ๋๋ ๋ฌด์์ด๋ . ๋ฐ์ ์๊ฐ ๊ฒฐ์ ํ๊ฒํ์ญ์์ค.
@ PowerShell / powershell-committee๋ ์ด๊ฒ์ ๊ฒํ ํ์ต๋๋ค.
/bin/sh
๋ /bin/env sh
์ฐ๊ธฐ--%
๋ฅผ ์ฌ์ฉํ์ฌ ์์ผ๋ก ๋์๊ฐ ๊ฒ์
๋๋ค. )Invoke-NativeShell
cmdlet์์ด ์ ์๊ณผ ๋ณ๊ฐ์ด๋ฉฐ PowerShellGallery์ ์ปค๋ฎค๋ํฐ์์ ๊ฒ์ ํ ์ ์์ต๋๋ค. ๋ํ here-string์ ์๊ตฌํ๋ ๊ฒ์ here-string์ผ๋ก ๋ํ ํ ๊ฒ์ ๋ฏธ๋ฆฌ ์์ง ๋ชปํ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค.--%
์ค์์น๋ฅผ ํฌ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ถ์ง ์์ต๋๋ค.--%
์ค์์น์ ๊ฐ์ ์คํธ๋ฆฌ๋ฐ ๋์์ด ํ์ํ ์ฌ์ฉ์๋ ํด๋น ์ค์์น๋ฅผ ๊ณ์ ์ฌ์ฉํ๊ณ ํ์์ ๋ฐ๋ผ ํน์ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํด์ผํฉ๋๋ค.--%
(๋๋ ๋ชจ๋ ์๋ฃจ์
)์ ๋ํด ์์์ผ ํ ๊ฒ์ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์์ต๋๋ค.& --%
๋ --%
๋๋ ๋ํ @ SteveL-MSFT์ ๋๋ ์ด๊ฒ์ ์ฌ๋ ๊ฒ๊ณผ ๋์์ # 1995๋ฅผ ๋ซ์์์๋ ๋ถ๊ตฌํ๊ณ ์ค์ ๋ก ์ด๊ฒ์ ๊ทธ ๋ฌธ์ ์ ๋ํ ํ์คํ ํด๊ฒฐ์ฑ ์ผ๋ก ์ ๋ฌํ๋ ค๋ ์๋๊ฐ ์๋์๋ค ๊ณ ๋ง๋ถ์ด๊ณ ์ถ์ต๋๋ค.
์ด ํน์ ๊ธฐ๋ฅ์ ์ด์ ์ด # 1995์ ์ํฅ๋ณด๋ค ํจ์ฌ ๋ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ค์ด ์๋ผ ๋ด๊ณ ๋ถ์ฌ๋ฃ๊ณ ์ถ์ดํ๋ ๋น PS ๊ณ๋ชฝ ๋๊ตฌ์ ๋ํ ๋ง์ StackOverflow ์์ ์ ๋ฌธ์ ์์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค (์์ ํฌํจ).
์ถ๊ฐ์ ์ผ๋ก PowerShell์ ์์ฒด ์ธ์ด ๋ด์์ ์ ์ ํ ์ด์ค์ผ์ดํ๋ฅผ ์ ๊ณตํ๋ ค๋ ์๊ตฌ๊ฐ ์์ง๋ง ์ฌ๋๋ค์ด ๋๋์ผ๋ก # 1995๋ฅผ ๋๋ฅด๋ ๊ฒ์ ๋ณด์ง๋ ๋ชปํฉ๋๋ค (ํ์ง๋ง ์ฌ๊ธฐ์์ ๋ ์์ธํ ์ค๋ช ํ๊ฒ ์ต๋๋ค).
--%
์ (๋ฅผ) ์๋ก์ด ์ฐ์ฐ์๋ก ์ฌ์ฉํ์ฌ ์์ผ๋ก ๋์๊ฐ ๊ฒ์ ๋๋ค.
๋๋๊ทธํด์ ๋ฏธ์ํฉ๋๋ค. ์ถ๊ฐ ๋ ผ์๋ฅผ ์์น ์์ต๋๋ค.ํ์ง๋ง ์ด๋ค ์ข ๋ฅ์ ์ด์์์ ๋๊น? (์ฃผ๋ก ๊ตฌ๋ฌธ์ ๊ด์ฌ์ด ์์ต๋๋ค.)
$a = --% find . -iname *$pdf -print0 | xargs -0 ls -ltr
๋๊ฐ ํ์ดํ๋ฅผ ์ป์ต๋๊น? $
์ด๋ป๊ฒ ๋๋์? &
, &&
๋ฐ ||
์ ์ ์ฌํฉ๋๋ค.
PS ํ์ดํ์์ --%
๋ฅผ ์ฌ์ฉํ ์์๋ ์กฐ๊ฑด์ ๋ฌด์์
๋๊น?
๊ฐ์ฌ.
๋๋๊ทธํด์ ๋ฏธ์ํฉ๋๋ค. ์ถ๊ฐ ๋ ผ์๋ฅผ ์์น ์์ต๋๋ค.ํ์ง๋ง ์ด๋ค ์ข ๋ฅ์ ์ด์์์ ๋๊น? (์ฃผ๋ก ๊ตฌ๋ฌธ์ ๊ด์ฌ์ด ์์ต๋๋ค.)
AST ํ๋ช ํ ๊ฒ์ ์๋ง๋ ๊ธฐ์ ์ ์ผ๋ก ์ฐ์ฐ์๊ฐ ์๋์ง๋ง ์์ฒด AST ์ ํ์ ๋๋ค. ์ฐ์ฐ์๋ก ๊ตฌํ๋๋ฉด ๋จํญ ์ฐ์ฐ์๊ฐ๋ฉ๋๋ค.
$a = --% find . -iname *$pdf -print0 | xargs -0 ls -ltr
๋๊ฐ ํ์ดํ๋ฅผ ์ป์ต๋๊น?
$
์ด๋ป๊ฒ ๋๋์?&
,&&
๋ฐ||
์ ์ ์ฌํฉ๋๋ค.
find . -iname *$pdf -print0 | xargs -0 ls -ltr
๋ฌธ์์ด์์๋ ๊ทธ๋๋ก ๋ค์ดํฐ๋ธ ์
ธ๋ก ์ ์ก๋ฉ๋๋ค. $a
๋ ์ฌ์ ํ ์ฑ์์ ธ ์์ผ๋ฏ๋ก ๋ค์ ๋ผ์ธ์์์ด๋ฅผ ๋ฌด์ธ๊ฐ๋ก ํ์ดํ ํ ์ ์์ต๋๋ค.
์์ผ๋ก ์งํ๋๋ PS ํ์ดํ์์
--%
๋ฅผ ์ฌ์ฉํ ์์๋ ์กฐ๊ฑด์ ๋ฌด์์ ๋๊น?
~ ์ฒซ ๋ฒ์งธ ๋ช ๋ น ์์ ์ฌ๋กฏ์์๋ ๊ฒฝ์ฐ ๋ฌธ์ ์์ ๋ถ๋ถ์์์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์๋ก์ด ๊ตฌ๋ฌธ์ ์ฅ์ ์ค ํ๋์ ๋๋ค. ์ฒ์๋ถํฐ ~ ์ฒซ ๋ฒ์งธ ์ฌ๋กฏ์์ ~๊ฐ ์๋๋ผ๋ฉด, ์ค๋์ฒ๋ผ ๊ณ์ ์๋ ํ ๊ฒ์ ๋๋ค.
(@ daxian-dbw @ SteveL-MSFT ์ค ํ๋๋ผ๋ ์๋ชป๋๋ฉด ์์ ํ์ญ์์ค โค๏ธ)
@SeeminglyScience ๊ฐ ์ ํํ ๋ง์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋ช ๋ น ์์ ์ฌ๋กฏ์ ์๋ค๋ฉด ์๋ง๋ ๊ทธ๋ ์ง ์์ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์๋ก์ด ๊ตฌ๋ฌธ์ ์ฅ์ ์ค ํ๋์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์ฌ๋กฏ์ ์์ง ์์ผ๋ฉด ์ค๋๋ ์ฒ๋ผ ๊ณ์ ์๋ํฉ๋๋ค.
์
์คํธ๋ฆผ ๋ช
๋ น์ ์ถ๋ ฅ์ --%
์ํด ํธ์ถ๋๋ ๊ธฐ๋ณธ ๋ช
๋ น์ ์ ๋ฌํ๋ ๊ฒ์ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค. --%
๊ธฐ๋ณธ์ ์ผ๋ก bash
์ ๊ฐ์ ๋ค์ดํฐ๋ธ ์
ธ์ ๋ฌธ์์ด์ ๊ทธ๋๋ก ์ ๋ฌํ์ง๋ง ์
์คํธ๋ฆผ ๋ช
๋ น์ ์ถ๋ ฅ์ bash
์ ๊ณต๊ธ ๋ ์๋ ์์ง๋ง find
์ ๊ฐ์ ๊ธฐ๋ณธ ๋ช
๋ น ์์ฒด.
์คํธ๋ฆฌ๋ฐ ๋์์ ์ฃผ๋ก "StackOverflow"์๋๋ฆฌ์ค๋ฅผ์ํ ๊ฒ์ด๋ฏ๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ๊ณ ๋ ค ์ฌํญ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋์ ์ ๋ ์ฐ๋ฆฌ๊ฐ _PowerShell_ ํ์ดํ ๋ผ์ธ์์ ์๋ํ์ง ์์ ๊ฒ์์ ๋ถ๋ช
ํํ๊ธฐ ์ํด --%
๋ฅผ ํน๋ณํ ๋ฌธ์ฅ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์, "์ปค๋งจ๋ ์์ ์ฌ๋กฏ"์ด ์๋ชป๋ ์ด์ ๊ฐ ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๋๋ ์ฑ๋ช ์์ ์์ ๋ถ๋ถ์ ์๋ฏธํ์ต๋๋ค. ๋ด๊ฐ ๊ณ ์น ๊ฒ, ๊ณ ๋ง์!
์ ์คํธ๋ฆผ ๋ช ๋ น์ ์ถ๋ ฅ์
bash
์๋ง ์ ๊ณต ๋ ์ ์์ต๋๋ค.
_upstream_์ _us_๋ฅผ ์๋ฏธํฉ๋๊น? ๋๋ ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค : 'ls' | bash
. ํน๋ณํ ๋๋ํ ์ผ์ ์๋์ง๋ง ๊ฐ๋ฅํฉ๋๋ค.
์ด์ ๋ํด ์ค์ด์๊ณ ๊ทธ๋ shebang #!
๋ฅผ์๊ธธ๋ก ์ ์ํ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ค์์ ์
๋ ฅํ๋ฉด๋ฉ๋๋ค.
#!/bin/sh ls | grep foo
#!sh | grep foo
(๋ ๋ฒ์งธ ๊ฒฝ์ฐ๋ sh
๊ฐ ๊ฒฝ๋ก์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค). ์ด ๊ฒฝ์ฐ ์
ธ์ ์ง์ ํด์ผํ๋์ง ์๋๋ฉด ํญ์ ๊ธฐ๋ณธ ์
ธ์์ ์คํํ๋์ง ๊ฒฐ์ ํด์ผํ๋ฏ๋ก์ด ์์ ์์๋ sh
๊ฐ ๋ ๋ฒ ์์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ค๋๋ shebang ํ์ผ์ด ์๋ํ๋ ๋ฐฉ์์ผ๋ก ์ธํด ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. shebang์ ์ฃผ์์ผ๋ก ๋ฌด์๋๊ธฐ ๋๋ฌธ์ PowerShell์์ ์๋ํฉ๋๋ค. ์ฃผ์ ์ธ ๊ฒฝ์ฐ ์คํฌ๋ฆฝํธ์ ์ฒซ ๋ฒ์งธ ์ค์ ๋ฌด์ํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ ๋ํ ํ ์
ธ์์ ์๋ก์ด ๊ฐ ์ค ์งํฉ์ด ์ ์คํฌ๋ฆฝํธ์ด๊ณ ํด๋น ์คํฌ๋ฆฝํธ๊ฐ ์คํฌ๋ฆฝํธ ๋๋ ๋ํ ํ.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋งํฌ ๋ค์ด ๊ตฌ๋ฌธ์ ๋น๋ฆฌ๋ ๊ฒ์ ๋๋ค.
powershell
```bash
ls |
grep foo
```
์ด ์์์๋ ๋งํฌ ๋ค์ด ์ฝ๋ ํ์ฑ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ ๋ํ ์ฌ๋ฌ ์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ ํ ์๋ก์ด ๊ฐ๋ ์ ์ฌ์ฉํฉ๋๋ค. ์๋ก์ด ์ฌ์ฉ์๋ฅผ์ํ ์ด๊ธฐ ๊ฒ์ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์กด์ฌํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ํํ ํธ๋ฆฌํ ๋ฐฑํฑ์ด ํ์ํ๋ค๋ ์ ์์ ์ด๊ฒ์ด ํจ์ฌ ๋ ๋์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ์๋ ํ ์ ์์ต๋๋ค.
powershell
$a = ```bash
ls |
grep foo
``` | select-string bar
@ SteveL-MSFT Markdown Syntax๋ ๋ง์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ง์ ํ ์์๋ ๊ฒฝ์ฐ. ํ์ด์ฌ์ด๋ ์๋ง๋ ํ์ฅ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ ํ?
shebang #! ๊ธฐ์กด ๋๊ธ์ ๋ฐฉํดํฉ๋๋ค.
๊ทธ๊ฒ์ ํ์ฑ์ ์ฒ๋ฆฌํ๊ณ ์ฌ์ฉ์๊ฐ ์ค์ ๋ก _use_ํ๋ ๊ฒ ๋ชจ๋ ๋์๊ฒ ์์ฒญ๋๊ฒ ๋ณต์กํด ๋ณด์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, ์ฐ๋ฆฌ๋ ์ฌ๋๋ค์ ์ฃผ์์ผ๋ก ํ์๋์ง ์๋ ์ฃผ์์ด์ด์ผํ๋ ์ค๊ณผ ํผ๋ ํ ํ์๊ฐ ์์ต๋๋ค. #Requires
์ (๋) ์ด๋ฏธ ์ด์ํ๊ฒ ์๊ฐํ๊ณ ์์ต๋๋ค. shebang์ ๋ํ ์ ์ฒด ๋ด์ฉ์ ๊ธฐ๊ปํด์ผ Windows ์ฌ์ฉ์์ Linux ์ฌ์ฉ์๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ ๊ฒ์
๋๋ค.
์ ๋ ๊ฐ์ธ์ ์ผ๋ก์ด ๊ธฐ๋ฅ์ shebang๊ณผ ํผํฉํ์ง ์๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ ์๊ฐ์๋ ํผ๋ ์ค๋ฝ์ต๋๋ค.
๋ํ ๋งํฌ ๋ค์ด ์ฝ๋ ๋ธ๋ก ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด ์ฌ๋๋ค์ด PowerShell์์ ์ง์ ์์์ ์ธ์ด ์ฝ๋ ์คํ์ ์์ฒญํ๋ ๊ฒ์ ์๊ฐ ๋ฌธ์ ์ผ๋ฟ์
๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ๊ฐ๊ณ ์ถ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค ...
๋ํ ๋งํฌ ๋ค์ด ์ฝ๋ ๋ธ๋ก ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด ์ฌ๋๋ค์ด PowerShell์์ ์ง์ ์์์ ์ธ์ด ์ฝ๋ ์คํ์ ์์ฒญํ๋ ๊ฒ์ ์๊ฐ ๋ฌธ์ ์ผ๋ฟ์ ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋์ ์๊ฐ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋ง ๊ทธ๋๋ก ์ธ๋ผ์ธ C # ์์ฒญ์ ๋ฉ์ถ์ง ์์ ๊ฒ์ ๋๋ค.
๋งํฌ ๋ค์ด ๊ตฌ๋ฌธ์ ํฌํจ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์์ ํ๋ก์ธ์ค์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์์์ ์ธ์ด ์ฝ๋๋ฅผ ๋์
ํ์ง ์์ต๋๋ค. ์ด์ @'
์์ ์์์ ์ธ์ด ์ฝ๋๋ฅผ ๋ฃ์ ์ ์์ผ๋ฉฐ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ ํ ๋ก ๊ณผ Jeffrey์์ ํ ๋ก ์์ ์ฐ๋ฆฌ๋ PowerShell ์คํฌ๋ฆฝํธ ๋ด์์ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์คํํ๋ ค๋ ์ฌ๋๋ค์ ๋ฐ๋ํด์๋ ์๋ฉ๋๋ค. @ yecril71pl์ด ์ธ๊ธํ๋ฏ์ด ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ง์ ์ง์ํ์ง ์๊ณ ํด๋น ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๊ธฐ ์ํด ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์์กดํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋๋ฆฌ์ค๋ ์ฌ์ฉ์๊ฐ Python ๋๋ bash ์คํฌ๋ฆฝํธ ๋ธ๋ก์๋ณด๊ณ PowerShell ์คํฌ๋ฆฝํธ ๋ด์์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ์ด๊ฒ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ฅผ PowerShell๋ก ํฌํ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์๊ฐ ์์ ์ ์ํํ๊ธฐ ์ํด PowerShell๋ก ์๋ผ๋ด์ด ๋ถ์ฌ ๋ฃ์ ์์๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
๋จ์ ์ ์ด์ ๋งค์ฐ ์ ์ฌํ ์์ ์ ์ํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ตฌ๋ฌธ์ด ์๋ก ๋ค๋ฅด๋ค๋ ์ ์์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ง์ํ ์ ์๋ค๋ ์ ์์ ๋จ์ผ ํ ์ ์๊ณผ ๋ค์ค ํ ์ ์์ ํผํฉ ํ ํ์๊ฐ ์์ต๋๋ค.
๋๋ ํ ์ค์ง๋ฆฌ ๋ฌผ๊ฑด์ ๋ฒ๋ฆฌ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ์ธ๊ณ์ธ ์ฝ๋ ์ฌ์ ๋์ ๋์ด ์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ฌด๋ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํดํ์ง ๋ชปํ ๊ฒ์ ๋๋ค.
@ yecril71pl ๋๋ ์ฃผ๋ก ๋ฐ๊ฒฌ์ ๊ด์ ์์ ๋ณผ ๋ ๋งํฌ ๋ค์ด ๊ตฌ๋ฌธ์ด ๋ ์ฝ๊ฒ ์์๋ณผ ์์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋งํฌ ๋ค์ด์ ์์ฃผ ์์ฑํ๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค. ๋ํ ๋ง์ ์์ ์คํฌ๋ฆฝํธ๋ ๊ฐ ๋จ์ผ ํ์ด ๋ ๋ฆฝ์ ์ธ ํ๋ก์ธ์ค๊ฐ ๋ ์ผ๋ถ ์ํ๊ฐ ์ ์ง ๋ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ๋จ์ผ ํ์ด ์๋๋ผ ์ฌ๋ฌ ํ์ผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
ํ ํ ๋ก ๊ณผ Jeffrey์์ ํ ๋ก ์์ ์ฐ๋ฆฌ๋ PowerShell ์คํฌ๋ฆฝํธ ๋ด์์ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์คํํ๋ ค๋ ์ฌ๋๋ค์ ๋ฐ๋ํด์๋ ์๋ฉ๋๋ค.
์ ๋์ ์ผ๋ก 100 %์ด์ง๋ง ์ด๊ฒ์ด ์ธ์ด์ ์ง์ ๋น๋๋์ด์ผํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
@ yecril71pl์ด ์ธ๊ธํ๋ฏ์ด ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ง์ ์ง์ํ์ง ์๊ณ ํด๋น ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๊ธฐ ์ํด ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์์กดํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋๋ฆฌ์ค๋ ์ฌ์ฉ์๊ฐ Python ๋๋ bash ์คํฌ๋ฆฝํธ ๋ธ๋ก์๋ณด๊ณ PowerShell ์คํฌ๋ฆฝํธ ๋ด์์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฏธ here-strings๋ก ํ ์ ์์ต๋๊น? ์ด๊ฒ์ด ๊ธฐ์กด ๋ฐฉ๋ฒ์ ๋นํด ์ด๋ค ์ด์ ์ ์ ๊ณตํ๋์ง ์กฐ๊ธ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ํ ์ python๊ณผ bash์์ ๋ฉ์ถ๋์? C #, CIL, C ++๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฌ๋๋ค์ด ์ด๊ฒ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๋ฅผ PowerShell๋ก ํฌํ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์๊ฐ ์์ ์ ์ํํ๊ธฐ ์ํด PowerShell๋ก ์๋ผ๋ด์ด ๋ถ์ฌ ๋ฃ์ ์์๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋๋ก ๊ฐ์๋ฐ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค. ์ธ์ด ๊ด์ ์์ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ ํธ์ง์์๊ฒ๋ ์ ๋ชฝ์ด๋ฉฐ ๊ถ๊ทน์ ์ผ๋ก ์ฌ๋ฌ ์ธ์ด๋ฅผ ์์ง ์์ผ๋ฉด ์ฝ์ ์์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฅ๋ คํ๊ธฐ ๋๋ฌธ์ ๋ง์์ ๋ค์ง ์์ต๋๋ค.
์ค์ ๋ก ์ด๊ฒ์ ํจ์ฌ ๋ ๊ด๋ฒ์ํ ์๋ฏธ๋ฅผ ๊ฐ์ง์ด ์ค๋ ๋์ ์๋ ์ฃผ์ ์๋ ๋งค์ฐ ๋ค๋ฅธ ๊ฐ๋ ์ ๋๋ค. ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ฏธ here-strings๋ก ํ ์ ์์ต๋๊น? ์ด๊ฒ์ด ๊ธฐ์กด ๋ฐฉ๋ฒ์ ๋นํด ์ด๋ค ์ด์ ์ ์ ๊ณตํ๋์ง ์กฐ๊ธ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ฒ์ฉ ์ฝ๋ ํธ์ง๊ธฐ๋์ด๋ฅผ ๊ฐ์งํ๊ณ ์ ์ ํ๊ฒ ์ฅ์ ํ ์ ์์ง๋ง ํธ์ง๊ธฐ๋ ๋ด๋ถ ๋ด์ฉ์ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ @'
๋ก ์ํ ํ ์์
์ด ์์ต๋๋ค.
๋ํ ์ python๊ณผ bash์์ ๋ฉ์ถ๋์? C #, CIL, C ++๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์คํฌ๋ฆฝํ ์ธ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์?
๋ฒ์ฉ ์ฝ๋ ํธ์ง๊ธฐ๋์ด๋ฅผ ๊ฐ์งํ๊ณ ์ ์ ํ๊ฒ ์ฅ์ ํ ์ ์์ง๋ง ํธ์ง๊ธฐ๋ ๋ด๋ถ ๋ด์ฉ์ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์
@'
๋ก ์ํ ํ ์์ ์ด ์์ต๋๋ค.
ํธ์ง์๋ bash -c @'
์ ์ฝ๋ ํ์ค์ฒ๋ผ ์ฝ๊ฒ bash๊ฐ ํฌํจ๋์ด ์๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ๋ํ ์ด๋ ค์ด ๋ถ๋ถ์ ์ฝ๋ ์น์
์ด ์ด๋ค ์ธ์ด์ธ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ธ์ด ์๋ฒ์ ๊ตฌ๋ฌธ ํ์ด ๋ผ์ดํฐ๋ฅผ ์ ๊ธ๋งํ๋ ๊ฒ์
๋๋ค. ์๋นํ ์๊ฐ๊ณผ ๋
ธ๋ ฅ์ ํฌ์ํ์ง ์๊ณ ์๋ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ณธ์ง์ ์ผ๋ก ์ฌ๊ธฐ์์๋ ๊ฒ์ฒ๋ผ ๋ ๋๋งํ๋ ๊ฒ์
๋๋ค.
์คํฌ๋ฆฝํ ์ธ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์?
C # ๋ฐ C ++์๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ ์งํฅ ํ์ ์งํฉ์ด ์์ต๋๋ค. ๊ทธ๋ ์ง ์๋๋ผ๋ "์คํฌ๋ฆฝํ ์ธ์ด"๋ ์ค์ ์ ์๊ฐ์๋ ์ฃผ๊ด์ ์ ๋๋ค. ํฌํจ ๋์์ผ๋ก ๊ฐ์ฃผ๋๋ ํญ๋ชฉ๊ณผ ํฌํจ๋์ง ์๋ ํญ๋ชฉ์ ๋ํ ๋ช ํํ ๊ฒฝ๊ณ๋ก์ ๋์์ด๋์ง ์์ต๋๋ค.
C # ๋ฐ C ++์๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ ์งํฅ ํ์ ์งํฉ์ด ์์ต๋๋ค. ๊ทธ๋ ์ง ์๋๋ผ๋ "์คํฌ๋ฆฝํ ์ธ์ด"๋ ์ค์ ์ ์๊ฐ์๋ ์ฃผ๊ด์ ์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก interpet optionsโฆ script argumentsโฆ
ํธ์ถ ํ ๋ ์ธ์ด๋ (๋
๋ฆฝ ์คํ ํ) ์คํฌ๋ฆฝํ
์ธ์ด์ด๋ฉฐ ํด๋น ํธ์ถ์ ์์ ํญ๋ชฉ์ ์ ์ธํ๊ณ ์ธํฐํ๋ฆฌํฐ์๊ฒ ๋น๊ณต๊ฐ๋ก ๋จ๊ฒจ ๋๋ ๊ฒ ์ธ์๋ ์๋ฌด๊ฒ๋ ๋จ๊ธฐ์ง ์์ต๋๋ค. ๋ํ ์ผ๋ฐ์ ์ผ๋ก ์คํํ๋ ค๋ฉด ์ธํฐํ๋ฆฌํฐ ์ฌ๋ณธ์ด ํ์ํฉ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์คํํ ์์๋ ์๋ฒ ๋๋ ์คํฌ๋ฆฝํ
์ธ์ด๊ฐ ์์ต๋๋ค.
์๋ ํ์ธ์.
์ด๋ฏธ here-strings๋ก ํ ์ ์์ต๋๊น? ์ด๊ฒ์ด ๊ธฐ์กด ๋ฐฉ๋ฒ์ ๋นํด ์ด๋ค ์ด์ ์ ์ ๊ณตํ๋์ง ์กฐ๊ธ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ฌ๋๋ค์ ์ค๋๋ here-strings๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์์๋ผ ์ ์๋ค๋ฉด ๊ธฐ๋ณธ ๋ช ๋ น์ ์ ๋ฌ ๋ ๋ชจ๋ ์ธ์๋ฅผ ์ด์ค์ผ์ดํ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์๋๋ ์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ (Stackoverflow) ์๋๋ฆฌ์ค์ ๋ํ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์ํด ๋ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋ํ ์ python๊ณผ bash์์ ๋ฉ์ถ๋์? C #, CIL, C ++๊ฐ ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์ฌ๊ธฐ์ ์ง์๋๋ ์๋๋ฆฌ์ค๋ ๊ธฐ๋ณธ ๋ช ๋ น์ ์ ๋ฌ๋๋ ํ ์คํธ ๋ธ๋ก์ ๋๋ค. ํด๋น ํธ์ถ ๊ท์น์ ์ง์ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ์ด๋ฅผ ์ง์ํ ์ ์์ต๋๋ค. ์์ ์์ค ํ์ผ์ ๋ง๋ค๊ณ ์ปดํ์ผ ํ ์ ์์ด ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋๋ก ๊ฐ์๋ฐ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค. ์ธ์ด ๊ด์ ์์ ์ ์ง ๊ด๋ฆฌ๊ฐ ์ด๋ ต๊ณ ํธ์ง์์๊ฒ๋ ์ ๋ชฝ์ด๋ฉฐ ๊ถ๊ทน์ ์ผ๋ก ์ฌ๋ฌ ์ธ์ด๋ฅผ ์์ง ์์ผ๋ฉด ์ฝ์ ์์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฅ๋ คํ๊ธฐ ๋๋ฌธ์ ๋ง์์ ๋ค์ง ์์ต๋๋ค.
ํผํฉ ๋ ์ธ์ด ๊ตฌ๋ฌธ ์์์ ์ป์ ๊ฒ์ด๋ผ๋ ๊ธฐ๋๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ธ์ด์ ์ค์ฒฉ ๋ ์คํฌ๋ฆฝํธ๋ ๋จ์กฐ๋ก์์ง๋๋ค.
์ค์ ๋ก ์ด๊ฒ์ ํจ์ฌ ๋ ๊ด๋ฒ์ํ ์๋ฏธ๋ฅผ ๊ฐ์ง์ด ์ค๋ ๋์ ์๋ ์ฃผ์ ์๋ ๋งค์ฐ ๋ค๋ฅธ ๊ฐ๋ ์ ๋๋ค. ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ์ ๋ ๊ตฌํ์ ์๋ ๋ฌธ์ ์ ๋ค๋ฅด์ง๋ง ์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ ๋ฐ "๊ทธ๋ฅ ์๋"์๋๋ฆฌ์ค ์ธ ๋ฌธ์ ๋ ๋์ผํฉ๋๋ค.
์ฌ๋๋ค์ ์ค๋๋ here-strings๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์์๋ผ ์ ์๋ค๋ฉด ๊ธฐ๋ณธ ๋ช ๋ น์ ์ ๋ฌ ๋ ๋ชจ๋ ์ธ์๋ฅผ ์ด์ค์ผ์ดํ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์๋๋ ์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ (Stackoverflow) ์๋๋ฆฌ์ค์ ๋ํ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์ํด ๋ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋ง์ง๋ง ์ค์ ๋ก ์ด๋ป๊ฒ ๋ ์ฌ์ธ๊น์? ๋๋ ๊ทธ๊ฒ์ด ์ฃผ๊ด์ ์ด๋ผ๋ ๊ฒ์ ์์ง๋ง ์ด๊ฒ๋ค์ ๋์๊ฒ ๊ทธ๋ ๊ฒ ๋ค๋ฅด์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
~~~ ํ์ ์
$ a =```bash
์ฐพ๊ธฐ . -iname * $ pdf -print0 | xargs -0 ls -ltr
~~~
vs
```powershell
$a = bash -c @'
find . -iname *$pdf -print0 | xargs -0 ls -ltr
'@
ํ์๊ฐ ์ผ์ด๋ ์ผ์์ ํจ์ฌ ๋ ๋ช ํํ๋ค๋ ์ ์ ์ ์ธํ๋ฉด ๊ฑฐ์ ๋์ผ ํด ๋ณด์ ๋๋ค.
์ฌ๊ธฐ์ ์ง์๋๋ ์๋๋ฆฌ์ค๋ ๊ธฐ๋ณธ ๋ช ๋ น์ ์ ๋ฌ๋๋ ํ ์คํธ ๋ธ๋ก์ ๋๋ค. ํด๋น ํธ์ถ ๊ท์น์ ์ง์ํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ธ์ด๋ฅผ ์ง์ํ ์ ์์ต๋๋ค. ์์ ์์ค ํ์ผ์ ๋ง๋ค๊ณ ์ปดํ์ผ ํ ์ ์์ด ์์ต๋๋ค.
C #์๋ ์์ ์์ค ํ์ผ์ด ํ์ํ์ง ์์ต๋๋ค. CIL์ด ์๋ ์๋ ์์ต๋๋ค (C ++์ ๋ํ ์์ด๋์ด ์์). ์ด๋ ์ชฝ์ด๋ ์คํ ํ์ผ (์ : bash / python / cmd)์ ํธ์ถํ๊ธฐ์ํ ๊ตฌ๋ฌธ ์ ์คํ ์ธ ์ฝ๋ ์ธํ๋ฆฌ๊ฐ ๋์๊ฒ ํผ๋ ์ค๋ฝ์ต๋๋ค. ์ฝ๋ ์ธํ๋ฆฌ๋ ์ธ์ด ์ง์ imo๋ฅผ ์๋ฏธ
ํผํฉ ๋ ์ธ์ด ๊ตฌ๋ฌธ ์์์ ์ป์ ๊ฒ์ด๋ผ๋ ๊ธฐ๋๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ธ์ด์ ์ค์ฒฉ ๋ ์คํฌ๋ฆฝํธ๋ ๋จ์กฐ๋ก์์ง๋๋ค.
tmLanguage ๊ธฐ๋ฐ ํ์์๊ฒ๋ ์ฌ์ ํ ์ ๋ชฝ์ด ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์ atm์ ๊ธฐ๋ํ๋ ๊ตฌ๋ฌธ์ ๊ฐ์ ํ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ๊ทธ ์ด์์ผ๋ก, ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ด here-string๊ณผ ๋ค๋ฅธ ์ด์ ๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์ ์ ๋ ๊ตฌํ์ ์๋ ๋ฌธ์ ์ ๋ค๋ฅด์ง๋ง ์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ ๋ฐ "๊ทธ๋ฅ ์๋"์๋๋ฆฌ์ค ์ธ ๋ฌธ์ ๋ ๋์ผํฉ๋๋ค.
๊ณต์ ํ์ง๋ง ์ด์ ์ ์ ์ ๋ ์๋ฃจ์ ์ ๋ ผ์ํ๋ ๋ฐ ์ด๋ฏธ 145 ๊ฐ์ ์๊ฒฌ์ด ์์ต๋๋ค. ํนํ์ด ์ค๋ ๋๊ฐ ์ด๋ฏธ ๊ฒฐ๋ก ์ ๋๋ฌ ํ์ผ๋ฏ๋ก ์๋ก์ด ์ ์ฉ ์ค๋ ๋์ ํจ์ฌ ๋ ๋ง์ด ์ฐธ์ฌํ ์ ์์ต๋๋ค.
C #์๋ ์์ ์์ค ํ์ผ์ด ํ์ํ์ง ์์ต๋๋ค. CIL์ด ์๋ ์๋ ์์ต๋๋ค (C ++์ ๋ํ ์์ด๋์ด ์์). ์ด๋ ์ชฝ์ด๋ ์คํ ํ์ผ (์ : bash / python / cmd)์ ํธ์ถํ๊ธฐ์ํ ๊ตฌ๋ฌธ ์ ์คํ ์ธ ์ฝ๋ ์ธํ๋ฆฌ๊ฐ ๋์๊ฒ ํผ๋ ์ค๋ฝ์ต๋๋ค. ์ฝ๋ ์ธํ๋ฆฌ๋ ์ธ์ด ์ง์ imo๋ฅผ ์๋ฏธํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ๋ํ @SeeminglyScience ์ ์๊ฒฌ์ ๋ฐ์ํ๊ณ ์ถ์ต๋๋ค. Microsoft.CodeAnalysis.CSharp.Scripting
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ปดํ์ผํ์ง ์๊ณ ๋ C # ์คํฌ๋ฆฝํธ ๋ฅผ
PowerShell์ ์ฝ๋ ํ์ฑ ๊ตฌ๋ฌธ์ ์ด๋ก ์ ์ผ๋ก ๋ค์์ ํ์ฉํ๋ ๋ค์ดํฐ๋ธ ๋ช ๋ น์ ํธ์ถํ๊ธฐ์ํ ๊ฒ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค.
```c:\mypath\MyArbitraryExe
args to my arbitrary executable
```
๊ทธ๋ฌ๋ @SeeminglyScience๊ฐ ์ธ๊ธํ๋ฏ์ด ์ธ์ด ์ง์์ ์๋ฏธํ๋ markdown๊ณผ ์ฌ์ฉ์์ ํ๋ฆฝ ๋ ์ดํด์
์ด๋ก ์ ์ผ๋ก ์ด๊ฒ์ ํ์ฉํ๋
์ธ์๊ฐ ์๋ ๋ด๋ถ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ๊ณ ์คํฌ๋ฆฝํธ๋ ์ ๋ ฅ ์คํธ๋ฆผ๊ณผ ๋์ผํฉ๋๋ค. ๋ํ ์ด๊ฒ์ด SO ์ง์์ ์ ๊ณตํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ํ์ฉ๋์ง ์์์ผํฉ๋๋ค.
์ธ์๊ฐ ์๋ ๋ด๋ถ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ๊ณ ์คํฌ๋ฆฝํธ๋ ์ ๋ ฅ ์คํธ๋ฆผ๊ณผ ๋์ผํฉ๋๋ค.
์คํฌ๋ฆฝํธ๋ bash / cmd / python์ ์ธ์์ ๋๋ค.
๋ํ ์ด๊ฒ์ด SO ์ง์์ ์ ๊ณตํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ํ์ฉ๋์ง ์์์ผํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์์ด ์์ ๋ก ์ ํํ์ญ์์ค.
~ powershell$ a = ipconfig
/all
~
๋๋ ๋จผ์ ์์์ exe๋ฅผ ๊ฒฝ๋ก์ ์ถ๊ฐํ์ญ์์ค.
์ธ์๊ฐ ์๋ ๋ด๋ถ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ๊ณ ์คํฌ๋ฆฝํธ๋ ์ ๋ ฅ ์คํธ๋ฆผ๊ณผ ๋์ผํฉ๋๋ค.
์คํฌ๋ฆฝํธ๋ bash / cmd / python์ ์ธ์์ ๋๋ค.
๊ทธ๋ค ์ค ์ด๋ ๊ฒ๋ ์์น ์ธ์๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. CMD
์์๋ ๋ฐฐ์น ํ์ผ๋ ํ์ฉํ์ง ์์ต๋๋ค.
๋ํ ์ด๊ฒ์ด SO ์ง์์ ์ ๊ณตํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ํ์ฉ๋์ง ์์์ผํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์์ด ์์ ๋ก ์ ํํ์ญ์์ค.
$ a =```ipconfig
/๋ชจ๋
์๋ํ์ง ์์ต๋๋ค.
์ด ๋งํฌ ๋ค์ด ์์ด๋์ด๊ฐ ์๋ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋งค์ฐ ์์์ ์ธ ๊ธฐ์ค์ผ๋ก ์์ฒญ๋๊ฒ ๋ง์ ํน์ ์ฌ๋ก๋ฅผ ๋ง๋ค ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ์ด๊ฒ์ด Markdown์์๋ ์ง์๋๋ ์ฃผ๋ ์ด์ ๋ ๊ตฌ๋ฌธ ๊ฐ์กฐ ๋๋ฌธ์ ๋๋ค. ์ด์ ๊ฐ์ ๊ฒ์ ์ธ์ด์ ์ถ๊ฐํ๋ฉด ์ง์์ ์ธ ์์ฒญ์ด ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ํจ๊ณผ์ ์ธ ํด๊ฒฐ์ฑ ์ด ์๋๋๋ค.
์ด์ ๋ํด ์ค์ด์๊ณ ๊ทธ๋ shebang
#!
๋ฅผ์๊ธธ๋ก ์ ์ํ์ต๋๋ค.
2 ์ผํธ๋ฅผ ๋ํ๊ธฐ ์ํด ํด๊ฒฐ์ฑ ์ด ๋ฐํ ๋ ํ์ด ํ ๋ก ์ ๋ค์ ์์ํ๋ ๊ฒ์ ์ค์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ธ์ ์ผ๋ก ๋๋ shebang๊ณผ markdown ๊ตฌ๋ฌธ์ ๋ชจ๋ ์ซ์ดํฉ๋๋ค (๋ ๋ค ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค).
๋๊ตฐ๊ฐ๊ฐ ๋ช
๋ฐฑํ ๋ ์ข์ ๊ฒ์ ๊ฐ์ง๊ณ ์ฌ ๊ฒฝ์ฐ ๋๋ ๋
ผ์๋ฅผ ๋ค์ ์์ ์๊ดํ์ง ์์ต๋๋ค. ์ค์ ๋ก ๊ธฐ๋ฅ์ด ์ถ์ ๋ ํ๋ณด๋ค ์ง๊ธ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ ๋จ์ง #!
๋๋ markdown ์ ๊ทผ๋ฒ์ด "un-PowerShell-adulterated"๋ช
๋ น ์ค ๋ฌธ์์ด์ ๋ค์ดํฐ๋ธ exe์ ์ ๊ณตํ๋ ๋ ๋์ ์๋ฃจ์
์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ต์ํด์ง๊ธฐ ์ํด ์๋ ํด๋ด์ผ ํ ์๋ ์์ง๋ง ์ด๊ธฐ ๋ฐ์์ ... ์, ์ด.
_ ์ฐ๋ฆฌ (๋ฐ PowerShell)๊ฐ ๊ธฐ๋ณธ ์คํ ํ์ผ์ ์คํํ๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด ์ "๊ธฐ๋ณธ ์ฐ์ฐ์ ํธ์ถ"์ด ํ์ํฉ๋๊น? _
PowerShell์ด โโ์
๋ ฅ ๋ฌธ์์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ CommandAst๋ฅผ ๊ฐ์ ธ ์ค๋ฉด PowerShell์ ๋ช
๋ น์ ๊ฒ์ํฉ๋๋ค.
๋ช
๋ น์ด ๊ธฐ๋ณธ ๋ช
๋ น ์ธ ๊ฒฝ์ฐ PowerShell์ ast๋ฅผ NativeCommandProcessor๋ก ๋ณํํฉ๋๋ค.
Ast ๋ฒ์ (์ฆ, ์
๋ ฅ ๋ฌธ์์ด)๋ฅผ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ๊ธฐ๋ณธ ์คํ ํ์ผ ์ด๋ฆ / ๊ฒฝ๋ก ๋ฐ ๋๋จธ์ง ๋ฌธ์์ด์ OS ๊ท์น์ ๋ฐ๋ผ ์ธ์ ๋๋ ์ธ์๋ก ๊ฐ์ ธ ์ค๋ ๊ฒฝ์ฐ์ ์๋ก์ด (์คํ์ฉ NativeCommandProcessor)๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์์์ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด "cmd
์ฌ์ฉ์๊ฐ ๊ธฐ๋ณธ ๋ช
๋ น ์ค์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐg++ timer.cpp @conanbuildinfo.args -o timer --std=c++11
์ฒ๋ผ ์๋ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ์์์ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
์ด์ ๋ํ Get-/Set-Clipboard
์ด ์์ต๋๋ค.
Ast ๋ฒ์ (์ฆ ์ ๋ ฅ ๋ฌธ์์ด)๋ฅผ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ๊ธฐ๋ณธ ์คํ ํ์ผ ์ด๋ฆ / ๊ฒฝ๋ก ๋ฐ ๋๋จธ์ง ๋ฌธ์์ด์ OS ๊ท์น์ ๋ฐ๋ผ ์ธ์ ๋๋ ์ธ์๋ก ๊ฐ์ ธ ์ค๋ ๊ฒฝ์ฐ.
๋ด ์๊ฐ์ ๋ค์ ์ค ํ๋๋ฅผ ์ํํ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ๋์ ์ฒ์๋ถํฐ ๋ฌธ์์ด์ ๋ณด์กดํด์ผํฉ๋๋ค. ์ด์ PowerShell์๋ ์ด๋ฏธ ์ธ ๊ฐ์ง ์ข ๋ฅ์ ๋ฌธ์์ด ํ ํฐ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง์ด ํ ๋ก ์ ์ฃผ์ ์์ฒญ์ ์ฌ๋ฌผ์ ์ด์ค์ผ์ดํํ๊ณ ์ถ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ๋ฌธ์์ด์ ์ข ๊ฒฐ์๋ฅผ ์ด์ค์ผ์ดํ ํ ์ ์์ด์ผํ์ง๋ง ์ฌ๊ธฐ์ ๋ ผ์ ๋ ์๋ฃจ์ ์ ์ข ๊ฒฐ ์๋ก ๊ฐํ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐํ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํ ํ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค (ํญ์ ์ธ๋ฏธ์ฝ๋ก ์ด ์์).
๋๋ ์ค ๋ฐ๊ฟ ์ ์ฉ ํฐ๋ฏธ๋ค์ดํฐ์ ์์ ํ ์ง์ฐฉํ์ง๋ ์์์ง๋ง, ์๋ฌด๊ฒ๋ ํ์ถํ๊ณ ์ถ์ง ์์ ์ ์ผํ ํด๊ฒฐ์ฑ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก "๋ค์ดํฐ๋ธ ์ฝ ์ฐ์ฐ์"๋ ์ค๋๋ ์ ๋ผ์ธ ์ฃผ์๊ณผ ๋น์ทํ๊ฒ ํ ํฐ ํ๋ฉ๋๋ค. ์ฐ์ฐ์์์ ๋ผ์ธ ๋๊น์ง "๋ค์ดํฐ๋ธ ์"๋ก ์ ๋ฌ๋๋ ๋ฌธ์์ด์ ๋๋ค.
๊ทธ๋์:
--% ps -o pid,args -C bash | awk '/running_script/ { print $1 }'
๋ค์๊ณผ ๊ฐ์ด ํ ํฐ ํ๋ฉ๋๋ค.
--% ps -o pid,args -C bash | awk '/running_script/ { print $1 }'
|-||-----------------------------------------------------------|
| \
Native call operator Invocation to be passed to native shell
(๋ฌธ์์ด์ด --%
๋ฐ๋ก ๋ค์ ์์ํ๋ฏ๋ก --%
๋ฐ๋ก ๋ค์ ๊ณต๋ฐฑ๋ ๊ธฐ๋ณธ ์๋ก ๋ณด๋
๋๋ค.)
๊ทธ๋ฐ ๋ค์์ด ํ ํฐ์ ๋ค์๊ณผ ๊ฐ์ด ๋งค์ฐ ๊ฐ๋จํ AST๋ก ๋ํ๋ฉ๋๋ค.
// We need to carefully work out what AST this inherits from
// This syntax has almost no interoperability with PowerShell by design,
// so can't implement fields like redirections or backgrounding faithfully.
// But in order to participate in pipelines and similar, would need to extend a more concrete class
public class NativeCallInvocationAst : StatementAst
{
public string NativeInvocation { get; }
}
๊ทธ๋ฐ ๋ค์ ์ปดํ์ผ๋์ด ํ์ดํ๋ก ์ ์ก ๋ ํ ์๋ก์ด ๊ธฐ๋ณธ ๋ช ๋ น ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๊ธฐ๋ณธ ์ ธ์ ๋ํ ์ธ์๋ก ์ง์ ๋ณด๋ ๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ด ๊ตฌํ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ง์ ์์ ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค.
|
๋๋ &
๋๋ ๋ฌธ์์ด์ ์ฌ์ฉํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ดํดํ ์ ์์ต๋๊น?์ฌ๊ธฐ ๋ด ์๊ฐ์ ๋น์ ๋์ด ์ผ์
@rjmholt CommandAst์๋ ์ ๋ ฅ ๋ฌธ์์ด์ด์๋ Extent ์์ฑ์ด ์์ต๋๋ค. ์ฌ๋ถ์์ Windows์์ ์ฒซ ๋ฒ์งธ ๊ณต๋ฐฑ์ผ๋ก ๋ถํ ํ๊ฑฐ๋ Unix์์ ๊ณต๋ฐฑ์ผ๋ก ๋ถํ ํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋์ ๋๋ ์ฐ๋ฆฌ๊ฐ ํ์์ ์๋ฌด๊ฒ๋ ์์ง ์๊ณ ์ข์ ์ฑ๋ฅ์ ์ป์ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๊ตฌํ๋๋ฉด ํ ์คํธ ํ ์ผ๋ จ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์์ "์ ์"ํ๊ฒ ์ต๋๋ค.
g++ timer.cpp @conanbuildinfo.args -o timer --std=c++11
. ์ด์ ๋ํ ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ธ์ฉ ํ ๋ด์ฉ์ ํ์
ํ๋ ๊ฒ์
๋๋ค. ์ : g++ timer.cpp '@conanbuildinfo.args' -o timer --std=c++11
๋ ๋ณต์กํ ์์๋ ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ์๋ ๋ช
๋ น ์ค์ด ํฌํจ๋ ์ ์์ต๋๋ค.tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz \
--exclude=/proc \
--exclude=/lost+found
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ ( \
๋ํ ๋ฐฑํฑ ๊ต์ฒด) ์ :
tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz `
--exclude=/proc `
--exclude=/lost+found
g++ $CppFile @conanbuildinfo.args -o timer --std=c++11
. ์ด์ ๋ํ ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ธ์ฉ ํ ๋ด์ฉ (๋จ์ผ ๋๋ ์ด์ค)๊ณผ ์ด์ค์ผ์ดํ ๋์์ ํ์
ํ๋ ๊ฒ์
๋๋ค. ์ : g++ $CppFile '@conanbuildinfo.args' -o timer --std=c++11
๋ ๋ณต์กํ ์์๋ ์ฌ๋ฌ ์ค์ ๊ฑธ์น ๋ช
๋ น ์ค์ด ํฌํจ๋ ์ ์์ต๋๋ค.tar -cvpzf "/share/Recovery/Snapshots/${ComputerName}_`$(date +%Y%m%d).tar.gz" \
--exclude=/proc \
--exclude=/lost+found
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ \
๋ํ ๋ฐฑํฑ์ ๋ฐ๊พธ๊ณ `$ (date + ...)์ ์์ ๋ถ๋ถ์์ $
๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค.
ps -o pid,args -C bash | awk '/running_script/ { print $1 }'
๋ฐ wsl ls $foo && echo $PWD
์ ๊ฐ์ ๋ค๋ฅธ ์
ธ์์ ๋ฆฌํฐ๋ด ํ์ดํ ๋ผ์ธ ๋ช
๋ น ์ ์คํํ๊ณ ์ถ์ต๋๋ค . _ ์ด์ ์ฌ๋ก์ ๋ณ๋์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํ์ํ์ง ํ์คํ์ง ์์ต๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ bash ๋ช
๋ น์ ์ธ์ฉํ๋ ๊ฒ์
๋๋ค (์ : bash -c 'ps -o pid,args -C bash | awk ''/-bash/ { print $1 }'''
. ์ด ์ฌ์ฉ ์ฌ๋ก์๋ ์ฌ๋ฌ ์ค ๋ฌธ์์ด๋ ํฌํจ๋ ์ ์์ต๋๋ค. ์ :ps -o pid,args -C bash | \
awk '/running_script/ { print $1 }'
์ฌ์ฉ ์ฌ๋ก 2a : PS ๋ณด๊ฐ์ ์ฌ์ฉ
์ฌ์ฉ ์ฌ๋ก 3 : ์์
์ ๊ณ์ํ๋ ค๋ฉด npm run $scriptName
๊ฐ ํ์ํฉ๋๋ค (์ : ๋ณ์ ๋ณด๊ฐ) . (์ด๋ ์์์ ์ผ ์ ์์ผ๋ฉฐ ๋ช
์ ํ ํ์๊ฐ ์์ต๋๋ค).
interpolating
๋ฌธ์์ด (์ : g++ $CppFile @conanbuildinfo.args -o timer --std=c++11
๋ํ ์ ์ค ์ผ์ด์ค๊ฐ ์์ด์ผํ๋์ง ์ฌ๋ถ์ ๋ํ ์ง๋ฌธ์ด ์์ต๋๋ค. ์๋๋ฉด ๊ทธ๋ฅ ๊ทธ๊ฒ์ ๋ํด ํํธํ๊ณ ํ์ฌ์ ์ด์ค์ผ์ดํ ๊ท์น์ด์ด๋ฅผ ๋ค๋ฃจ๊ณ ์๋ค๊ณ ๋งํ ๊น์?
์ด๋ ์ฌ๋ฐ๋ฅธ (๋๋ ์ ๋ถ) ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ ์ ์์ง๋ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ฌธ์ํํ๊ณ ์ด ๊ธฐ๋ฅ์ ๋ ผ์ ํ ๋ ์ฐธ์กฐ ํ ์ ์์ผ๋ฉด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ฅ์ด ์ค์ ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์์ ๊ธธ์ ์๊ธฐ ์ฝ์ต๋๋ค. ) ๊ณ ๊ฐ ์ฌ์ฉ ์ฌ๋ก.
๋ํ ๋ ๋ฒ์งธ ์ฌ์ฉ ์ฌ๋ก๋ "์ ํธ์ถ"์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋๋ ์ฒซ ๋ฒ์งธ๋ ํ์คํ์ง ์์ต๋๋ค. exe๊ฐ ์ง์ ํธ์ถ ๋ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@rkeithhill ์ด์ ๊ฒ์๋ฌผ์์ ์์ ์ฑ์ ์ํด ๊ธฐ์กด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ถ๊ฐ ํ ์ ์์ต๋๊น?
@oising , ๋๋ ์ฌ๋ ค ๊น์ ์๋ต์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
ins ...
๋& cmd --% ...
ํ ์์๋ ๊ฒ์ ๋ํด ๋ฌด์์ ์ ๊ณตํฉ๋๊น?
--%
ํ์ฌ์ _parameter_ (๊ธฐํธ) ํ์-์ฐ๋ฆฌ๊ฐ ์ ์งํ๊ณ ์ถ์ ํ๋- cmd /c --%
์ฌ์ฉํ ์ ์์ต๋๋ค. _multi-command_ cmd
์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค ^
๋ ์ฌ์ฉํ์ง ์์), ์ฒซ ๋ฒ์งธ ์ธ์ฉ๋์ง ์์ |
๋ _PowerShell's_ ํ์ดํ ์ฐ์ฐ์๋ก ํด์๋๊ณ &
๊ฐ ๊ทธ๋๋ก ์ ๋ฌ๋ฉ๋๋ค.
--%
๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฑฐ์ ์ธ๋ชจ์๊ณ sh -c
๋ ๋ชจ๋ ์คํจํฉ๋๋ค. sh
๋ ๋ช
๋ น ์ค์ _single_ ์ธ์ (์ : sh -c --% echo hi
๋ echo
๋ง ๋ช
๋ น์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ๋น ์ค์ ์์ฑํฉ๋๋ค.
ins
, _ ๋จ์ผ ๋ฌธ์์ด๋ก ์ ๋ฌํ์ฌ ํต๊ณผ ๋ช
๋ น ์ค์ ๊ตฌ๋ถํด์ผ ํจ _ _ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ช
์๋ ๋ฐ์ ๊ฐ์ด ๋ฌธ์์ด ๋ณด๊ฐ์ ์ฌ์ฉํ์ฌ _PowerShell_ ๋ณ์ ๋ฐ ํํ์ ๊ฐ์ ํตํฉ ํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์๋ ์ ์ ๋ --%
_statement_๊ฐ _ ๋ง ๋ค๋ฅธ ๊ฑฐ๋ฆฌ _ ์ธ ์ด์ ๋ฅผ ์๋ ค์ค๋๋ค .
๊ธฐ์กด ๋ช ๋ น ์ค์ ๊ทธ๋๋ก _ ๊ทธ๋๋ก _ ์คํํ๋ ๊ฒ์์ _PowerShell_ ๋ณ์ ๋ฐ ํํ์ ๊ฐ์ ์ฌ๊ธฐ์ ํตํฉํ๋ ๊ฒ๊น์ง _ ์ ํ ๊ฒฝ๋ก๊ฐ ์์ต๋๋ค _.
%...%
๋๋ $...
). ๊ธฐ๋ณธ ๋ช
๋ น ์ค.--%
๋ฌธ์ ๋ ํฐ PowerShell ํ์ดํ ๋ผ์ธ์ ํตํฉ ํ ์ ์๋ค๋ ์ด์ํจ์ด ์์ต๋๋ค.
๋ํ --%
_parameter_์ ์ด์ํจ์ด Unix์์ ์ฌ์ค์ ์ธ๋ชจ๊ฐ ์์ด์ ์ด์ํ ๋น๋์นญ์ ๋์
ํฉ๋๋ค. --%
_statement_๊ฐ Unix์์๋ ์๋ํ๋ค๋ฉด --%
_parameter_ ? (์ :
/bin/echo --% 'hi "noon"'
'hi noon'
(์์ hi "noon"
)๋ฅผ ์ฐ์ถํฉ๋๋ค. echo
๊ฐ _two_ ์ธ์๋ฅผ ์์ ํ๋ฏ๋ก 'hi
๋ฐ noon'
, ์์ ๋ฐ์ดํ๋ ๋ฐ์ดํฐ๋ก ์ ์ง๋๊ณ ํฐ ๋ฐ์ดํ๋ ์ ๊ฑฐ๋จ).
ins
๋ --%
๋ฌธ์ ๋ํ ์ ์ ๋ ๋์์ผ๋ก cmd /c
๋ฐ sh -c
์ฃผ์์ _convenience wrapper_๊ฐ ์ด์์ ์ด์ง๋ง ์ค์ ๋ก๋ _required_์
๋๋ค.
ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์ ๋์ค์์ ์ ์ด๋ _temporarily_, ๊ฐ์์์๋งํผ # 1995, ๊ณ ์ ๋์ง sh -c '...'
์ง์ ํ์ฌ ์๋ฒ ๋๋์ ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์ต๋๋ค "
์ ๋๋ก์ ํตํด.
์ Windows์์ _Invariably_, ๋ช
๋ น ๋ผ์ธ ํต๊ณผํด์ผํ๊ธฐ ๋๋ฌธ์ _as์-IS_ cmd
๋ฐ์ด์ด lpCommandLine
๋งค๊ฐ ๋ณ์์ CreateProcess
ํฉ๋๋ค (์๋ --%
๋งค๊ฐ ๋ณ์๋ฅผ ํ ์ ์๋ค _one_ ๋ช
๋ น์ผ๋ก ์ ํ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ "..."
๋ฌถ์ธ _ ๋จ์ผ ๋ฌธ์์ด _๋ก ๋ช
๋ น ์ค์ ๋ค์ ์ ๋ฌํ๋ ค๊ณ ํ๋ฉด # 1995๋ก ์ธํด ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค.
_argument_ ์ ๋ฌ ๋ฌธ์ ๋ _via stdin _ ( ins
๋ ์ง์ํ ์ ์๊ณ ์ง์ํด์ผ ํจ)์ ์คํํ๋ ๋ช
๋ น ์ค์ ์ ๊ณตํ์ฌ ํผํ ์ ์์ต๋๋ค. ์ฆ, _pipe_ ๋ช
๋ น ์ค / ์คํฌ๋ฆฝํธ ํ
์คํธ๋ฅผ ์ ์คํ ํ์ผ์ ์ ๊ณตํฉ๋๋ค.
sh
๋ก ์ฝ๋๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ์คํ์ ์ํด _script file_์ ์ ๋ฌํ๋ ๊ฒ๊ณผ ๋ณธ์ง์ ์ผ๋ก ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์๋ํฉ๋๋ค ( sh -c '<code>' is
).PSonUnix> @'
echo '{ "foo": "bar" }' | cat -n
'@ | sh
1 { "foo": "bar" }
cmd
๋ ์ด๋ฌํ ์
๋ ฅ์ ์ ์ฒ๋ฆฌํ์ง ๋ชปํฉ๋๋ค. ๋ก๊ณ ๋ฅผ ์ธ์ํ๊ณ ์คํ ์ ์ ๊ฐ ๋ช
๋ น์ ํ๋กฌํํธ ๋ฌธ์์ด๊ณผ ํจ๊ป ์์ฝํฉ๋๋ค.PSonWin> 'date /t & ver' | cmd
Microsoft Windows [Version 10.0.18363.836]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\jdoe>date /t & ver
Sun 07/26/2020
Microsoft Windows [Version 10.0.18363.836]
C:\Users\jdoe>
์ฌํ๊ฒ๋ PowerShell ์์ฒด๋ ๋น์ทํ๊ฒ ๋์์ด๋์ง ์๋ ๋์์ ๋ณด์ ๋๋ค. # 3223 ์ฐธ์กฐ
sh
๋ฐ ๋ชจ๋ ์ฃผ์ POSIX ์ ์ฌ ์
ธ ( dash
, bash
, ksh
, zsh
)๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋ถ๋ถ์ ์คํฌ๋ฆฝํ
์ธ์ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ _do_ python
, node
, ruby
๋ฐ perl
์ ๊ฐ์ stdin-as-script ์
๋ ฅ์ ์ง์ํฉ๋๋ค.
PS> 'print("hi")' | python
hi
_PowerShell_ ๋ณ์ ๋ฐ ํํ์ ๊ฐ์ ํตํฉํ๊ธฐ ์ํด ๋ค์ ๋ฌธ์์ด ๋ณด๊ฐ / ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ์ต์ ์ด ์์ต๋๋ค.
PS> $foo = 'bar'; "print(`"$foo`")" | python
bar
๋๋ ์ธํฐํ๋ฆฌํฐ์ ์ธ์ ์ ๋ฌ ๊ธฐ๋ฅ ์ฌ์ฉ :
PS> @'
import sys
print(sys.argv[1])
'@ | python - bar
bar
์์ ๋ด์ฉ์ด --%
๋ฌธ๋ #!
๋ฌธ๋, ๋งํฌ ๋ค์ด ์ฝ๋ ๋ธ๋ก๋ ์๋ ํน์ ๊ตฌ๋ฌธ์ด ์ ํ ํ์ ์์์ ๋ถ๋ช
ํ ๋ณด์ฌ์ฃผ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํธ์ถ PowerShell ์คํฌ๋ฆฝํธ์ ๊ฐ์ ํตํฉํ๋ ๊ธฐ๋ฅ.
์ฌ์ฉํ ๋ค์ดํฐ๋ธ ์ ธ์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ : ์์ธก ๊ฐ๋ฅ์ฑ์ ์ํด ํ๋๋ฅผ ์ ๊ณตํด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ์ ธ์ ๋์์ผ๋กํ๋ ์ฌ์ฉ์๋ ๋ช ๋ น ์ค์ ํด๋น ์ ธ์ ํน์ ์คํ ํ์ผ๋ก ํ์ดํํ๊ฑฐ๋ # 1995๊ฐ ์์ ๋๋ฉด ์ธ์๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
/bin/bash
๋ฅผ ๋์์ผ๋กํ๋ ๊ฒ์
๋๋ค ((๊ฐ๋ฅ์ฑ์ด์๋) /bin/sh
๋์ฒด)-๊ฒ์ ๋ ๋ช
๋ น ์ค์ด POSIX ํ์ ๊ธฐ๋ฅ์๋ง ์์กดํ๊ณ Bash-ism์ด์๋ ๋ช
๋ น ์ค์ ์์กดํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. (๋ชจ๋ /bin/sh
๊ตฌํ์ด ์ง์ํ ๊ฒ์ผ๋ก ์์๋์ง ์๋ ๋น POSIX ๊ธฐ๋ฅ)์ bash
์ ๋ณด๊ธ๋ฅ ์ ๊ฐ์ํ ๋ ์ธ๋ถ์์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.ํํ
์ด ํน์ ๊ธฐ๋ฅ์ ์ด์ ์ด # 1995์ ์ํฅ๋ณด๋ค ํจ์ฌ ๋ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์๋ผ ๋ด๊ธฐ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ ๊ธฐ๋ฅ์ ๋ง๋๋ ๋ฐ ๋ง์ ๋
ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ ๊ฒ์ ๋๋์ต๋๋ค.-์ฃผ๋ก _interactive_์ ํธ์๋ฅผ ์ํด-(์ด์ํ๊ณ ๊ธฐ๋ฅ์ด ์ ํ์ ์ธ) ์ผ๋ฅ ์๋ฏผ ์ธ ๋ฐ๋ฉด PowerShell์ ๊ทผ๋ณธ์ ์ธ ๋ฌด๋ฅ๋ ฅ "
๋ฌธ์๊ฐ ํฌํจ ๋ ์ธ์ ๋ฐ ์ธ์.
ํ์ง๋ง ์ฌ๋๋ค์ด ํ๊บผ๋ฒ์ # 1995๋ฅผ ์น๋ ๊ฑด ๋ชป ๋ดค์ด์
๊ทธ๋ ์ต๋๋ค. ์ ๊ฐ ์ด์ ์ ๋ ผ์ํ ์ด์ ๋๋ฌธ์ _ ๋ ๋ง์ด ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค _.
๋ค์ ๋งํ์ง๋ง, PowerShell์ด โโํ์ฌ ์ํํ๋ ๊ฒ์ฒ๋ผ ๋ค์์ ์ํํ๋ ์ ธ์๋ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค .
# On Unix
PS> /bin/echo '{ "foo": "bar" }'
{ foo: bar }
@rjmholt CommandAst์๋ ์ ๋ ฅ ๋ฌธ์์ด์ด์๋ Extent ์์ฑ์ด ์์ต๋๋ค. ์ฌ๋ถ์์ Windows์์ ์ฒซ ๋ฒ์งธ ๊ณต๋ฐฑ์ผ๋ก ๋ถํ ํ๊ฑฐ๋ Unix์์ ๊ณต๋ฐฑ์ผ๋ก ๋ถํ ํ๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋์ ๋๋ ์ฐ๋ฆฌ๊ฐ ํ์์ ์๋ฌด๊ฒ๋ ์์ง ์๊ณ ์ข์ ์ฑ๋ฅ์ ์ป์ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
๊ทธ๋, ๋๋ ๊ฑฐ๊ธฐ์ ๋ฌด์น๋ถ๋ฅผ ์ดํดํ๊ณ ์๋ง๋ ํด๋น ์๋๋ฆฌ์ค์์ AST์ ํ ๋น์ด ๋์ฐํ์ง ์์ ๊ฒ์ ๋๋ค (๋จ์ํ ๊ตฌ๋ฌธ์ ๋ํด ๋ถํ์ํ ํ ๋น์ ์์ฑํด์๋ ์๋๋ค๊ณ ์ฃผ์ฅํ์ง๋ง). ํ์ง๋งํด์ผ ํ ์ผ์ bash / cmd๊ฐ ๋ฌธ์์ด๋ก ์ธ์ํ๊ณ PowerShell์ด โโ๋ฌธ์ ๋ฅผ ์์ํ์ง ์๋ ์ ๋ ฅ์ ์์ํ๋ ๊ฒ์ ๋๋ค.
ํ์ฌ PowerShell๋ก ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์์ต๋๋ค.
--% my_command "\" "
๊ตฌ๋ฌธ ๋ถ์ํ์ง๋ง ๊ณต๋ฐฑ์ผ๋ก ๋ถํ ํ๋ฉด ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
--% my_command "\" "\"
(๋ฌธ์์ด์ 4 ๊ฐ์ ๊ณต๋ฐฑ์ ๋ณด๋ด์ผํ์ง๋ง PowerShell์ ๋ฐฐ์ด๋ก ๊ตฌ๋ถ ๋ ๋ ๊ฐ์ ๋ฌธ์์ด์ ๋ด ๋๋ค)
@rjmholt , ์ ์
์ด์ ์๊ฒฌ ์์ ์ฌ์ฉํ ๊ธฐ๋ณธ ์ ธ ์คํ ํ์ผ์ ๋ํ ์ง๋ฌธ์ ํด๊ฒฐํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ค๋ฅธ ์์ด๋ ๋ค๋ฅธ ์ธ์ด๊ฐ ์ด๊ฒ์ ๊ตฌํํฉ๋๊น ์๋๋ฉด ์ด๋ฏธ ๊ฐ์ง๊ณ ์์ต๋๊น? ๊ตฌ๋ฌธ ์์ค์์ ๋๋ ๋ค๋ฅธ ์์ค์์? ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ?
_explicit delimiters_๋ฅผ ์ฌ์ฉํ์ง ์๊ณ _interpolation_์ ํ์ฉํ์ง ์๊ณ ๊ตฌ๋ฌธ ์์ค์์์ด ์์
์ ์ํ ํ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์์ง ๋ชปํฉ๋๋ค.
์๋ฅผ ๋ค์ด perl
์๋ ์ ๋ช
๋ น์ ์คํํ๊ธฐ์ํ `...`
๊ฐ ์์ผ๋ฏ๋ก, ์๋ฅผ ๋ค์ด Unix์ ์คํฌ๋ฆฝํธ์์ ๋ค์ ๋ช
๋ น์ ์คํํ ์ ์์ต๋๋ค.
my $foo='/'; print `ls $foo | cat -n`
์ฃผ์ ์ธก๋ฉด์ ๋ช
์ ์ ๊ตฌ๋ถ ๊ธฐํธ์ ์ฌ์ฉ๊ณผ ํธ์ถ์์ ๊ฐ์ ํตํฉํ๋ ๊ธฐ๋ฅ์
๋๋ค. ๋ ๋ค --%
๋ฌธ์ ๋ํ ํ์ฌ ์ ์์์ ๋๋ฝ๋์์ต๋๋ค.
์์ ์ธ๊ธํ๋ฏ์ด ์ฐ๋ฆฌ๋ ์๋ก์ด _operator_ (๋๋ ์ผ์ข
์ ๊ตฌ๋ถ์ ๊ธฐ๋ฐ, ์ ํ์ ์ผ๋ก ๋ณด๊ฐ ๊ตฌ๋ฌธ)์ ๋ํด์ด ์ ๊ทผ ๋ฐฉ์์ _ ์ฌ์ฉํ ์ ์์ง๋ง _ ๊ทธ๋ด ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ins "ls $foo | cat -n"
(๋๋ here-string ๋ณํ)์ ์ธ์ด์ ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ์ ๊ฐํ์ง ์๊ณ ๊ฐ๋ฅํฉ๋๋ค.
perl
๋ (์ ์ ํ) ๊ตฌ๋ฌธ ์์ค์ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค. _ ๊ทธ ์์ฒด๊ฐ ์
ธ์ ์๋์ง๋ง _ ๊ฐ๋ฅํ ํ ํธ๋ฆฌํ๊ฒ ์
ธ ํธ์ถ์ํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋์กฐ์ ์ผ๋ก, ์ฐ๋ฆฌ๋ ์ (๋๋ฌด)์ด๋ฉฐ, ์ถ๊ฐ ๊ตฌ๋ฌธ์์ด ์ ์คํ์ผ ํธ์ถ์ _directly_ ์ ๊ณตํฉ๋๋ค (ํ์ฌ ๊ฒฐํจ์ ์์ง๋ง-# 1995 ์ฐธ์กฐ).
_ ๋ค๋ฅธ ์
ธ์ _ ํธ์ถ์ ๊ฐ๋ฅํ ํ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํน๋ณํ ๊ตฌ๋ฌธ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ถํ์ ํด ๋ณด์
๋๋ค.
๋ฟก ๋นต๋จ
_ ์ฐ๋ฆฌ (๋ฐ PowerShell)๊ฐ ๊ธฐ๋ณธ ์คํ ํ์ผ์ ์คํํ๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด ์ "๊ธฐ๋ณธ ์ฐ์ฐ์ ํธ์ถ"์ด ํ์ํฉ๋๊น? _
PowerShell์ด โโ์ ๋ ฅ ๋ฌธ์์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ CommandAst๋ฅผ ๊ฐ์ ธ ์ค๋ฉด PowerShell์ ๋ช ๋ น์ ๊ฒ์ํฉ๋๋ค.
๋ช ๋ น์ด ๊ธฐ๋ณธ ๋ช ๋ น ์ธ ๊ฒฝ์ฐ PowerShell์ ast๋ฅผ NativeCommandProcessor๋ก ๋ณํํฉ๋๋ค.
Ast ๋ฒ์ (์ฆ, ์ ๋ ฅ ๋ฌธ์์ด)๋ฅผ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ๊ธฐ๋ณธ ์คํ ํ์ผ ์ด๋ฆ / ๊ฒฝ๋ก ๋ฐ ๋๋จธ์ง ๋ฌธ์์ด์ OS ๊ท์น์ ๋ฐ๋ผ ์ธ์ ๋๋ ์ธ์๋ก ๊ฐ์ ธ ์ค๋ ๊ฒฝ์ฐ์ ์๋ก์ด (์คํ์ฉ NativeCommandProcessor)๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.์ฌ์ฉ์๊ฐ ์์์ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๋ฉด "cmd"๋๋ "bash"๋ฅผ ์ ๋ ฅํด์ผํฉ๋๋ค. ์ด๋ ํธ์ง์์ด ์๋ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ช ๋ น ์ค์g++ timer.cpp @conanbuildinfo.args -o timer --std=c++11
์ฒ๋ผ ์๋ํฉ๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒํ๋ค๋ฉด ๊ธฐ๋ณธ ๋ช
๋ น๊ณผ ํจ๊ป PowerShell ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ฒ๋์ง ์์๊น์? sc.exe query $serviceName
์ฒ๋ผ $serviceName
๋ฅผ ๋ฆฌํฐ๋ด ๋ฌธ์์ด๋ก ์ ๋ฌํ ๊น์?
ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒํ๋ค๋ฉด ๊ธฐ๋ณธ ๋ช ๋ น๊ณผ ํจ๊ป PowerShell ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ฒ๋์ง ์์๊น์?
sc.exe query $serviceName
์ฒ๋ผ$serviceName
๋ฅผ ๋ฆฌํฐ๋ด ๋ฌธ์์ด๋ก ์ ๋ฌํ ๊น์?
--%
์ต์
์ ์ด๋ฌํ ์๊ตฌ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ๊ฒ์ด ์๋๋๋ค.
sc.exe query $serviceName
์ &"<cmd>"
--%
์ต์ ์ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ๊ธฐ์ํ ๊ฒ์ด ์๋๋๋ค.
sc.exe query $serviceName
์&"<cmd>"
์, ์ ๋ ๊ทธ๊ฒ์ด @iSazonov ๊ฐ ์ธ๊ธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋งค๊ฐ ๋ณ์ ๋ฐ์ธ๋ฉ์ด ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ํด ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์ผ๋ฐ์ ์ธ ๋ณ๊ฒฝ์ ์ ์ํ๋ ๊ฒ์ฒ๋ผ ์ฝ๊ณ ์์ต๋๋ค.
์, ์ ๋ ๊ทธ๊ฒ์ด @iSazonov ๊ฐ ์ธ๊ธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋งค๊ฐ ๋ณ์ ๋ฐ์ธ๋ฉ์ด ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ํด ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์ผ๋ฐ์ ์ธ ๋ณ๊ฒฝ์ ์ ์ํ๋ ๊ฒ์ฒ๋ผ ์ฝ๊ณ ์์ต๋๋ค.
์ฃผ๋, ๊ทธ๋ฌ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ฃผ๋, ๊ทธ๋ฌ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ๋๋๋ก ์ด๋ก์ ๋ธ๋ ์ธ ์คํ ๋ฐ ํ ๋ ๋ช ๋ฐฑํ ๊ฒ์ ์๊ธฐ ์ฝ์ต๋๋ค. ๋๋ ๊ณต์ ํ๊ฒ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๊ทธ๊ฒ์ ์ฝ๊ณ ์ผ๋ง๋ ๊นจ์ง ์ง ๊นจ๋ซ์ง ๋ชปํ๊ณ ์ฆ์ ๊ตฌํ์ ์๊ฐํ๊ธฐ ์์ํ์ต๋๋ค.
๋๋ ๋๋ ๋ช ๋ฐฑํ ๊ฒ์ ๋์น๊ณ ์์ผ๋ฉฐ ์ ์๋๋ ๊ฒ์ด ์ ํ ์๋๋๋ค ๐
@essentialexch , ๋ค์
sc.exe query $serviceName
์&"<cmd>"
& "<cmd>"
๋ <cmd>
๊ฐ ๋จ์ํ ๋ช
๋ น _name ๋๋ path_๋ก ํ๊ฐ๋๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค. _ ์ธ์๋ฅผ ํฌํจํ์ง ์์ _-์ธ์๋ ๊ฐ๋ณ์ ์ผ๋ก ๊ฐ๋ณ์ ์ผ๋ก ์ ๋ฌ๋์ด์ผํ๋ฉฐ, ๊ทธ ์์ฒด๋ก๋ "...."
๊ฐ ํ์ํ์ง ์์ต๋๋ค. ํ์ฅ ๋ ๋ณ์ ์ฐธ์กฐ์ ๋ํ ์ธ์ฉ (์ :
$exe = 'findstr'; & "where.exe $exe"
๋ ์๋์ ์ผ๋ก ์คํจํ์ต๋๋ค. & "where.exe" $exe
์ฌ์ผํฉ๋๋ค (์ฌ๊ธฐ์ ํฐ ๋ฐ์ดํ๋ ์ ํ ์ฌํญ์
๋๋ค. ์๋ตํ๋ฉด &
๋ ์ ํ ์ฌํญ์
๋๋ค.)
์, ์ ๋ ๊ทธ๊ฒ์ด @iSazonov ๊ฐ ์ธ๊ธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋งค๊ฐ ๋ณ์ ๋ฐ์ธ๋ฉ์ด ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ํด ์๋ํ๋ ๋ฐฉ์์ ๋ํ ์ผ๋ฐ์ ์ธ ๋ณ๊ฒฝ์ ์ ์ํ๋ ๊ฒ์ฒ๋ผ ์ฝ๊ณ ์์ต๋๋ค.
๋ด ์ ์ ์ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๊ฒ # 1995๋ฅผ ์์ ํ๋ ๊ฒ์ ๋๋ค. ์์ธ ๋ณด๊ฐ์ด ์๋ํ์ง ์์ต๋๋ค. ์ด์ ๋ ์ต์ข ์ ์์ด ์๋๋๋ค. ๋ช ๋ถ ์์ ์์ ์ฌํญ์ ๊ตฌํํ ์์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฃผ๋ก @ mklement0์ด ์ง์ ํ๋ฏ์ด ํธ์ถ ๋ค์ดํฐ๋ธ ์ฐ์ฐ์๊ฐ ์ ํ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ตฌ๋ฌธ ๋ถ์ํ์ง๋ง ๊ณต๋ฐฑ์ผ๋ก ๋ถํ ํ๋ฉด ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
@rjmholt ์,ํ์ง๋ง ๋น์ ์ด ์๊ฐ์ ์ก๋ ๊ฒ ๊ฐ์์.
CommandAst์ ์ฒซ ๋ฒ์งธ ์์์ ๊ธฐ๋ณธ ๋ช
๋ น์ด BareWord ์ธ StringConstantExpressionAst์
๋๋ค. CommandAst Extent์์ ๋งจ ๋จ์ด๋ฅผ ์๋ผ๋ด์ด ast-s ๋ณ๊ฒฝ์์ด ๋งค๊ฐ ๋ณ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋งค๊ฐ ๋ณ์ ๋ชฉ๋ก์ ์ ์งํ๊ธฐ ์ํด ์ ast๋ฅผ ์ถ๊ฐ ํ ์๋ ์์ต๋๋ค.
์๋์์ ๋
ผ์๋ฅผ ์์ฝํ๊ณ ์ถ๊ณ ๋ณต์กํด ๋ณด์ด๋ ์ผ๋ถ ๊ฐ์ ์ฌํญ์ ๊ตฌํํด์ผํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์ค๋ช
์ ์ํด ์๊ฐ์ ํ ์ ํฉ๋๋ค.ํ์ง๋ง ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๊ณ __ ์ด์ ํธํ์ฑ์ ์ํด ์ฝ๊ฒ ์ ํ ํด์ ํ ์ ์์ต๋๋ค __.
@ SteveL-MSFT์ ์ด๊ธฐ ์ ์ ์๋๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํผํ๋ ๊ฒ์ด ์์ต๋๋ค.
์ด ํ ๋ก ์ด # 1995 ๋ฐ # 12975์ ๊ฐ์ ๋ชจ๋ _fundamental_ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๊ตฌ๋ฌธ์ด ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค @TSlivede ๋ฐ @ mklement0์ ๋์ํฉ๋๋ค. ๋ค๋ฅธ ํํธ์ผ๋ก๋ ์ธ์ด์ ๋ณต์ก์ฑ์ ๋ํ๋ ๋ฐ๋ฉด, ์ฐ๋ฆฌ๋ ๋ฐ๋๋ก ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ์ ์์
์ _ ๋จ์ํ _ ์ํฉ๋๋ค.
__ ์์ผ๋ก ๋์๊ฐ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง ์ด์์ ๋ง๋๋ ๊ฒ์ ๋๋ค .__ (์ดํ ์ผ๋ถ ์๋๋ฆฌ์ค์์๋ ์ ์ฐ์ฐ์ ๋๋ cmdlet์ด ์ ์ฉ ํ ์ ์์ต๋๋ค.)
์ฌ์ฉ ์ฌ๋ก์ ์ฌ์ฉ์ ๊ธฐ๋์น์ ์์ฝ๋ถํฐ ์์ํด์ผํฉ๋๋ค.
์ ์ @rkeithhill ์ ๋ฉ์ง ๊ฒ์๋ฌผ์ ์ฐธ์กฐํ์ญ์์ค.
์ฌ์ฉ์๋ ์คํ ํ์ผ์ด๋ ์ ธ์ ์คํํ๋ ค๊ณ ํฉ๋๋ค.
์๊ฐ :
๋ฐ๋ผ์ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ ์๋๋ฆฌ์ค ๋์์ด ๊ธฐ๋ณธ๊ฐ์ด์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ค ์ข
๊ฒฐ์๋ ์คํ ํ์ผ (bash์์๋, PowerShell์์๋`)์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ๊ฒํฉ๋๋ค.
(1) ์์ ์คํ ํ์ผ๋ก ๋ช
์ ์ ์ผ๋ก ๋ช
์๋์ด์ผํฉ๋๋ค.
(2) ์๋ง๋ ์ฌ๋ฌ ์ค๋ก ๋ ์คํ ํ์ผ์ ์
ธ์ ํตํด ํธ์ถํด์ผํ๊ฑฐ๋ ํน์ ๊ตฌ๋ฌธ ๋ถ์์ ์ํํด์ผํฉ๋๋ค (์ข
๊ฒฐ์๋ฅผ ์ ๊ฑฐํ๊ณ ์ด์ค์ผ์ดํ ๋ฌธ์ ๋ก ๋์๊ฐ๋ ์ธ์ ๋ชฉ๋ก ์์ฑ).
(3) PSReadline์์ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ ์๋๋ฆฌ์ค๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฒํผ๋ฅผ ์ฌ๋ฐ๋ฅธ PowerShell ๋ช
๋ น์ผ๋ก ๋ณํ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๋ ํ ์ค๊ณผ ์ฌ๋ฌ ์ค์ ์ํฉ๋๋ค.
@TSlivede ์ @ mklement0 ์ด ์ด์ ์ ์๊ฐ๊ณผ ๊ฒฐ๋ก ์ ์ ๋ฐ์ดํธ ํ ์ ์์์ง๋ง ์ด์ ๋ ๋ธ๋ ์ดํน ์ฒด์ธ์ง (๋ค)์ ์์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ด ์ฐ๊ณ ์ถ์ง ์์ต๋๋ค. ๋๋ ์๋ก์ด ์ด์๋ฅผ ์ด๊ณ (๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ด์ ์ด์๋ฅผ ๋ซ๊ณ ), ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ด๊ฑฐํ๊ณ (@ @rkeithhill 's๋ก ์์ํ์ฌ ๋ ์ถ๊ฐ) Pester ํ ์คํธ๋ฅผ ์์ฑ ํ ๊ฒ์ ์์ฒญํฉ๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ข์ ๋จ๊ณ๊ฐ ๋ ๊ฒ์ ๋๋ค.
Invoke-Shell (Invoke-NativeShell), Test-Arguments (์ : ๋ค์ดํฐ๋ธ ์ฑ์ด ์ฌ์ฉ์์๊ฒ ๋์์์ฃผ๊ณ ํ์ํ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ echoargs.exe), Convert-Arguments ( ์ฌ์ฉ์ ์ ๋ ฅ์ ์ค๋ฅธ์ชฝ ์ด์ค์ผ์ดํ ์ธ์๋ก ๋ณํ).
์ถ์ : ์์์ ๋ณด์ฌ ๋๋ ธ๋ฏ์ด ํ ์ค ๋์์ ๋ฐํ์์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด ์ฝ๊ฒ ์ตํธ ์์ ํ ์ ์์ต๋๋ค.
์ค ์ข ๊ฒฐ์๋ ์คํ ํ์ผ (bash์์๋, PowerShell์์๋`)์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
\
์ (๋) bash
์ ์ค ์ข
๊ฒฐ์๊ฐ ์๋๋๋ค.
์์ธ ๋ณด๊ฐ์ด ์๋ํ์ง ์์ต๋๋ค. ์ด์ ๋ ์ต์ข ์ ์์ด ์๋๋๋ค. ๋ช ๋ถ ์์ ์์ ์ฌํญ์ ๊ตฌํํ ์์๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฃผ๋ก @ mklement0์ด ์ง์ ํ๋ฏ์ด ํธ์ถ ๋ค์ดํฐ๋ธ ์ฐ์ฐ์๊ฐ ์ ํ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ ๋ง ์ญ์ ํ๋ฉด ๋ช ๋ถ ์์ ๋ชจ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ ์์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ ๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด ์ ์ํ๋ ๊ฝค ์์ฒญ๋ ํด์์ ๋๋ค. ๋จ์ง ๊ฐ์ค์ด๋ผ๊ณ ํ๋๋ผ๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋์์ด๋๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋จ์ง ๊ฐ์ค์ด๋ผ๊ณ ํ๋๋ผ๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋์์ด๋๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@SeeminglyScience ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๋งฅ๋ฝ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ํ์๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ก ํ ์ค ๋ค์ดํฐ๋ธ ํธ์ถ์ ๋ํ ์์ ์ ๊ตฌํํ ์ ์๋ค๊ณ ๋งํ๋ค. ์ฆ, ์ด๋ค ์๋ก์ด ๋์์ ๊ตฌํํ๋ ๊ด๊ณ์์ด ์ฆ์ ๋์์ ์ ํ ํ ์ ์์ต๋๋ค.
์ฆ, ์ด๋ค ์๋ก์ด ๋์์ ๊ตฌํํ๋ ๊ด๊ณ์์ด ์ฆ์ ๋์์ ์ ํ ํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋์น ๊ฒ์ ๋ช ์ ์ ์ผ๋ก ์์ฒญํ์ง ์๊ณ (์ฝ ๋ค์ดํฐ๋ธ ์ฐ์ฐ์์ ๊ฐ์ด) ์ฆ์ ํด๋น ๋์์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ฟก ๋นต๋จ
_ ์ฐ๋ฆฌ (๋ฐ PowerShell)๊ฐ ๊ธฐ๋ณธ ์คํ ํ์ผ์ ์คํํ๋ค๋ ๊ฒ์ ์๊ณ ์๋ค๋ฉด ์ "๊ธฐ๋ณธ ์ฐ์ฐ์ ํธ์ถ"์ด ํ์ํฉ๋๊น? _
PowerShell์ด โโ์ ๋ ฅ ๋ฌธ์์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ CommandAst๋ฅผ ๊ฐ์ ธ ์ค๋ฉด PowerShell์ ๋ช ๋ น์ ๊ฒ์ํฉ๋๋ค.
๋ช ๋ น์ด ๊ธฐ๋ณธ ๋ช ๋ น ์ธ ๊ฒฝ์ฐ PowerShell์ ast๋ฅผ NativeCommandProcessor๋ก ๋ณํํฉ๋๋ค.
Ast ๋ฒ์ (์ฆ, ์ ๋ ฅ ๋ฌธ์์ด)๋ฅผ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ๊ธฐ๋ณธ ์คํ ํ์ผ ์ด๋ฆ / ๊ฒฝ๋ก ๋ฐ ๋๋จธ์ง ๋ฌธ์์ด์ OS ๊ท์น์ ๋ฐ๋ผ ์ธ์ ๋๋ ์ธ์๋ก ๊ฐ์ ธ ์ค๋ ๊ฒฝ์ฐ์ ์๋ก์ด (์คํ์ฉ NativeCommandProcessor)๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.์ฌ์ฉ์๊ฐ ์์์ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๋ฉด "cmd"๋๋ "bash"๋ฅผ ์ ๋ ฅํด์ผํฉ๋๋ค. ์ด๋ ํธ์ง์์ด ์๋ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ณต์ฌ-๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๋ช ๋ น ์ค์g++ timer.cpp @conanbuildinfo.args -o timer --std=c++11
์ฒ๋ผ ์๋ํฉ๋๋ค.
๊ทธ ์๋ฏธ๋ฅผ ํ์ธํ๊ณ ์ถ์ต๋๋ค. ์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถ ํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ powershell ๊ตฌ๋ฌธ์ ๋ฌด์ํ ๊ฒ์ ์ ์ํฉ๋๊น?
๊ตฌ์ฒด์ ์ผ๋ก ๋งํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด
/bin/echo (1..5)
powershell์์ ๋ ์ด์ 1 2 3 4 5
๋ฅผ ์ถ๋ ฅํ์ง ์์ง๋ง ๋์ (1..5)
๋ฆฌํฐ๋ด์ ์ถ๋ ฅํด์ผํฉ๋๊น?
๊ทธ๊ฒ์ด ์ค์ ๋ก ๋น์ ์ด ์ ์ํ๋ ๊ฒ์ด๋ผ๋ฉด, ๋ด๊ฐ ๋งํด์ผ ํ ๊ฒ๋ณด๋ค : ๊ทธ๊ฒ์ ๋์ฐํ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ ์์ ์ ๋จ์ํํ์ง ์์ต๋๋ค (์ธ๋ถ ์คํ ํ์ผ์ ์ด์ ๋ด๋ถ cmdlet๊ณผ ๊ตฌ๋ฌธ ์ ๋ค๋ฅด๊ฒ ๋์ ํจ). ๋ํ # 1995 IMHO ...๋ก ์๋ฌด๊ฒ๋ ์ํ ํ ํ์๊ฐ ์์ต๋๋ค.
๋ฟก๋ฟก
์์์ :
- ๋ค๋ฅธ ์์ด๋ ๋ค๋ฅธ ์ธ์ด๊ฐ ์ด๊ฒ์ ๊ตฌํํฉ๋๊น ์๋๋ฉด ์ด๋ฏธ ๊ฐ์ง๊ณ ์์ต๋๊น? ๊ตฌ๋ฌธ ์์ค์์ ๋๋ ๋ค๋ฅธ ์์ค์์? ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ?
๋ด ๋ง์์ ๋ ์ค๋ฅด๋ ์ ์ผํ ๊ฒ์ ipythons !
operator์
๋๋ค .
ipython ์ถ๋ ฅ์์ !ps -'fax' || true
์คํ :
261 pts/0 Sl 0:00 \_ /usr/bin/python /usr/bin/ipython
311 pts/0 S 0:00 \_ /bin/bash -c ps -'fax' || true
312 pts/0 R 0:00 \_ ps -fax
( ps๋ ์ธ์ ์ฃผ์์ ๋ฐ์ดํ๋ฅผ ํ์ํ์ง ์์ง๋ง ps -'fax' || true
๋ ์ค์ ๋ก bash์ ๋ํ ๋จ์ผ ์ธ์๋ก ์ ๊ณต๋ฉ๋๋ค.)
๊ทธ๋ฌ๋์ด ๊ธฐ๋ฅ์ ์ฌ์ ํ โโํ์ด์ฌ ๋ณ์๋ฅผ ํด๋น ๋ช
๋ น ( {pyvar}
)์ผ๋ก ๋ณด๊ฐ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ @ mklement0 ์ ์ ์ ์ ์ฌํ๊ฒ ipython์ ์ด๊ฒ์ ๊ตฌํํฉ๋๋ค.
๊ทธ ์์ฒด๊ฐ ๊ป์ง์ด ์๋๊ธฐ ๋๋ฌธ์
ipython์ด python ๊ตฌ๋ฌธ ๋ง ํ์ฉํ๋ค๋ฉด ์ ธ๋ก์ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์์ ๊ฒ์ด๋ฏ๋ก์ด ๊ตฌ๋ฌธ์ด ๋ช ๋ น์ bash๋ก ์ ๋ฌํ์ฌ ์ ธ๋ก ์ฌ์ฉํ ์ ์๋๋กํฉ๋๋ค. ๋ค๋ฅธ ์์ ํธ์ถํ๊ธฐ์ํ ํน์ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋งค์ฐ ์ด์ํ ๊ฒ, ๊ทธ๋์ ๋ค๋ฅธ ํํธ ์ฃผ์ฅ์ PowerShell์, (# 1995๊ฐ ํด๊ฒฐ ๋ ๋๊น์ง, ๋๋ ๊ทธ๊ฒ์ด ์์ด๋ผ๊ณ ๋ง์ํ์ง ์์ต๋๋ค) ์์ด ๋ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ๊ฒ์ด ์ค์ ๋ก ๊ตฌํ ๋ ์ด์ ๊ฐ ๋ฌด์์ด๋ ๊ฐ์ (ํฌ๋ง์ ์ด์ง ์์ ๊ฒฝ์ฐ), "ํธ์ถ ์ ์ฐ์ฐ์"๋ก --%
๋์ !
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
!
๋ ์ฌ๋๋ค์ด ์ถ์ธก ํ ์์๋ ๊ฒ์
๋๋ค (ipython (๋๋ vim ๋ช
๋ น ๋ชจ๋ ๋๋ less
๋๋ ftp
)์์ ํด๋น ๋ชฉ์ ์ผ๋ก !
๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค.) )
๋ฐ๋ฉด์ --%
์ ์
๋ ฅํ๊ธฐ๊ฐ ๋ ์ด๋ ต๊ณ ์ถ์ธกํ๊ธฐ ์ด๋ ต๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. --%
์ ํ์ฌ ์ฌ์ฉ๋ฒ์ "๋ค๋ฅธ ์๋ก ๋ฌผ๊ฑด์ ์ ๋ฌ"ํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๊ณตํต์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋. ํ์ฌ --%
๋ cmd ๊ตฌ๋ฌธ์ ์ ํํ ํ๋์ ์์ ์ธ ๋ณ์ ๋์ฒด๋ฅผ ์๋ฎฌ๋ ์ดํธํฉ๋๋ค. ์ด์ค์ผ์ดํ ๋ฌธ์ ^
๋ฅผ ์ง์ํ์ง ์์ผ๋ฉฐ ํ์ผ๋ก์ ๋ฆฌ๋๋ ์
์ ํ์ฉํ์ง ์์ต๋๋ค. ํ์ฌ --%
์ ๋ํด ๋ค์ ์ ์ฉํ ์ ์ผํ ๊ฒ์ lpCommandLine
๊ทธ๋๋ก ๋ด์ฉ์ ์ ๋ฌํ๋ ๊ธฐ๋ฅ์
๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ๋ "call shell operator"๊ฐ ์ํ์ง ๋ชปํ๋ ๋ถ๋ถ์
๋๋ค.
์ ์ ๋ "call shell operator"์ ํ์ฌ --%
์ฌ์ด์ ๋ ๋ค๋ฅธ ์ฐจ์ด์ (์ด๋ฏธ ์ธ๊ธ ํ์) : ํ๋๋ ํ์ดํ๋ก ๋๋๊ณ ๋ค๋ฅธ ํ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ ๊ท ์ฌ์ฉ์์๊ฒ๋ ๋งค์ฐ ํผ๋ ์ค๋ฝ์ต๋๋ค. ๋ฐ๋ฉด์ !
๋ ์ง๊ธ๊น์ง ํ
์คํธ ํ ๋ชจ๋ ์์ฉ ํ๋ก๊ทธ๋จ (ipython, vim, less, ed ๋ฑ)์ ์์ |
๋ฅผ ์ ๋ฌํฉ๋๋ค.
HELP about_Logical_Operators -S
์, !
์์ฒด๋ ์ธ์ด์ ๋
ผ๋ฆฌ ๋ถ์ ์ฐ์ฐ์์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ๋ฉ๋๋ค.
BTW ๋์ฒด ์ ์ ์ค ํ๋๋ &!
-์ผ์ข
์ "์ฝ ๋ค์ดํฐ๋ธ / ์"์ฐ์ฐ์์์ต๋๋ค.
@TSlivede ๊ฐ "์ด๋ฐ ์ผ์ด ์ด๋ค ์ด์ ๋ก ์ค์ ๋ก ๊ตฌํ
$
๊ฐ _both_์ ๋ณ์์๊ธธ๋ก ์ฌ์ฉ๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ฐ์ฐ์ / ๋ฌธ (_ ๊ฐ๋ณ ์ธ์ ํฌํจ _)์ I-want-to-use-PowerShell-values-in-the-native-command-line ๋ฌธ์ ๋ฅผ ๋ช
ํํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค. PowerShell ๋ฐ POSIX ์ ์ฌ ์
ธ.
์ ์ฒด ๋ค์ดํฐ๋ธ ๋ช ๋ น ์ค ์ฃผ์์ ๋ช ์์ ์ธ ๊ตฌ๋ถ ๊ธฐํธ๊ฐ์๋ ์ฐ์ฐ์ / ๋ฌธ์ ๋ค์ดํฐ๋ธ ๋ช ๋ น ์ค ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
@ PowerShell / powershell-committee๋ ์ค๋ ์ด๊ฒ์ ๋ ผ์ํ์ต๋๋ค. ์ด ์์ ์์ ์ด๊ธฐ ๋ฌธ์ ์ง์ ์ ๋ํ ํฉ์ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ์ค๊ณ๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์์ ์ ์ธ ์ค๊ณ๋ก 7.1์์ด๋ฅผ ์ ์๋ค๊ณ ๋ฏฟ์ง ์์ต๋๋ค.
@ PowerShell / powershell-committee๋ ์ค๋ ์ด๊ฒ์ ๋ ผ์ํ์ต๋๋ค. ์ด ์์ ์์ ์ด๊ธฐ ๋ฌธ์ ์ง์ ์ ๋ํ ํฉ์ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ์ค๊ณ๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์์ ์ ์ธ ์ค๊ณ๋ก 7.1์์ด๋ฅผ ์ ์๋ค๊ณ ๋ฏฟ์ง ์์ต๋๋ค.
๋๊ธ 182 ๊ฐ!
์ด๊ฒ์ ๋ํ ์ข์ ํ ๋ก ์ด์์์ต๋๋ค! ์ด ๋ฌธ์ ์ ๋ํ ์๋ก์ด ์๊ฒฌ์ ๊ณ์ ๋ชจ๋ํฐ๋งํ๊ฒ ์ต๋๋ค. ์ปค๋ฎค๋ํฐ์์์ด ๋ฌธ์ ์ ๊ด๊ณ์์ด PSGallery์ ๊ฒ์ ๋ Invoke-NativeCommand
์ ํ cmdlet์ ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
https://github.com/PowerShell/PowerShell/issues/13068#issuecomment -662732627์์ ํํํ์ง๋ง ๋งค์ฐ ์ ์ฉํ ์๋ฃจ์ ์ด ์์์ ๋ ๋ถํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋น์ ์ด ํฉ์๋ฅผ ์ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ๋๋ก๋ ํํ์ด ์ผ์ด๋ ์์๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ๋๋ค. ์๋์, ์๋ฒฝํ์ง๋ ์์ง๋ง ํ ์ค์ง๋ฆฌ SO ์๋ฃจ์ ์ด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ ์ด๋์ด ์ฌ๋์ ์๊ฒฌ์ผ๋ก๋.
@essentialexch , ์ฐ๋ฆฌ๋ PowerShell ํ ๋ด์์ ํฉ์์กฐ์ฐจ ์์ต๋๋ค.
์ด๊ฒ์ด ์ฐ๊ธฐ๋์์ผ๋ฏ๋ก ํฌํผ ๊ตฌํ์ ์ด๋ป์ต๋๊น?
Invoke-Shell (Invoke-NativeShell), Test-Arguments (์ : ๋ค์ดํฐ๋ธ ์ฑ์ด ์ฌ์ฉ์์๊ฒ ๋์๋ง์ ๊ฐ์ ธ์ค๊ณ ํ์ํ๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ echoargs.exe), Convert-Arguments (์ฌ์ฉ์ ์ ๋ ฅ์ ์ค๋ฅธ์ชฝ ์ด์ค์ผ์ดํ ์ธ์).
Test-Arguments๊ฐ ๋งค์ฐ ์ ์ฉ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ ๋ฐฉ๊ธ Native
, ( Install-Module Native -Scope CurrentUser
) ๋ชจ๋์ ๊ฒ์ํ์ต๋๋ค.์ด ๋ชจ๋์ ์ ์ @rkeithhill ์ ์ฃผ์์์
๊ฐ๋
์ ์๊ฐ๋ฅผ ์์ ๊ณ ์ถ๋ค๋ฉด ์ ์ค ์ผ์ด์ค๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
_ ๊ทธ ์ค ์ด๋ ๊ฒ๋ ๊ตฌ๋ฌธ ๋ถ์์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค _.
_ ๊ฐ๋ณ ๋ช ๋ น _ (์ฌ์ฉ ์ฌ๋ก 1) ๋๋ ์ ์ฒด _ ๋ค์ค ๋ช ๋ น ๋ช ๋ น ์ค _ (์ฌ์ฉ ์ฌ๋ก 2) _ ํ๋ซํผ ๋ค์ดํฐ๋ธ ์ ธ์ฉ์ผ๋ก ์์ฑ๋ _ (์ด ๋ฌธ์ )์ ์คํํ๋ ค๊ณ ํฉ๋๋ค.
ins
( Invoke-NativeShell
) ๋ ์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.# Use case 1: Single executable call with line continuation, on Unix.
@'
tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz \
--exclude=/proc \
--exclude=/lost+found
'@ | ins
# Use case 2: Entire Bash command line (also with line continuation)
@'
ps -o pid,args | awk \
'/pwsh/ { print $1 }'
'@ | ins
# Use case 2a: Entire Bash command line (also with line continuation) with string interpolation.
# Note the double-quoted here-string and the need to escape the $ that is for Bash as `$
$fields = 'pid,args'
@"
ps -o $fields | awk \
'/pwsh/ { print `$1 }'
"@ | ins
# Alternative to use case 2a: pass the PowerShell value *as a pass-through argument*,
# which allows passing the script verbatim.
# Bash sees the pass-through arguments as $1, ... (note that the `awk` $1 is unrelated).
@'
ps -o $1 | awk \
'/pwsh/ { print $1 }'
'@ | ins - 'pid,args'
here-string ๊ตฌ๋ฌธ์ ๊ฐ์ฅ ํธ๋ฆฌํ์ง๋ ์์ง๋ง (๋ฐ๋ผ์ ์ธ๋ผ์ธ ๋ณํ์ ๊ตฌํํ๋ผ๋ ์ ์-# 13204 ์ฐธ์กฐ) ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ถ์ด ๋ช
๋ น์ ๊ฒฝ์ฐ '...'
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ๊ฒฝ์ฐ _doubling_ ํฌํจ ๋ '
๋ง ํ์ํฉ๋๋ค.
๋ํ ๋ค์ ์ "StackOverflow ์ฐ์ฐ์"๋ฅผ ๋์ฒด ํ๋
PSReadLine
ํค ํธ๋ค๋ฌ๋ฅผ $PROFILE
ํ์ผ์ ๋ฐฐ์นํ๋ฉด Alt-v ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๊ธฐ ๋ฌธ์์ด๋ก ins
๋ํ ํธ์ถ์ ์ค์บ ํด๋ฉ ํ ์ ์์ต๋๋ค. ํ์ฌ ํด๋ฆฝ ๋ณด๋ ํ
์คํธ๊ฐ ๋ถ์ฌ ๋ฃ์ด์ง๋๋ค.Enter ๋ ํธ์ถ์ ์ ์ถํฉ๋๋ค.
# Scaffolds an ins (Invoke-NativeShell) call with a verbatim here-string
# and pastes the text on the clipboard into the here-string.
Set-PSReadLineKeyHandler 'alt+v' -ScriptBlock {
[Microsoft.PowerShell.PSConsoleReadLine]::Insert("@'`n`n'@ | ins ")
foreach ($i in 1..10) { [Microsoft.PowerShell.PSConsoleReadLine]::BackwardChar() }
# Comment the following statement out if you don't want to paste from the clipboard.
[Microsoft.PowerShell.PSConsoleReadLine]::Insert((Get-Clipboard))
}
_ ๊ฐ๋ณ ์ธ์ _ (์ฌ์ฉ ์ฌ๋ก 1a ๋ฐ 3)์ ํจ๊ป _PowerShell_์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ _ ๋จ์ผ ์ธ๋ถ ์คํ ํ์ผ _์ ํธ์ถํ๋ ค๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ ์ ธ์ ํต์ฌ ์๊ตฌ ์ฌํญ์ด๋ฉฐ ๊ฐ๋ ฅํ๊ฒ ์๋ํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
_PowerShell's_ ๊ตฌ๋ฌธ ๋ฐ _its_ ์ธ์ ๋ชจ๋ ๋ฉํ ๋ฌธ์๋ฅผ ์ดํดํด์ผํฉ๋๋ค.
`
๋ ์ด์ค์ผ์ดํ ๋ฌธ์์ ์ค ์ฐ์์ผ๋ก ์ฌ์ฉ๋๋ค๋ ์ ์ ์ ์ํด์ผํฉ๋๋ค.PowerShell์๋ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ธ์ฉ / ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ถ๊ฐ ๋ฉํ ๋ฌธ์๊ฐ ์์์ ์๊ณ ์์ด์ผํฉ๋๋ค. ๋ค์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค ( @
๋ ์ธ์์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก๋ง ๋ฌธ์ ๊ฐ๋ฉ๋๋ค.) :
@ { } `
(PowerShell์ ์ํ ์ฌ์ ํ์ฅ์ ๋ฐฉ์งํ๋ ค๋ ๊ฒฝ์ฐ $
)cmd.exe
: ( ) @ { } # `
`
-์ด๋ฌํ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค. ์ถฉ๋ถํฉ๋๋ค (์ : printf %s `@list.txt
).# 1995๊ฐ ์์ ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์, ํจ์ ie
(for i nvoke (external) e xecutable)์ ๋จ์ํ ์ง์ ํธ์ถ์ ์ถ๊ฐ
# This command is currently broken, because the '{ "name": "foo" }' argument isn't properly passed.
curl.exe -u jdoe 'https://api.github.com/user/repos' -d '{ "name": "foo" }'
๋ค์์ ์ฌ์ฉํฉ๋๋ค.
# OK, thanks to `ie`
ie curl.exe -u jdoe 'https://api.github.com/user/repos' -d '{ "name": "foo" }'
Native
๋ชจ๋์ echoArgs.exe
, dbea
( Debug-ExecutableArguments
) ๋ช
๋ น๊ณผ ์ ์ฌํฉ๋๋ค. Windows์ ์ํ ์ถ๋ ฅ :
# Note the missing first argument, the missing " chars., and the erroneous argument boundaries.
PS> dbea '' 'a&b' '3" of snow' 'Nat "King" Cole' 'c:\temp 1\' 'a \" b'
7 argument(s) received (enclosed in <...> for delineation):
<a&b>
<3 of snow Nat>
<King>
<Cole c:\temp>
<1\ a>
<">
<b>
Command line (helper executable omitted):
a&b 3" of snow "Nat "King" Cole" "c:\temp 1\\" "a \" b"
-UseIe
( -ie
) ์ค์์น๋ฅผ ์ฌ์ฉํ์ฌ dbea
๋ฅผ ํตํด ie
๋ฅผ ํตํด ์ธ์๋ฅผ ์ ๋ฌํ๋๋ก ์ง์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์์ ๋ณด์ฌ์ค๋๋ค.
# OK, thanks to -UseIe
PS> dbea -UseIe '' 'a&b' '3" of snow' 'Nat "King" Cole' 'c:\temp 1\' 'a \" b'
6 argument(s) received (enclosed in <...> for delineation):
<>
<a&b>
<3" of snow>
<Nat "King" Cole>
<c:\temp 1\>
<a \" b>
Command line (helper executable omitted):
"" a&b "3\" of snow" "Nat \"King\" Cole" "c:\temp 1\\" "a \\\" b"
์ฐธ๊ณ : # 1995๊ฐ ์์ ๋๋ฉด ie
๋ ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค. ์๋ฐฉํฅ ํธํ์ฑ์ ์ํด ie
๋ ์์ ์ฌํญ์ ๊ฐ์งํ๊ณ ์๋์ผ๋ก ์ฐ๊ธฐํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ฆ, ์์ ์ฌํญ์ด ์ ์ฉ๋๋ฉด ie
์ (๋) ๋์ ์ ์ฉ์ ์ค์งํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ง์ / &
ํธ์ถ์ฒ๋ผ ์๋ํฉ๋๋ค.
_Windows ์ ์ฉ _์์ ๋ฐ์ํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ท์น๊ณผ ๋ค๋ฅธ ์ธ์ฉ ์๊ตฌ ์ฌํญ์ด ์๋ "๋ถ๋"์คํ ํ์ผ์ ํธ์ถํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, msiexec.exe
๋ฐ msdeploy.exe
์์๋ prop="<value with spaces>"
๋ฅผ ์ ํํ๊ฒ ์ธ์ฉํด์ผํฉ๋๋ค.-_value_ ๋ถ๋ถ ์ฃผ์์ ์ธ์ฉ-๋น๋ก "prop=<value with spaces>"
-์ ์ฒด ์ธ์ฉ ์ธ์-_should_ ๋์ผํด์ผํฉ๋๋ค (ํ์๋ PowerShell-์ ๋นํ๊ฒ-๋ค์์ ์ํํ๋ ์์
์
๋๋ค).
๊ณต๋ฐฑ์ ํฌํจํ์ง ์์ง๋ง &
, ^
๋๋ |
์ ๊ฐ์ cmd.exe
๋ฉํ ๋ฌธ์ _๋ฅผ ํฌํจํ๋ _an ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ _a ๋ฐฐ์น ํ์ผ _์ ํธ์ถํฉ๋๋ค. ์ :
.\someBatchFile.cmd 'http://example.org/a&b'
PowerShell-์ ๋นํ๊ฒ- http://example.org/a&b
_unquoted_ (ํฌํจ ๋ ๊ณต๋ฐฑ์ด ์๊ธฐ ๋๋ฌธ์)๋ฅผ ์ ๋ฌํ์ง๋ง์ด ๊ฒฝ์ฐ ๋ฐฐ์น ํ์ผ ํธ์ถ์ด ์ค๋จ๋ฉ๋๋ค. cmd.exe
-๋ถ๋นํ๊ฒ-๋ฐฐ์น ํ์ผ์ ์ ๋ฌ ๋ ์ธ์๊ฐ ๋ฆฌํฐ๋ด๋ก ๋ฐ์๋ค์ด๋ ๋์ cmd.exe
๋ด๋ถ์ ์ ์ฉ๋๋ ๋์ผํ ๊ตฌ๋ฌธ ๋ถ์ ๊ท์น์
๋๋ค.
์ฐธ๊ณ : ๋ฐฐ์น ํ์ผ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ _ ์ง์ _ ๊ตฌํํ๋ ๊ฒ์ ์๋ง ์ค์ด๋ค๊ณ ์์ง๋ง, ๋ฐฐ์น ํ์ผ az.cmd
๋ก ๊ตฌํ๋๋ Azure์ az
CLI์ ๊ฐ์ด _CLI ์ง์
์ _์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ ํ โโ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค.
์ฐธ๊ณ : ie
๋ ๋ฐฐ์น ํ์ผ๊ณผ msiexec.exe
๋ฐ msdeploy.exe
๋ํด ์ด๋ฌํ ์๋๋ฆฌ์ค๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก _most_ ํธ์ถ์ ๋ํด ์ถ๊ฐ ๋
ธ๋ ฅ์ด ํ์ํ์ง ์์ต๋๋ค . ๊ทธ๋ฌ๋ _all_ "์
์ฑ"์คํ ํ์ผ์ ์์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
cmd.exe
๋ผ๋ ๊ฒฝ์ฐ ๋ช
๋ น ์ค์ ์ธ์์ ์์ฒด ํด์์ ์ ์ฉํ ํ _does_ ์ง์ ๋๋๋ก ์ธ์ฉ์ ์ ์งํ๋ฉด Windows์์ ins
ํธ์ถ์ ์์ ํ ์ ์์ต๋๋ค.
ins '.\someBatchFile.cmd "http://example.org/a&b"'
$url = 'http://example.org/a&b'; ins ".\someBatchFile.cmd `"$url`""
๋๋ ํ์ฌ --%
๊ตฌํ์ ์ฌ์ฉํ๋ ์ ํ ์ฌํญ์ ์ ์ํ์ญ์์ค.
.\someBatchFile.cmd --% "http://example.org/a&b"'
--%
๊ฐ ๊ตฌํ๋๋ ๋ฐฉ์์ ๊ณ ๋ คํ ๋ PowerShell ๊ฐ์ ํฌํจํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ _aux๋ฅผ ์ ์ํ๋ ๊ฒ์
๋๋ค. ํ๊ฒฝ ๋ณ์ _ ๋ฐ %...%
๊ตฌ๋ฌธ์ผ๋ก ์ฐธ์กฐํ์ญ์์ค.$env:url = 'http://example.org/a&b'; .\someBatchFile.cmd --% "%url%"
๋ณด๋ฅ์ค์ธ https://github.com/PowerShell/PowerShell-RFC/pull/88 ์ ์ธ๋ถ (๋ค์ดํฐ๋ธ) ์คํ ํ์ผ๊ณผ ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ํตํฉ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ ๋์ Native
๋ชจ๋ ์๋ 0์ด ์๋ ์ข
๋ฃ ์ฝ๋๋ฅผ ์คํฌ๋ฆฝํธ ์ข
๋ฃ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๋ ์ ๋ํน ์ตํธ ์ธ์ ์ํ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ด ํฌํจ๋์ด
ins
๋ -e
/ -ErrorOnFailure
์ค์์น๋ฅผ ์ง์ํฉ๋๋ค.์ด ์ค์์น๋ ๋ค์ดํฐ๋ธ ์
ธ์ ํธ์ถ ํ ํ $LASTEXITCODE
๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
iee
๋ ie
๋ํ ๋ํผ ํจ์๋ก, ์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถ ํ ํ $LASTEXITCODE
์ด 0์ด ์๋๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ชจ๋๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๋ช
๋ น์๋ ๋ง์ ๋ฏธ๋ฌํจ์ด ์์ต๋๋ค.
์๋นํ ๊ด๋ฒ์ํ ์ฃผ์ ๊ธฐ๋ฐ ๋์๋ง์ด ์ถฉ๋ถํ ๋ค๋ฃจ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๊ฐ๋ ์ ์๊ฐ๋ฅผ ์์ ๊ณ ์ถ๋ค๋ฉด ์ ์ค ์ผ์ด์ค๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํฐ! ์ด์ ์ ๊ฒ์ ํ ๋ด์ฉ์ ์ฌ๋๋ค์ด ๋ ๋์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ํด ์๊ฐํ๊ฒํ๊ธฐ์ํ ๊ฒ์ ๋๋ค.
์ด์ ์ ์ ์ํ ๊ฒ๊ณผ ๋ค๋ฅธ ins
( Invoke-NativeShell
)์ ๋ช ๊ฐ์ง ์ค์ํ ์ธก๋ฉด์ ๋ช
ํํํด์ผํฉ๋๋ค. ๋ชฉํ๋ bash
์ ํธ์ฌ์ฑ์ ์ค๋ช
ํ๊ณ ํ๋ซํผ๊ฐ์ ์ผ๊ด๋ CLI๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์์ต๋๋ค.
Unix ์์๋ Bash์ ํธ์ฌ์ฑ์ ๊ณ ๋ คํ ๋ /bin/sh
/bin/bash
๋์ -UseSh
( -sh
์ ํจ๊ป -UseSh
/bin/sh
์ฌ์ฉ์ ์ ํํ ์ ์์ต๋๋ค -sh
) ( /bin/sh
๋ /bin/bash
์ด (๊ฐ) ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์ ๋๋น์ฑ
์ญํ ๋ํฉ๋๋ค).
$0
๋ฅผ ์ค์ ํ๋ ๊ธฐ๋ฅ์ ์จ๊ฒผ์ต๋๋ค. ์ฆ, ๋ชจ๋ ํต๊ณผ ์ธ์๋ $1
. ์ด๋ ํ์ดํ ๋ผ์ธ์์ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ดํ ํ ๋ ์ธ์๊ฐ ์ ๋ฌ๋๋ ๋ฐฉ์๊ณผ ์ฌ์ฉ์๊ฐ ์์ํ๋ ๊ฒ๊ณผ ์ผ์นํฉ๋๋ค.# Script as argument
PSonUnix> ins 'echo $# arguments; echo "[$1] [$2]"' one two
2 arguments
[one] [two]
# Script via pipeline; note the "-" to signal that the script is piped.
PSonUnix> 'echo $# arguments; echo "[$1] [$2]"' | ins - one two
2 arguments
[one] [two]
# As an aside: script as argument, with pipeline input *as data*:
PSonUnix> 'one', 'two' | ins 'cat -n'
1 one
2 two
์๋์ฐ I์ ๊ธฐ์ ์ ์ธ ์ด์ ๋ก ๋ค์์ ์์ _batch์ file_๋ฅผ ์ฌ์ฉํ๋ค,ํ์ง๋ง ๋ ๋ฐฐ์น ํ์ผ ๊ตฌ๋ฌธ์ ์ฌ์ฉ์ (์ด์จ๋ ๊ถ๊ทน์ ์ผ๋ก ๋ ๋์ ์ ํ์ด๋ผ๊ณ ์๊ฐ %%i
๋ณด๋ค๋ %i
์์ for
๋ฃจํ ๋ณ์, %
๋ฅผ %%
๋ก ์ด์ค์ผ์ดํํ๋ ๊ธฐ๋ฅ).
# Script as argument
PSonWin> ins 'echo [%1] [%2]' one two
[one] [two]
# Script via pipeline; note the "-" to signal that the script is piped.
PSonWin> 'echo [%1] [%2]' | ins - one two
[one] [two]
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ๋ ๋ฐฉ๊ธ
Native
, (Install-Module Native -Scope CurrentUser
) ๋ชจ๋์ ๊ฒ์ํ์ต๋๋ค.์ด ๋ชจ๋์ ์ ์ @rkeithhill ์ ์ฃผ์์์๊ฐ๋ ์ ์๊ฐ๋ฅผ ์์ ๊ณ ์ถ๋ค๋ฉด ์ ์ค ์ผ์ด์ค๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
_ ๊ทธ ์ค ์ด๋ ๊ฒ๋ ๊ตฌ๋ฌธ ๋ถ์์ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค _.
์ฌ์ฉ ์ฌ๋ก [๋ค์ดํฐ๋ธ ์ ํธ์ถ] :
_ ๊ฐ๋ณ ๋ช ๋ น _ (์ฌ์ฉ ์ฌ๋ก 1) ๋๋ ์ ์ฒด _ ๋ค์ค ๋ช ๋ น ๋ช ๋ น ์ค _ (์ฌ์ฉ ์ฌ๋ก 2) _ ํ๋ซํผ ๋ค์ดํฐ๋ธ ์ ธ์ฉ์ผ๋ก ์์ฑ๋ _ (์ด ๋ฌธ์ )์ ์คํํ๋ ค๊ณ ํฉ๋๋ค.
ins
(Invoke-NativeShell
) ๋ ์ด๋ฌํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.here-string ๊ตฌ๋ฌธ์ ๊ฐ์ฅ ํธ๋ฆฌํ์ง๋ ์์ง๋ง (๋ฐ๋ผ์ ์ธ๋ผ์ธ ๋ณํ์ ๊ตฌํํ๋ผ๋ ์ ์-# 13204 ์ฐธ์กฐ) ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ถ์ด ๋ช ๋ น์ ๊ฒฝ์ฐ
'...'
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด ๊ฒฝ์ฐ _doubling_ ํฌํจ ๋'
๋ง ํ์ํฉ๋๋ค.๋ํ ๋ค์ ์ "StackOverflow ์ฐ์ฐ์"๋ฅผ ๋์ฒด ํ๋
PSReadLine
ํค ํธ๋ค๋ฌ๋ฅผ$PROFILE
ํ์ผ์ ๋ฐฐ์นํ๋ฉด Alt-v ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๊ธฐ ๋ฌธ์์ด๋กins
๋ํ ํธ์ถ์ ์ค์บ ํด๋ฉ ํ ์ ์์ต๋๋ค. ํ์ฌ ํด๋ฆฝ ๋ณด๋ ํ ์คํธ๊ฐ ๋ถ์ฌ ๋ฃ์ด์ง๋๋ค.Enter ๋ ํธ์ถ์ ์ ์ถํฉ๋๋ค.์ฌ์ฉ ์ฌ๋ก [์ง์ ์คํ ๊ฐ๋ฅํ ํธ์ถ] :
_ ๊ฐ๋ณ ์ธ์ _ (์ฌ์ฉ ์ฌ๋ก 1a ๋ฐ 3)์ ํจ๊ป _PowerShell_์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ _ ๋จ์ผ ์ธ๋ถ ์คํ ํ์ผ _์ ํธ์ถํ๋ ค๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ ์ ธ์ ํต์ฌ ์๊ตฌ ์ฌํญ์ด๋ฉฐ ๊ฐ๋ ฅํ๊ฒ ์๋ํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค.
_PowerShell's_ ๊ตฌ๋ฌธ ๋ฐ _its_ ์ธ์ ๋ชจ๋ ๋ฉํ ๋ฌธ์๋ฅผ ์ดํดํด์ผํฉ๋๋ค.
`
๋ ์ด์ค์ผ์ดํ ๋ฌธ์์ ์ค ์ฐ์์ผ๋ก ์ฌ์ฉ๋๋ค๋ ์ ์ ์ ์ํด์ผํฉ๋๋ค.PowerShell์๋ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ธ์ฉ / ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ถ๊ฐ ๋ฉํ ๋ฌธ์๊ฐ ์์์ ์๊ณ ์์ด์ผํฉ๋๋ค. ๋ค์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค (
@
๋ ์ธ์์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก๋ง ๋ฌธ์ ๊ฐ๋ฉ๋๋ค.) :@ { } `
(PowerShell์ ์ํ ์ฌ์ ํ์ฅ์ ๋ฐฉ์งํ๋ ค๋ ๊ฒฝ์ฐ$
)cmd.exe
:( ) @ { } # `
`
-์ด๋ฌํ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค. ์ถฉ๋ถํฉ๋๋ค (์ :printf %s `@list.txt
).# 1995๊ฐ ์์ ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์, ํจ์
ie
(for i nvoke (external) e xecutable)์ ๋จ์ํ ์ง์ ํธ์ถ์ ์ถ๊ฐ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
Native
๋ชจ๋์echoArgs.exe
,dbea
(Debug-ExecutableArguments
) ๋ช ๋ น๊ณผ ์ ์ฌํฉ๋๋ค. Windows์ ์ํ ์ถ๋ ฅ :-UseIe
(-ie
) ์ค์์น๋ฅผ ์ฌ์ฉํ์ฌdbea
๋ฅผ ํตํดie
๋ฅผ ํตํด ์ธ์๋ฅผ ์ ๋ฌํ๋๋ก ์ง์ ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์์ ๋ณด์ฌ์ค๋๋ค.์ฐธ๊ณ : # 1995๊ฐ ์์ ๋๋ฉด
ie
๋ ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค. ์๋ฐฉํฅ ํธํ์ฑ์ ์ํดie
๋ ์์ ์ฌํญ์ ๊ฐ์งํ๊ณ ์๋์ผ๋ก ์ฐ๊ธฐํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ฆ, ์์ ์ฌํญ์ด ์ ์ฉ๋๋ฉดie
์ (๋) ๋์ ์ ์ฉ์ ์ค์งํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ง์ /&
ํธ์ถ์ฒ๋ผ ์๋ํฉ๋๋ค.์ฌ์ฉ ์ฌ๋ก [์ง์ ๋ถ๋ Windows ์คํ ๊ฐ๋ฅ ํธ์ถ] :
_Windows ์ ์ฉ _์์ ๋ฐ์ํ๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ท์น๊ณผ ๋ค๋ฅธ ์ธ์ฉ ์๊ตฌ ์ฌํญ์ด ์๋ "๋ถ๋"์คํ ํ์ผ์ ํธ์ถํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
msiexec.exe
๋ฐmsdeploy.exe
์์๋prop="<value with spaces>"
๋ฅผ ์ ํํ๊ฒ ์ธ์ฉํด์ผํฉ๋๋ค.-_value_ ๋ถ๋ถ ์ฃผ์์ ์ธ์ฉ-๋น๋ก"prop=<value with spaces>"
-์ ์ฒด ์ธ์ฉ ์ธ์-_should_ ๋์ผํด์ผํฉ๋๋ค (ํ์๋ PowerShell-์ ๋นํ๊ฒ-๋ค์์ ์ํํ๋ ์์ ์ ๋๋ค).๊ณต๋ฐฑ์ ํฌํจํ์ง ์์ง๋ง
&
,^
๋๋|
์ ๊ฐ์cmd.exe
๋ฉํ ๋ฌธ์ _๋ฅผ ํฌํจํ๋ _an ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ _a ๋ฐฐ์น ํ์ผ _์ ํธ์ถํฉ๋๋ค. ์ :.\someBatchFile.cmd 'http://example.org/a&b'
PowerShell-์ ๋นํ๊ฒ-
http://example.org/a&b
_unquoted_ (ํฌํจ ๋ ๊ณต๋ฐฑ์ด ์๊ธฐ ๋๋ฌธ์)๋ฅผ ์ ๋ฌํ์ง๋ง์ด ๊ฒฝ์ฐ ๋ฐฐ์น ํ์ผ ํธ์ถ์ด ์ค๋จ๋ฉ๋๋ค.cmd.exe
-๋ถ๋นํ๊ฒ-๋ฐฐ์น ํ์ผ์ ์ ๋ฌ ๋ ์ธ์๊ฐ ๋ฆฌํฐ๋ด๋ก ๋ฐ์๋ค์ด๋ ๋์cmd.exe
๋ด๋ถ์ ์ ์ฉ๋๋ ๋์ผํ ๊ตฌ๋ฌธ ๋ถ์ ๊ท์น์ ๋๋ค.์ฐธ๊ณ : ๋ฐฐ์น ํ์ผ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ _ ์ง์ _ ๊ตฌํํ๋ ๊ฒ์ ์๋ง ์ค์ด๋ค๊ณ ์์ง๋ง, ๋ฐฐ์น ํ์ผ
az.cmd
๋ก ๊ตฌํ๋๋ Azure์az
CLI์ ๊ฐ์ด _CLI ์ง์ ์ _์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ ํ โโ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค.์ฐธ๊ณ :
ie
๋ ๋ฐฐ์น ํ์ผ๊ณผmsiexec.exe
๋ฐmsdeploy.exe
๋ํด ์ด๋ฌํ ์๋๋ฆฌ์ค๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก _most_ ํธ์ถ์ ๋ํด ์ถ๊ฐ ๋ ธ๋ ฅ์ด ํ์ํ์ง ์์ต๋๋ค . ๊ทธ๋ฌ๋ _all_ "์ ์ฑ"์คํ ํ์ผ์ ์์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
cmd.exe
๋ผ๋ ๊ฒฝ์ฐ ๋ช ๋ น ์ค์ ์ธ์์ ์์ฒด ํด์์ ์ ์ฉํ ํ _does_ ์ง์ ๋๋๋ก ์ธ์ฉ์ ์ ์งํ๋ฉด Windows์์ins
ํธ์ถ์ ์์ ํ ์ ์์ต๋๋ค.ins '.\someBatchFile.cmd "http://example.org/a&b"'
$url = 'http://example.org/a&b'; ins ".\someBatchFile.cmd `"$url`""
๋๋ ํ์ฌ
--%
๊ตฌํ์ ์ฌ์ฉํ๋ ์ ํ ์ฌํญ์ ์ ์ํ์ญ์์ค..\someBatchFile.cmd --% "http://example.org/a&b"'
--%
๊ฐ ๊ตฌํ๋๋ ๋ฐฉ์์ ๊ณ ๋ คํ ๋ PowerShell ๊ฐ์ ํฌํจํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ _aux๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ํ๊ฒฝ ๋ณ์ _ ๋ฐ%...%
๊ตฌ๋ฌธ์ผ๋ก ์ฐธ์กฐํ์ญ์์ค.$env:url = 'http://example.org/a&b'; .\someBatchFile.cmd --% "%url%"
์ค๋ฅ ์ฒ๋ฆฌ
๋ณด๋ฅ์ค์ธ https://github.com/PowerShell/PowerShell-RFC/pull/88 ์ ์ธ๋ถ (๋ค์ดํฐ๋ธ) ์คํ ํ์ผ๊ณผ ๋ ๋์ ์ค๋ฅ ์ฒ๋ฆฌ ํตํฉ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ ๋์
Native
๋ชจ๋ ์๋ 0์ด ์๋ ์ข ๋ฃ ์ฝ๋๋ฅผ ์คํฌ๋ฆฝํธ ์ข ๋ฃ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ๋ ์ ๋ํน ์ตํธ ์ธ์ ์ํ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ด ํฌํจ๋์ดins
๋-e
/-ErrorOnFailure
์ค์์น๋ฅผ ์ง์ํฉ๋๋ค.์ด ์ค์์น๋ ๋ค์ดํฐ๋ธ ์ ธ์ ํธ์ถ ํ ํ$LASTEXITCODE
๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.iee
๋ie
๋ํ ๋ํผ ํจ์๋ก, ์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถ ํ ํ$LASTEXITCODE
์ด 0์ด ์๋๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.๋ชจ๋๊ณผ ํจ๊ป ์ ๊ณต๋๋ ๋ช ๋ น์๋ ๋ง์ ๋ฏธ๋ฌํจ์ด ์์ต๋๋ค.
์๋นํ ๊ด๋ฒ์ํ ์ฃผ์ ๊ธฐ๋ฐ ๋์๋ง์ด ์ถฉ๋ถํ ๋ค๋ฃจ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.