Powershell: ์›์–ด๋ฏผ ์ „ํ™”

์— ๋งŒ๋“  2020๋…„ 06์›” 30์ผ  ยท  189์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: PowerShell/PowerShell

๋ฌธ์ œ ์„ค๋ช…

ํ˜„์žฌ ๊ธฐ๋ณธ ๋ช…๋ น ์ค„์„ ์ž˜๋ผ๋‚ด์–ด ๋ถ™์—ฌ ๋„ฃ๊ธฐ๊ฐ€ PowerShell์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ช…๋ น์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋”ฐ์˜ดํ‘œ์˜ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ ๋ถ„์„ ๋˜๋Š” PowerShell๋กœ ํ•ด์„๋˜์ง€ ์•Š๋Š” PowerShell ๊ตฌ๋ฌธ ์‚ฌ์šฉ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PowerShell์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ --% ํŠน์ˆ˜ ์ธ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์ธ์ˆ˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ช…๋ น์— ์ „๋‹ฌ ๋œ ๋ฆฌํ„ฐ๋Ÿด๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š”์ด ํŠน์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.
  2. | , && ๋ฐ || ์ด ์šฐ์„ ํ•˜๋ฏ€๋กœ wsl --% ls | less ๋Š” wsl ls ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ less ํŒŒ์ดํ”„ํ•ฉ๋‹ˆ๋‹ค less WSL์—์„œ ์‹คํ–‰
  3. ๋ช…๋ น ์ค„์„ ์ž˜๋ผ๋‚ด์–ด ๋ถ™์—ฌ ๋„ฃ๋Š” ๊ฒฝ์šฐ ์‹œ์ž‘ ๋ถ€๋ถ„์— --% ๋ฅผ ์‚ฝ์ž…ํ•˜๋„๋ก ์ค„์„ ํŽธ์ง‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  4. Unix ์‹œ์Šคํ…œ์—์„œ-% ์ดํ›„์˜ args๋Š” Unix์˜ ๊ธฐ๋ณธ ๋ช…๋ น์ด ์‰˜์ด globbing์„ ์ˆ˜ํ–‰ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ globbing์—†์ด ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ ๋œ ๊ธฐ์ˆ  ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด

์ œ์•ˆ์€ ์ƒˆ๋กœ์šด --% (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

Committee-Reviewed Issue-Discussion Issue-Enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ €๋Š” ๋ฐฉ๊ธˆ Native , ( Install-Module Native -Scope CurrentUser ) ๋ชจ๋“ˆ์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๋ชจ๋“ˆ์€ ์œ„ ์˜ @rkeithhill ์˜ ์ฃผ์„์—์„œ

๊ฐœ๋…์  ์•ˆ๊ฐœ๋ฅผ ์—†์• ๊ณ  ์‹ถ๋‹ค๋ฉด ์œ ์Šค ์ผ€์ด์Šค๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
_ ๊ทธ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ตฌ๋ฌธ ๋ถ„์„์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค _.

์‚ฌ์šฉ ์‚ฌ๋ก€ [๋„ค์ดํ‹ฐ๋ธŒ ์‰˜ ํ˜ธ์ถœ] :

_ ๊ฐœ๋ณ„ ๋ช…๋ น _ (์‚ฌ์šฉ ์‚ฌ๋ก€ 1) ๋˜๋Š” ์ „์ฒด _ ๋‹ค์ค‘ ๋ช…๋ น ๋ช…๋ น ์ค„ _ (์‚ฌ์šฉ ์‚ฌ๋ก€ 2) _ ํ”Œ๋žซํผ ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ _ (์ด ๋ฌธ์ œ)์„ ์‹คํ–‰ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์…ธ์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ _it_๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ช…๋ น (์ค„)์„ _ ๋‹จ์ผ ๋ฌธ์ž์—ด _๋กœ ๋Œ€์ƒ ์…ธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. PowerShell์˜ ๋ฌธ์ž์—ด ๋ณด๊ฐ„์€ ์ „๋‹ฌ ๋œ ๋ฌธ์ž์—ด์— PowerShell ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (์‚ฌ์šฉ ์‚ฌ๋ก€ 2a).
  • 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_์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ _ ๋‹จ์ผ ์™ธ๋ถ€ ์‹คํ–‰ ํŒŒ์ผ _์„ ํ˜ธ์ถœํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ ๋ชจ๋“  ์…ธ์˜ ํ•ต์‹ฌ ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ฉฐ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

    • _its_ ํŒŒ์‹ฑ _as-is_์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋Œ€์ƒ ์‹คํ–‰ ํŒŒ์ผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜์žˆ๋Š” PowerShell์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค .
  • _PowerShell's_ ๊ตฌ๋ฌธ ๋ฐ _its_ ์ธ์ˆ˜ ๋ชจ๋“œ ๋ฉ”ํƒ€ ๋ฌธ์ž๋ฅผ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • ` ๋Š” ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž์™€ ์ค„ ์—ฐ์†์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    • PowerShell์—๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ธ์šฉ / ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ๋ฉ”ํƒ€ ๋ฌธ์ž๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค ( @ ๋Š” ์ธ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๋กœ๋งŒ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.) :

      • POSIX ์œ ์‚ฌ ์…ธ (์˜ˆ : Bash) : @ { } ` (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 ์‹คํ–‰ ๊ฐ€๋Šฅ ํ˜ธ์ถœ] :

_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"'
    • _expandable_ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ช…๋ น ๋ฌธ์ž์—ด์— PowerShell ๊ฐ’์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • $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์ด ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋ช…๋ น์—๋Š” ๋งŽ์€ ๋ฏธ๋ฌ˜ํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒ๋‹นํžˆ ๊ด‘๋ฒ”์œ„ํ•œ ์ฃผ์„ ๊ธฐ๋ฐ˜ ๋„์›€๋ง์ด ์ถฉ๋ถ„ํžˆ ๋‹ค๋ฃจ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ชจ๋“  189 ๋Œ“๊ธ€

๋‚˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜๊ณ  ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‹จ์ผ ๋ฌธ์ž์—ด ํ™•์žฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (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 , ์‹คํ–‰ํ•˜๋ ค๋Š” ๋ช…๋ น์œผ๋กœ ์‹œ์ž‘ํ•ด์•ผํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋ช…๋ น์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?
image

์ด๊ฒƒ์€ ์˜ˆ์ƒ๋Œ€๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
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 ๊ฐ€์ง€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

  1. ์ „์ฒด ํ™•์žฅ-ํ˜„์žฌ PowerShell ๋™์ž‘.
  2. ์ „์ฒด ๋ฆฌํ„ฐ๋Ÿด-OP์—์„œ ์ œ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  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 ์ „๋‹ฌ์„ ์‚ฌ์šฉํ•œ ๋™๊ธฐ ํ˜ธ์ถœ์˜ ๊ฒฝ์šฐ ๋„ค ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ธ์ˆ˜ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • Windows์—์„œ CommandLineToArgvW ์„ ๋ฐ›๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ๋  ํ˜„์žฌ ๋™์ž‘
  • ํ‘œํ˜„์‹ ๊ฐ’์œผ๋กœ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋ฒ ์–ด ์›Œ๋“œ ํ† ํฐ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ > ๋ฐ | ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์ด ๋ณ„๋„์˜ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๋„๋กํ•˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ‘œํ˜„์‹์—์„œ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฐ’์€ Write-Host $val ํ‘œ์‹œ๋˜๋Š” ๊ฐ’์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์Šค์ผ€์ดํ”„ ํ† ํฐ์ด ๋ณด์ผ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ํ† ํฐ์ด ๋ฒ ์–ด ์›Œ๋“œ ๋ฌธ์ž์—ด๋กœ ํ•ด์„๋˜๋Š” ์ถ• ์–ด์  ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ --% ์ด ์˜ค๋Š˜ํ•ด์•ผํ•˜๋Š” ์ผ์ด์ง€๋งŒ ์ด์ƒ์ ์œผ๋กœ๋Š” --% ... %-- ์™€ ๊ฐ™์ด ๊ฐ™์€ ์ค„์— ์‚ฝ์ž… ํ•  ์ˆ˜์žˆ๋Š” ๋ ํ† ํฐ์ด ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค.
  • ๋Œ€์ฒด sh ์ง€ํ–ฅ ์ด์Šค์ผ€์ดํ”„ ๋…ผ๋ฆฌ๊ฐ€ ์ ์šฉ๋˜์–ด๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ํ˜ธํ™˜์„ฑ์„ ํ—ˆ์šฉํ•˜๋Š” Bash readline ๋™์ž‘

์ฒซ ๋ฒˆ์งธ ๋™์ž‘์€ ๋‘ ๋ฒˆ์งธ ๊ธฐ๋Šฅ์„ ์‹คํ—˜์  ๊ธฐ๋Šฅ์œผ๋กœ ๋„์ž… ํ•œ ๋‹ค์Œ ๊ต์ฒดํ•˜์—ฌ ์ฒœ์ฒœํžˆ ๋‹จ๊ณ„์ ์œผ๋กœ ์ œ๊ฑฐํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐ ์„ธ ๋ฒˆ์งธ ๋™์ž‘์€ &! ๋ฐ &# ๋˜๋Š” +% ... -% ์˜ ๊ณ ์œ  ํ•œ์‹œ๊ธธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ•์–ด ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ ๋” ๋งŽ์€ ํ† ํฐ์ด ์ถ• ์–ด์ ์œผ๋กœ ์ทจํ•ด ์ง€๋„๋ก ์ด์Šค์ผ€์ดํ”„ ํ† ํฐ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 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.)์„ ์˜๋ฏธํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
PS /home/User> /bin/echo 'cd / && ls . | cowsay'
cd / && ls . | cowsay
PS /home/User>
(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 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:\>
๋”ฐ๋ผ์„œ์ด ๋ช…์‹œ ์  ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋ˆ„๋ฝ ๋œ ์œ ์ผํ•œ ๊ฒƒ์€ ๋‹ค๋ฅธ ์ผ๋ฐ˜ exe์—์„œ์™€ ๊ฐ™์ด ๊ตฌ๋ฌธ ๋ถ„์„ ๋œ ๋ช…๋ น ์ค„ ์ธ์ˆ˜๋กœ ๊ธฐ๋ณธ ์…ธ์„ ํ˜ธ์ถœํ•˜๋Š”`wsl.exe`์— ๋Œ€ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ธ IMO์ž…๋‹ˆ๋‹ค.

"์ˆ˜์‹  ๋ช…๋ น / ์Šคํฌ๋ฆฝํŠธ์— 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

    • ๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ _ ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ์ผ๋ถ€๋กœ _ ๋˜๋Š” _pipeline-chaining operator_ ( && ๋ฐ || )์™€ ๊ฐ™์€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๊ณ  ๋™์ผํ•œ ์ค„์— ์ถ”๊ฐ€ ๋ช…๋ น์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ์ƒ์ถฉ๋ฉ๋‹ˆ๋‹ค. ; -๊ทธ๋ฆฌ๊ณ  ๋ช…๋ น ์ค„์—์„œ _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
    • ๋˜๋Š” : _array [๋ณ€์ˆ˜] _๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ˆ˜ ์ „๋‹ฌ _verbatim_ : $wslArgs = 'ls', '|', 'less'; wsl $wslArgs
    • ๋ฌผ๋ก , # 1995๋Š” ์•ˆํƒ€๊น๊ฒŒ๋„์ด ์ ‘๊ทผ๋ฒ•์ด _embedded_ " _ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ํ˜ธ์ถœ ํ•  ๋•Œ _-_์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค _ : ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • (b)์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์‹ค์ œ๋กœ _ ๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์…ธ์„ ํ˜ธ์ถœํ•˜์—ฌ _ ๋ช…๋ น ์ค„์„ _ ๋‹จ์ผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌ _ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • @TSlivede๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ ๋ช…๋ น ์ค„์„ _ ๋‹จ์ผ ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•˜๊ณ  _ _platform-native shell_์„ ํ˜ธ์ถœํ•˜๋Š” Invoke-Shell cmdlet์ด ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ถ•์–ด ๋ฌธ์ž์—ด ( '...' ๋Œ€ํ•œ ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค @'<newline>...<newline>'@
    • ๋‚ด ์ถ”์ฒœ์€ ๊ทธ๊ฒƒ์„ Invoke-NativeShell ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , Unix์™€ ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ bash ์•„๋‹ˆ๋ผ /bin/sh ๋ฅผ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

      • ๋˜ํ•œ ins ๋ฅผ ๊ฐ„๊ฒฐํ•œ ๋ณ„์นญ์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

    • ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ --% ๋ฐ ์ œ์•ˆ์„ ํ†ตํ•ด ๋ชจ๋“  ๊ฐœ๋…์  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

      • ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์— ์ „๋‹ฌ ๋œ ๋ช…๋ น์ด ๋๋‚˜๋Š” ์œ„์น˜ (_ ๋‹จ์ผ ๋ฌธ์ž์—ด _์ด๊ธฐ ๋•Œ๋ฌธ์—)๋ฅผ ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๊ณ  ์ผ๋ฐ˜ PowerShell ํŒŒ์ดํ”„ ๋ผ์ธ์—์„œ Invoke-NativeShell / ins ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ PowerShell ๋ฆฌ๋””๋ ‰์…˜.

      • ์„ ํƒ์ ์œผ๋กœ _expandable_ ๋ฌธ์ž์—ด ( "...." ๋˜๋Š” 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) ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ์ธ์ˆ˜ ์ฒ˜๋ฆฌ.

    • ๊ทธ๋Ÿฌ๋ฉด ์ƒˆ ์ฝ”๋“œ๋Š” ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ํ˜ธ์ถœ ํ•  ๋•Œ & ๋Œ€์‹  &! (๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ์ •ํ•œ ํ˜•์‹)์„ ํ•ญ์ƒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด & ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ). .
    • _PowerShell_ ๋ช…๋ น์„ ํ˜ธ์ถœ ํ•  ๋•Œ &! ๋Š” & ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋ฌธ์ œ๊ฐ€ ์—†์—ˆ ์Œ). ๋”ฐ๋ผ์„œ &! ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์…ธ์—์„œ ๋ช…๋ น ์ค„ ์žฌ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ๊ธฐ๋ณธ ์…ธ (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 ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

        • POSIX์™€ ์œ ์‚ฌํ•œ ์…ธ์€ -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 ์„ (๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ _ ํ”Œ๋žซํผ ๊ณ ์œ  ์…ธ์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ ๋ช…๋ น ์ค„์„์žˆ๋Š” ๊ทธ๋Œ€๋กœ _ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์˜ค๋Š˜๋‚  ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ง์ ‘ ํ˜ธ์ถœ
  2. & ์šด์˜์ž
  3. ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค

์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ „ํ˜€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊นจ์ง„ ๋™์ž‘์„ ์ˆ˜์ • ํ•œ ํ›„ ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

  1. ์ง์ ‘ ํ˜ธ์ถœ
  2. & ์šด์˜์ž
  3. ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค
  4. &! ์šด์˜์ž
  5. ์‹œ์ž‘ -ProcessV2

์‰˜์ด ping 127.0.0.1 ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ, @iSazonov๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ €์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”๋Š” ํผ์ฆ์˜ ์ผ๋ถ€์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์€ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ ํ•˜๋”๋ผ๋„ _5 ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• _์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๋งŒ์œผ๋กœ๋„ ๊ฐ๊ฐ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ํ˜ผ๋ž€์„ ์•ผ๊ธฐ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ UX์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋” ๋งŽ์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ธฐ์กด ์‚ฌ๋ก€๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ UX์— ๋Œ€ํ•ด ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋” ๋งŽ์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ธฐ์กด ์‚ฌ๋ก€๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์–ด์•ผํ•˜๋ฏ€๋กœ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋น™๋น™ ๋Œ๊ณ  ์žˆ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. https://github.com/PowerShell/PowerShell/issues/1995 ๋Š” ๋ฐ”๋กœ ๊ทธ ์ด์œ  ๋•Œ๋ฌธ์— ํ์‡„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@iSazonov :

์ƒˆ๋กœ์šด ์šด์˜์ž๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ธฐ์กด์˜ ์ง€์นจ ๋ถ€์กฑ์„ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ์š”์•ฝํ•˜๋ฉด :

  • _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.

1995 ๋…„์€ _PowerShell_์˜ ๊ตฌ๋ฌธ (๋‹ค๋ฅธ ์…ธ์ด ์•„๋‹˜)์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์— ์ธ์ˆ˜๋ฅผ _ ์‹ ์‹คํ•˜๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ชจ๋“  ์ž์„ธํ•œ ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚˜ ์ž์‹ ์œผ๋กœ ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

  • ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๊นจ๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ vNext / 8.0์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ํ†ต ์Šค๋Ÿฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, PowerShell์ด โ€‹โ€‹์‹ค์ˆ˜๋กœ ์ €์ง€๋ฅธ ๋ชจ๋“  ์‹ค์ˆ˜๋ฅผ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜์žˆ๋Š” ์„ธ์ƒ์— ์‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋‹ค์ˆ˜์˜ PS ์‚ฌ์šฉ์ž๋Š” SO ์—ฃ์ง€ ์ผ€์ด์Šค์—์„œ ๋ฌด๋ฆŽ ๊นŠ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ 4-10 ๋…„ ๋™์•ˆ ๋™์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ณต์‚ฌ / ๋ถ™์—ฌ ๋„ฃ๊ธฐ ํ•ด ์™”์œผ๋ฉฐ, ์ž‘๋™ ์ด์œ ๋ฅผ ๋ฐ˜๋“œ์‹œ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ์—…๊ทธ๋ ˆ์ด๋“œ์‹œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ค‘๋‹จ ๋  ๋•Œ "์‹ค์ˆ˜๋ฅผ ์ˆ˜์ •"ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ "PS๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ๋‚˜๋ฅผ ๋ง๊ฐ€ ๋œจ๋ฆฌ๊ณ  ๋‚˜๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฏฟ์„ ์ˆ˜ ์—†๋‹ค"๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฒฐ๊ตญ ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋ฐ์ดํŠธ์™€ ์ฑ„ํƒ์„ ๋Šฆ์ถ” ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋Š”์ด ๋ฌธ์ œ์˜ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด์ด ๋ฌธ์ œ์— ๋งŽ์€ ๋‹ค๋ฅธ ํฌ๋ง๊ณผ ์š•๊ตฌ๋ฅผ ํˆฌ์‚ฌํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋‹ค๋ฅธ ์ˆ˜์ •๊ณผ ํ•จ๊ป˜ ๊ทธ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” # 1995๋ฅผ ๋‹ซ์Œ์œผ๋กœ์จ ๊ทธ๊ฒƒ์„ ์•…ํ™” ์‹œ์ผฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ์ ์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์œผ๋กœ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ์•„์ง ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋” ์ž์„ธํžˆ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค). ์ดˆ๋ณด ์‚ฌ์šฉ์ž์™€ ์ˆ™๋ จ ๋œ ์‚ฌ์šฉ์ž ๋ชจ๋‘๋ฅผ ๋‹นํ™ฉ์Šค๋Ÿฌ์›Œํ•˜์ง€ ์•Š๊ณ  ์‹ ์†ํ•˜๊ฒŒ ๋ฒ—์–ด๋‚  ์ˆ˜์žˆ๋Š” "ํŠธ๋žฉ ๋„์–ด"์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ์ง„์ •ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์†”๋ฃจ์…˜์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์šฐ์Šค์˜ PS ํŒŒ์‹ฑ ์ธก๋ฉด์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์žฅ๊ธฐ์ ์ธ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‚ด๊ฐ€ ์ฝ์€ ์ฝ”๋ฉ˜ํŠธ :

  • #! ( &! ๋˜๋Š” $! ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ํ†ต์—ญ์‚ฌ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ)์— ๋งž์ถ”๋ ค๋Š” ์ œ์•ˆ ๋œ ์š•๊ตฌ์— ๋Œ€ํ•ด์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. . $! net <stuff> ์™€ ๊ฐ™์€ ์ž‘์—…์„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด net.exe ๋Š” ๋‚ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Windows๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ "๋„ค์ดํ‹ฐ๋ธŒ"์ž‘์—…์€ ์—ฌ์ „ํžˆ โ€‹โ€‹sh / bash / whatever ์ด์ „์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง„ ์กด์žฌ์˜ ์‹คํ–‰์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ ๋‚ด๊ฐ€ ํŒŒ์ด์ฌ์€ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” *.py ๋ฌธ์ž์—ด์— $! /usr/bin/python *.py ๋˜๋Š” $! python *.py ๋‚ด๊ฐ€ ๋ฐฐ์‰ฌ๋Š” ์†์— ๋‹ค์Œ ๊ธ€ ๋กœ๋น™ํ•˜๊ณ  ์‹ถ์ง€. python ์™€ ์ผ์น˜ํ•˜๋Š” ๋ชฉ๋ก.
  • @oising์ด ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ €๋Š” ์—ฐ์‚ฐ์ž๋กœ --% ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ์ด ๋ฌธ์ œ์ด๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ 10 ๋…„ ๋™์•ˆ์ด ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ์„ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ( ์ง€๊ธˆ์€ Google์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค! , ๊ทธ๋ƒฅ ๊ทธ๋ ‡๊ฒŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (์ €๋Š” @ SteveL-MSFT๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.) ๋Œ€์ฒด ๊ณ ๋ ค ์‚ฌํ•ญ์œผ๋กœ ๊ทธ์˜ ์ œ์•ˆ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.)ํ•˜์ง€๋งŒ ์งˆ๋ฌธ : ์—ฌ๊ธฐ์— & ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž๋„ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? --% native.exe do /some $stuff ์ค„์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
  • @rjmholt : ์—ฌ๊ธฐ ์—์„œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ ์‹คํ–‰ ํŒŒ์ผ ๋‹ค์Œ ์— ์˜ค๋Š” ๊ธฐ์กด --% ๋™์ž‘์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ง์•„์•ผํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ "์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ"๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋™์ž‘ "์ด ์‹คํ–‰ ํŒŒ์ผ ์•ž์— ์˜ค๋Š” ์œ„์น˜์™€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • @jazzdelightsme ์—์„œ

    ๋˜ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์กฐ์ž‘ ํ•  ํ•„์š”์—†์ด StackOverflow์—์„œ ๋ช…๋ น์„ ๋ณต์‚ฌ / ๋ถ™์—ฌ ๋„ฃ๊ธฐ ๋งŒํ•˜๋Š” ๊ฐ€์žฅ ์ „๋ฌธ์ ์ธ ์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ œ ์ƒ๊ฐ์— ์ด๊ฒƒ์€ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฑฐ๋Œ€ํ•œ ์ธก๋ฉด์ด๋ฉฐ ์•„๋งˆ๋„ ๊ฐ€์žฅ ํฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด Bash์™€ ๊ฐ™์€ ์‰˜์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ ์›น ์ฃผ๋ณ€์˜ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

  • # 1995์™€ ๊ฐ™์€ ๊ฒƒ์ด ๊ณ ์ณ ์กŒ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด a) ๊ทธ๋Ÿฐ ์ด์ƒํ•œ ๊ฐ€์žฅ์ž๋ฆฌ ์ผ€์ด์Šค์˜ ๊ธด ๊ผฌ๋ฆฌ๊ฐ€ ์žˆ๊ณ  b) ์‚ฌ๋žŒ๋“ค์„ ํ•ด์น˜์ง€ ์•Š๊ณ ๋Š” ๊ณ ์น˜๊ธฐ๊ฐ€ ์ •๋ง ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ด ์š”์ ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ง€๋‚œ ๋ช‡ ๋…„ ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ž ์ˆ˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ํ„ธ์ด ๋งŽ์€ ์ƒํ™ฉ์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ์œ„ํ•ด ์ด์™€ ๊ฐ™์€ "ํŠธ๋žฉ ๋„์–ด"๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ํƒˆ์ถœ ์šฐ๋ฆฌ์˜ ํ† ๋ผ ๊ตฌ๋ฉ (๋‹จ์ง€ # 1995๊ณผ ๊ฐ™์€ ๋ฒ„๊ทธ๊ฐ€์žˆ๋‹ค ๋ฐœ๊ฒฌ ํ•  ๊ฒƒ์„ ๊ทธ๋“ค์ด ์•Œ๊ณ ์žˆ๋Š” ๊ฒƒ์„ ์•Œ๊ณ ๋„ ์ผ๋‹จ ์ž‘๋™ ๋ฐฉ์ง€๋ฅผ).

๋Œ“๊ธ€์„ ๊ฒ€ํ†  ํ•  ๋•Œ ์•„์ง ๋‹ต๋ณ€ํ•ด์•ผ ํ•  ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. PowerShell์—์„œ ๋ช…๋ น ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์™€ ๊ทธ ์ดํ›„์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ๊ณ„์† ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ช…๋ น ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋„ ๊ทธ๋Œ€๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๊นŒ?
    ํ˜„์žฌ๋Š” ํ•  ์ˆ˜์—†๋Š” ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์— ์ „๋‹ฌํ•ด์•ผํ•˜๋ฉฐ @oising ์˜ ์„ ํ–‰ ๊ด„ํ˜ธ ์†”๋ฃจ์…˜์ด ํŒŒ์ดํ”„, ํŒŒ์ดํ”„ ๋ผ์ธ ์ฒด์ธ ๋“ฑ์„ ๊ณ„์† ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์†”๋ฃจ์…˜ ์ด ๋ 
  2. ์šด์˜์ž๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
    ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ์ €๋Š” --% ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋ฏธ "์˜ˆ์ „์ฒ˜๋Ÿผํ•˜๋˜ ์ผ์„ํ•˜์„ธ์š”"์—ฐ์‚ฐ์ž๋กœ ๋ช…์„ฑ์„ ์–ป์—ˆ ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋ฐœ๊ฒฌ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์žฌ์„ค์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” @ 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์—์„œ ์ดˆ์ ์„ ๋งž์ถ˜ ์ œ์•ˆ์„ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ๊ฑฐ๊ธฐ์„œ ๋Œ€ํ™”๋ฅผ ๊ณ„์†ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

ํƒˆ์ถœ์˜ ํ•„์š”์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ ์ด๊ฒƒ์„ ๋ช‡ ๋ฒˆ ๋ดค์Šต๋‹ˆ๋‹ค.

์ƒˆ ๋ชจ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ† ํฌ ๋‚˜์ด์ €์— ๋Œ€ํ•œ ๋ชจ๋“  ์ธ๋””์ผ€์ดํ„ฐ์—๋Š” ์ด์Šค์ผ€์ดํ”„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ชจ๋“œ๋ฅผ ๋– ๋‚˜๋Š” ํ† ํฌ ๋‚˜์ด์ €์— ๋Œ€ํ•œ ์ธ๋””์ผ€์ดํ„ฐ๋ฅผ ํ•ด๋‹น ๋ฌธ์ž์˜ ๋ฌธ์ž ํ˜•์‹๊ณผ ๊ตฌ๋ณ„ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ๊ฐ€์žฅ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ˜•ํƒœ๋Š” ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

  • ' : ์ž‘์€ ๋”ฐ์˜ดํ‘œ ํ† ํฐ ํ™” ์‹œ์ž‘
  • ' : ์ž‘์€ ๋”ฐ์˜ดํ‘œ ํ† ํฐ ํ™” ์ข…๋ฃŒ
  • '' : ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ๋ฌธ์ž์—ด ๋‚ด์— ๋ฆฌํ„ฐ๋Ÿด ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํƒˆ์ถœ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • --% ์—ฐ์‚ฐ์ž๋Š” ๋ชจ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๊ณ  ( | , && , || , ; , ์ค„ ๋ฐ”๊ฟˆ) ๋ฌธ์ž์—ด์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์— ( ' ๋ฌธ์ž ์ œ๊ฑฐ)
  • Herestrings ๋ฐ co๋Š” ๋ฐฐ์—ด์ด ์•„๋‹Œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด ์ธ์ˆ˜๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ˜ธ์ถœ์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฐฐ์—ด ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ์–ด๋ ˆ์ด๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ• (์™„์ „ํžˆ ๋ชจ๋“œ ์‹œ์ž‘)
  • ๋ฐฐ์—ด์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• (๋‹จ์ผ ์ธ์ˆ˜๋ฅผ ์ƒˆ ์‹คํ–‰ ํŒŒ์ผ์— ์ „๋‹ฌ)
  • ์–ด๋ ˆ์ด ์ข…๋ฃŒ ๋ฐฉ๋ฒ• (์™„์ „ ๋ชจ๋“œ ์ข…๋ฃŒ)

(์ด๊ฒƒ์€ * nix์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. exec ๋Š” ๋ฐฐ์—ด์„ ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Windows์—์„œ๋Š” ๋ฐฐ์—ด์„ ๊ฐ€์ ธ ์™€์„œ ํŠน์ • ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  CommandLineToArgvW ํ†ตํ•ด ์ „๋‹ฌํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋‘ ๊ฐœ์˜ ์ด์Šค์ผ€์ดํ”„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฐ์—ด ๊ตฌ๋ถ„์ž ๋ฆฌํ„ฐ๋Ÿด
  • ๋ฐฐ์—ด ๋ ๋ฆฌํ„ฐ๋Ÿด

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • --% ๋ช…๋ น์ด ์ƒˆ ์ถ•์–ด ๊ตฌ๋ฌธ์ด๋˜๊ธฐ ์ „
  • ๊ตฌ๋ฌธ์„ ์–ด๋–ป๊ฒŒ ๋๋‚ผ๊นŒ์š”? ๊ฐœํ–‰ ๋ฐ ; ์•„๋งˆ๋„?
  • ๋…ผ์Ÿ์„ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ๋„?

์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ; ๋˜๋Š” ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๊นŒ?
  • ๋ฆฌํ„ฐ๋Ÿด์„ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๊นŒ?

๊ธฐ๋ณธ ๋ช…๋ น ์ค„์€ ๋ฐฐ์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋˜๋Š” AST์ž…๋‹ˆ๋‹ค. PowerShell์€ ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์˜ AST์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด ๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ช…๋ น ์ค„์€ ๋ฐฐ์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋˜๋Š” AST์ž…๋‹ˆ๋‹ค.

์ด ์ฃผ์žฅ์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ PowerShell์ด โ€‹โ€‹๋ช…๋ น์— ๋Œ€ํ•œ AST๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค (๋ช…๋ น์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ช…๋ น์ธ์ง€ ํ™•์ธํ•  ๋•Œ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ข…๋ฅ˜์˜).

https://github.com/PowerShell/PowerShell/blob/f82f74d89811e91613a7450e536d652c5d8f784e/src/System.Management.Automation/engine/parser/Parser.cs#L6391 -L6634

๋ช…๋ น ์š”์†Œ (๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ์ธ์ˆ˜ ํฌํ•จ)๊ฐ€ ๋ฐฐ์—ด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด 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

์ด ๋ฐฐ์—ด์€ ์—ฌ๊ธฐ์—์„œ ํ‘œํ˜„์‹์œผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell/blob/f82f74d89811e91613a7450e536d652c5d8f784e/src/System.Management.Automation/engine/parser/Compiler.cs#L4127 -L4160

๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฌ๊ธฐ์—์„œ ํŒŒ์ดํ”„ ๋ผ์ธ ํ˜ธ์ถœ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค ( Expression.NewArrayInit(typeof(CommandParameterInternal[]), pipelineExprs) ๋Š” ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ์œ„์น˜์ž…๋‹ˆ๋‹ค).

https://github.com/PowerShell/PowerShell/blob/f82f74d89811e91613a7450e536d652c5d8f784e/src/System.Management.Automation/engine/parser/Compiler.cs#L3798 -L3805

๋Ÿฐํƒ€์ž„์— ์ปดํŒŒ์ผ ๋œ ํ‘œํ˜„์‹์ด ์‹คํ–‰๋˜๋ฉด ์ด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ๋˜๋ฉฐ, ์‚ฌ์šฉํ•  ๋ช…๋ น ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋‹ค์Œ ํ˜ธ์ถœ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell/blob/f82f74d89811e91613a7450e536d652c5d8f784e/src/System.Management.Automation/engine/runtime/Operations/MiscOps.cs#L29 -L312

๊ฒฐ๊ตญ ํŒŒ์ดํ”„ ๋ผ์ธ์ด ํ˜ธ์ถœ๋˜๋ฉด ํ•ด๋‹น ์ธ์ˆ˜ ๋ฐฐ์—ด์€ NativeCommandParameterBinder ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋ช…๋ น์— ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell/blob/f82f74d89811e91613a7450e536d652c5d8f784e/src/System.Management.Automation/engine/NativeCommandParameterBinder.cs#L69 -L137

๊ฐ ์ธ์ˆ˜์— ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฌธ์ž์—ด์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€์™€ ๊ฐ™์€ AST ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ์ธ์ˆ˜ ๋ฐฐ์—ด์„ ๊ฐ€์ ธ ์™€์„œ NativeCommandProcessor ์—์„œ ์ธ์ˆ˜ ํ˜ธ์ถœ์„์œ„ํ•œ ์ƒˆ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell/blob/f82f74d89811e91613a7450e536d652c5d8f784e/src/System.Management.Automation/engine/NativeCommandProcessor.cs#L1094 -L1166

์ด๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ํ˜ธ์ถœ์— ์‚ฌ์šฉํ•˜๋Š” .NET API๊ฐ€ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๊ณ  .NET์ด ํ˜ธ์ถœ์„ ๋‹ค์‹œ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” .NET Core์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์•„๋‹ˆ๋ผ ์ด์ „ "๋‹จ์ผ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ์ธ์ˆ˜"๋ฒ„์ „์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ํ•„์š”์— ๋”ฐ๋ผ.

ํ•˜์ง€๋งŒ์ด API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด * nix์—์„œ ์ง์ ‘ fork / exec ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell/blob/f82f74d89811e91613a7450e536d652c5d8f784e/src/powershell/Program.cs#L268 -L330

์—ฌ๊ธฐ์„œ 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()

      • @ yecril71pl , ์ด๊ฒƒ์€ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ๋˜๋Š” ๋ฐฐ์น˜ ํŒŒ์ผ ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 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 ์ „์šฉ _ ๊ธฐ๋Šฅ์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ์•„๋‹ˆ์ง€๋งŒ _ ํšจ๊ณผ์ ์œผ๋กœ _). ์ฆ‰, ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    • # 1995๊ฐ€ ์ˆ˜์ •๋˜๋ฉด --% ์˜ ์œ ์ผํ•œ ๋ชฉ์ ์€ 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 )์™€ ํ•จ๊ป˜ ์ฝ”๋“œ ์ธ์ˆ˜๋ฅผ ๋”ฐ๋ผ ๋ช…์‹œ ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    • (์ œ์™ธ๋กœ : shebang ์ค„ #!/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 )์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์˜ GNU ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„์€ @TSlivede ๊ฐ€ ๋ณด์—ฌ์ค€ ๊ฒƒ์ฒ˜๋Ÿผ /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_์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ์— ๋Œ€ํ•œ ์ „์ œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ์„ _PowerShell_ ํŒŒ์ดํ”„ ๋ผ์ธ์— ํ†ตํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • _PowerShell ๋ณ€์ˆ˜ ๋ฐ expression_์„ ๊ธฐ๋ณธ ์‰˜ ๋ช…๋ น ์ค„์— ํ†ตํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ผ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ํ˜ธ์ถœ์ด ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์— ๋Œ€ํ•œ _ ์ง์ ‘ ๊ฐœ๋…์  ํ‘œํ˜„ _์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ _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)์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋ถ€์กฑํ–ˆ์Šต๋‹ˆ๋‹ค.

    • (a) ์‚ฌ์šฉ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ _PowerShell_ ๋ณ€์ˆ˜์™€ ํ‘œํ˜„์‹์„ ๋ช…๋ น์— ํ†ตํ•ฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ด์ƒ‰ํ•˜๊ฒŒ ๋จผ์ € _aux๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ --% ์ดํ›„ %...% ๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•˜๋Š” environment_ variable_; ์˜ˆ
      $env:FOO='foo'; echoArgs.exe --% %FOO%!

(a)์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์—ฌ๊ธฐ์— ์„ค๋ช… ๋œ๋Œ€๋กœ Invoke-NativeShell / ins ์ž…๋‹ˆ๋‹ค.

(b)์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • _first_ ์ธ์ˆ˜๋งŒํผ ํŠน๋ณ„ํ•˜๊ฒŒ --% ์ง€์›
  • ๊ทธ๋ฆฌ๊ณ  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๋Š” ์ด๊ฒƒ์„ ๊ฒ€ํ† ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ ์‹ค์ œ ์‚ฌ์šฉ ํ”ผ๋“œ๋ฐฑ์„ ์–ป๊ธฐ์œ„ํ•œ ์‹คํ—˜์  ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค . ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์‹ค์ œ ์ธ์žฅ์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. PR ๊ฒ€ํ† ์— /bin/sh ๋Œ€ /bin/env sh ์—ฐ๊ธฐ
  • ์‚ฌ์šฉ์ž๊ฐ€ PowerShell๋กœ ๋ช…๋ น ์ค„์„ ์ž˜๋ผ๋‚ด์–ด ๋ถ™์—ฌ ๋„ฃ๋Š” "stackoverflow"์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ์œ„ํ•œ ์ƒˆ ์—ฐ์‚ฐ์ž๋กœ --% ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. )
  • Invoke-NativeShell cmdlet์€์ด ์ œ์•ˆ๊ณผ ๋ณ„๊ฐœ์ด๋ฉฐ PowerShellGallery์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ here-string์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ here-string์œผ๋กœ ๋ž˜ํ•‘ ํ•  ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์•Œ์ง€ ๋ชปํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋™์ž‘์— ์˜์กด ํ•  ์ˆ˜์žˆ๋Š” --% ์Šค์œ„์น˜๋ฅผ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • --% ์Šค์œ„์น˜์™€ ๊ฐ™์€ ์ŠคํŠธ๋ฆฌ๋ฐ ๋™์ž‘์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ์Šค์œ„์น˜๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ --% (๋˜๋Š” ๋ชจ๋“  ์†”๋ฃจ์…˜)์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ๊ฒ€์ƒ‰ ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž ์˜๋„๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์œ„ํ•ด ๋ถ™์—ฌ ๋„ฃ์€ ์ฝ˜ํ…์ธ ๋ฅผ here-string์œผ๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด PSReadLine์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ ๋ฌธ์ž์—ด๊ณผ ์—ฌ๊ธฐ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ (ํ™•์žฅ) ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ : & --% ๋Œ€ --%

๋‚˜๋Š” ๋˜ํ•œ @ 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"๋˜๋Š”"bash"-ํŽธ์ง‘์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ณธ ๋ช…๋ น ์ค„์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐg++ timer.cpp @conanbuildinfo.args -o timer --std=c++11 ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์‰˜์—์„œ ๋ณต์‚ฌ-๋ถ™์—ฌ ๋„ฃ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ

์ด์— ๋Œ€ํ•œ Get-/Set-Clipboard ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Ast ๋ฒ”์œ„ (์ฆ‰ ์ž…๋ ฅ ๋ฌธ์ž์—ด)๋ฅผ ๋‹ค์‹œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ๊ธฐ๋ณธ ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„ / ๊ฒฝ๋กœ ๋ฐ ๋‚˜๋จธ์ง€ ๋ฌธ์ž์—ด์„ OS ๊ทœ์น™์— ๋”ฐ๋ผ ์ธ์ˆ˜ ๋˜๋Š” ์ธ์ˆ˜๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒฝ์šฐ.

๋‚ด ์ƒ๊ฐ์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • AST ๋ช…๋ น์„ ๋น„ํšจ์œจ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๋‚˜์ค‘์— ๋ฒ”์œ„๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋‹ค์‹œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ์›๋ž˜ AST๋ฅผ ๋ฒ„๋ฆฌ์‹ญ์‹œ์˜ค. ๋˜๋Š”
  • AST๋ฅผ ๊ฐ€์ ธ์™€ (ํ˜„์žฌ NativeCommandProcessor๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹) ๋ฌธ์ž์—ด๋กœ ๋‹ค์‹œ ์žฌํŽธ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋Œ€์‹  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฌธ์ž์—ด์„ ๋ณด์กดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ 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; }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปดํŒŒ์ผ๋˜์–ด ํŒŒ์ดํ”„๋กœ ์ „์†ก ๋œ ํ›„ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ๋ช…๋ น ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ๊ธฐ๋ณธ ์…ธ์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ์ง์ ‘ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋งˆ์Œ ์†์— ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ์…ธ์„ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์ •๋‹นํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€๋กœ ๋ช…์‹œ ์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ (๊ตฌ๋ฌธ์„ ๋ณต์žกํ•˜๊ฒŒ ํ•จ), ์•„๋‹ˆ๋ฉด ๊ธฐ๋ณธ ์„ค์ • ๋ณ€์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ (๊ฒ€์ƒ‰ ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ๋” ์–ด๋ ค์›Œ ์ง)?
  • ๊ทธ๋Ÿฌํ•œ ๊ตฌํ˜„์ด ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒํ•˜์ง€ ์•Š์„๊นŒ์š”? ์‚ฌ์šฉ์ž๋Š” ์—ฌ๊ธฐ์—์„œ PowerShell์ด โ€‹โ€‹์–ผ๋งˆ๋‚˜ ์ ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๋˜๋Š” | ๋˜๋Š” & ๋˜๋Š” ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์—ฌ๊ธฐ์—์„œ ํ•œ ์ค„ ์ถ•์–ด ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ ํ•  ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋ช‡ ๊ฐœ์ž…๋‹ˆ๊นŒ? ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค์ค‘ ๋ผ์ธ ํ˜ธ์ถœ์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„ ๋‚ด๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ• ๊นŒ์š”? ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ ํ• ๋งŒํผ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ”ผํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
  • ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ถ•์–ด ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์™œ์ด๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธ์ถœ ๊ฐœ๋…์— ์ง์ ‘ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๊นŒ? ์ƒˆ๋กœ์šด ํ˜ธ์ถœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์™œ์ด๋ฅผ ๋‹ค๋ฅธ ์‰˜์˜ ๊ฐœ๋…์— ์ง์ ‘ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๊นŒ? ์ข‹์€ ๊ตฌ๋ฌธ๊ณผ ์ข‹์€ ์–ธ์–ด ๊ตฌ์กฐ๋Š” ๊ตฌ๋ฌธ ์  ๋ฐ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ์–ธ์–ด ์ž์ฒด์— ๋„ˆ๋ฌด ๋งŽ์ด ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ ค ๊ณ ํ•ฉ๋‹ˆ๋‹ค (์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์กฐํ•ฉ ํ•  ์ˆ˜์žˆ๋Š” ์š”์†Œ์˜ ํ”Œ๋žซํผ์„ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹ ) โ€” ์ œ์•ˆ ๋œ ๊ธฐ๋ณธ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์ด ๊ธฐ์ค€์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๊นŒ? ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์„ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด? ์ด ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ถ„๋ฆฌ ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜์žˆ๋Š” ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋‹ค๋ฅธ ์‰˜์ด๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ๋ฌธ ์ˆ˜์ค€์—์„œ ๋˜๋Š” ๋‹ค๋ฅธ ์ˆ˜์ค€์—์„œ? ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ?

์—ฌ๊ธฐ ๋‚ด ์ƒ๊ฐ์€ ๋‹น์‹ ๋„์ด ์ผ์„

@rjmholt CommandAst์—๋Š” ์ž…๋ ฅ ๋ฌธ์ž์—ด์ด์žˆ๋Š” Extent ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ๋ถ„์„์€ Windows์—์„œ ์ฒซ ๋ฒˆ์งธ ๊ณต๋ฐฑ์œผ๋กœ ๋ถ„ํ• ํ•˜๊ฑฐ๋‚˜ Unix์—์„œ ๊ณต๋ฐฑ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ˜„์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์žƒ์ง€ ์•Š๊ณ  ์ข‹์€ ์„ฑ๋Šฅ์„ ์–ป์„ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๊ตฌํ˜„๋˜๋ฉด ํ…Œ์ŠคํŠธ ํ•  ์ผ๋ จ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์„ "์ œ์•ˆ"ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ ์‚ฌ๋ก€ 1 : ์ธ์šฉ / ์ด์Šค์ผ€์ดํ”„ ๊ทœ์น™์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•ด๋„ ๋‹จ์ผ exe ๋ฆฌํ„ฐ๋Ÿด (๋ณด๊ฐ„ ์—†์Œ) ํ˜ธ์ถœ์ด ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ : 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
  • ์‚ฌ์šฉ ์‚ฌ๋ก€ 1a : PS ๋ณด๊ฐ„์„ ์‚ฌ์šฉํ•œ ๋‹จ์ผ exe ํ˜ธ์ถœ์ด ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ : 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 + ...)์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ $ ๋ฅผ ์ด์Šค์ผ€์ดํ”„ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ ์‚ฌ๋ก€ 2 : 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 ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ฐธ์กฐ ํ•  ์ˆ˜์žˆ๋Š” _ ๋ณด์กฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ _๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์…ธ์— ์ ์ ˆํ•˜๊ฒŒ %...% ๋˜๋Š” $... ). ๊ธฐ๋ณธ ๋ช…๋ น ์ค„.
  • --% ๋ฌธ์„ ๋” ํฐ PowerShell ํŒŒ์ดํ”„ ๋ผ์ธ์— ํ†ตํ•ฉ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์–ด์ƒ‰ํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ด ํ†ตํ•ฉ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜์žˆ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์„ ํ˜ธ์ถœํ•˜๋Š” ํ•ฉ๋ฒ•์  ์ธ _non_cut-and-paste ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, (์ค‘๊ฐ„) ํŒŒ์ดํ”„ ๋ผ์ธ์„ ํ†ตํ•ด _raw byte data_๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ›„ํ–‰ ์ค„ ๋ฐ”๊ฟˆ์—†์ด _strings์„ ์ „์†กํ•˜๋ ค๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ํŒŒ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์˜ˆ์ œ๋Š” ์ด SO ๋‹ต๋ณ€ ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
  • ๋˜ํ•œ --% _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_ ๋ช…๋ น ์ค„ / ์Šคํฌ๋ฆฝํŠธ ํ…์ŠคํŠธ๋ฅผ ์‰˜ ์‹คํ–‰ ํŒŒ์ผ์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • Unix์—์„œ๋Š” _stdin_์„ ํ†ตํ•ด sh ๋กœ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์‹คํ–‰์„ ์œ„ํ•ด _script file_์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ( sh -c '<code>' is ).
PSonUnix> @'
echo '{ "foo": "bar" }' | cat -n
'@ | sh

     1  { "foo": "bar" }
  • ์•„์•„, Windows์—์„œ 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 ์˜ ๋ฉ‹์ง„ ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  1. ์‚ฌ์šฉ์ž๋Š” ๋ณด๊ฐ„์„ ํ™œ์„ฑํ™” / ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.
    PowerShell์—๋Š” ์ด๋ฏธ ์ž‘์€ ๋”ฐ์˜ดํ‘œ์™€ ํฐ ๋”ฐ์˜ดํ‘œ๊ฐ€์žˆ๋Š” string / here-string์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์–ด๋–ป๊ฒŒ ์ ์šฉ / ์กฐ์ • / ํ–ฅ์ƒํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž๋Š” ์‹คํ–‰ ํŒŒ์ผ์ด๋‚˜ ์…ธ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ์‹คํ–‰ ํŒŒ์ผ-๋ช…๋ น์€ ์•ฑ ์ด๋ฆ„์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์ธ์ˆ˜๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

      • ๋ณด๊ฐ„ ์žˆ์Œ / ์—†์Œ

      • ๋‹จ์ผ ํšŒ์„  / ๋‹ค์ค‘ ํšŒ์„ 

    • ์ธ์ˆ˜๊ฐ€ _script_์ด๊ธฐ ๋•Œ๋ฌธ์— ์‰˜์€ ์•„๋งˆ๋„ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

      • ๋ณต์‚ฌ-๋ถ™์—ฌ ๋„ฃ๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉ์ž๋Š” ๋ณด๊ฐ„์„ ์›ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ผ ๋ฐ ๋‹ค์ค‘ ๋ผ์ธ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

      • ์Šคํฌ๋ฆฝํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉ์ž๋Š” ๋ณด๊ฐ„์„ ํ™œ์„ฑํ™” / ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ๋‹จ์ผ ๋ฐ ๋‹ค์ค‘ ๋ผ์ธ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

    ์ƒ๊ฐ :
    ๋”ฐ๋ผ์„œ ๋ณต์‚ฌ-๋ถ™์—ฌ ๋„ฃ๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค ๋™์ž‘์ด ๊ธฐ๋ณธ๊ฐ’์ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
    ์ค„ ์ข…๊ฒฐ์ž๋Š” ์‹คํ–‰ ํŒŒ์ผ (bash์—์„œ๋Š”, PowerShell์—์„œ๋Š”`)์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.
    (1) ์‰˜์€ ์‹คํ–‰ ํŒŒ์ผ๋กœ ๋ช…์‹œ ์ ์œผ๋กœ ๋ช…์‹œ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    (2) ์•„๋งˆ๋„ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋œ ์‹คํ–‰ ํŒŒ์ผ์€ ์…ธ์„ ํ†ตํ•ด ํ˜ธ์ถœํ•ด์•ผํ•˜๊ฑฐ๋‚˜ ํŠน์ˆ˜ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ข…๊ฒฐ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€๋Š” ์ธ์ˆ˜ ๋ชฉ๋ก ์ž‘์„ฑ).
    (3) PSReadline์—์„œ ๋ณต์‚ฌ-๋ถ™์—ฌ ๋„ฃ๊ธฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํผ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ PowerShell ๋ช…๋ น์œผ๋กœ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์‚ฌ์šฉ์ž๋Š” ํ•œ ์ค„๊ณผ ์—ฌ๋Ÿฌ ์ค„์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

    • ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ด์ „์— ๋…ผ์˜ ๋œ ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ํ•œ ์ค„์— ๋Œ€ํ•œ here-strings๋ฅผ ํ–ฅ์ƒ์‹œ์ผœ์•ผํ•ฉ๋‹ˆ๋‹ค.
    • 2 ์ฐธ์กฐ-(2)-ํ•ญ์ƒ ์—ฌ๋Ÿฌ ์ค„์— ์‰˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํŠน์ˆ˜ ๊ตฌ๋ฌธ ๋ถ„์„์„ ๊ตฌํ˜„ํ•˜์‹ญ์‹œ์˜ค.

@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) _ ํ”Œ๋žซํผ ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ _ (์ด ๋ฌธ์ œ)์„ ์‹คํ–‰ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์…ธ์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ _it_๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋ช…๋ น (์ค„)์„ _ ๋‹จ์ผ ๋ฌธ์ž์—ด _๋กœ ๋Œ€์ƒ ์…ธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. PowerShell์˜ ๋ฌธ์ž์—ด ๋ณด๊ฐ„์€ ์ „๋‹ฌ ๋œ ๋ฌธ์ž์—ด์— PowerShell ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (์‚ฌ์šฉ ์‚ฌ๋ก€ 2a).
  • 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_์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ _ ๋‹จ์ผ ์™ธ๋ถ€ ์‹คํ–‰ ํŒŒ์ผ _์„ ํ˜ธ์ถœํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด๊ฒƒ์€ ๋ชจ๋“  ์…ธ์˜ ํ•ต์‹ฌ ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ฉฐ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

    • _its_ ํŒŒ์‹ฑ _as-is_์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋Œ€์ƒ ์‹คํ–‰ ํŒŒ์ผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜์žˆ๋Š” PowerShell์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค .
  • _PowerShell's_ ๊ตฌ๋ฌธ ๋ฐ _its_ ์ธ์ˆ˜ ๋ชจ๋“œ ๋ฉ”ํƒ€ ๋ฌธ์ž๋ฅผ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • ` ๋Š” ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž์™€ ์ค„ ์—ฐ์†์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    • PowerShell์—๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ธ์šฉ / ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ๋ฉ”ํƒ€ ๋ฌธ์ž๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค ( @ ๋Š” ์ธ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๋กœ๋งŒ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.) :

      • POSIX ์œ ์‚ฌ ์…ธ (์˜ˆ : Bash) : @ { } ` (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 ์‹คํ–‰ ๊ฐ€๋Šฅ ํ˜ธ์ถœ] :

_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"'
    • _expandable_ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์‹œ ๋ช…๋ น ๋ฌธ์ž์—ด์— PowerShell ๊ฐ’์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • $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 ๋ฃจํ”„ ๋ณ€์ˆ˜, % ๋ฅผ %% ๋กœ ์ด์Šค์ผ€์ดํ”„ํ•˜๋Š” ๊ธฐ๋Šฅ).

    • ๋ฐฐ์น˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด Unix์—์„œ์™€ ๊ฐ™์ด ํ†ต๊ณผ ์ธ์ˆ˜๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
# 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]
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰