Fish-shell: && ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

์— ๋งŒ๋“  2012๋…„ 06์›” 19์ผ  ยท  98์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: fish-shell/fish-shell

cd .. && pwd ๋Š” ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

fish: Expected a command name, got token of type 'Run job in background'. Did you mean 'COMMAND; and COMMAND'? See the help section for the 'and' builtin command by typing 'help and'.
cd .. && pwd

๋ถ„๋ช…ํžˆ COMMAND; and COMMAND ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ด๊ฒƒ์„ ์ง€์›ํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

enhancement

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

|| ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

|| ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ง€ ๋Œ€์•ˆ์ ์ธ ์˜๊ฒฌ์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.
'||' ๋ฐ '&&'๋Š” ๊ตฌ๋ฌธ ์š”์†Œ์ด๊ณ  'and' ๋ฐ 'or'๋Š” ๊ฐ„๋‹จํ•œ ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฐ„๋‹จํ•˜๊ณ  ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ตฌ๋ฌธ ์š”์†Œ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
bash์™€ ๋‹ค๋ฅด์ง€๋งŒ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ &&์™€ || ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ ์„คํƒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉ์„ฑ์ด ์žˆ์œผ๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

maxfl์˜ ์ œ์•ˆ์— +1.

maxfl์˜ ์ œ์•ˆ์— +1.

Ruby์—๋Š” and ๋ฐ or ํ‚ค์›Œ๋“œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

+1

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ์ผ์„ ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋ฉด ๋‚˜๋Š” ์ด์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

-1 ๊ตฌํ˜„์— &&/|| ๊ทธ๋ฆฌ๊ณ  maxfl์— +1. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ตฌํ˜„๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ตฌ๋ฌธ์ƒ์˜ ์„คํƒ•์ด ์•„๋‹ˆ๋ฉฐ bash์—์„œ๋Š” ๊ตฌ๋ฌธ์ผ ๋ฟ์ด๋ฉฐ ๋ฌผ๊ณ ๊ธฐ์—์„œ๋Š” ์ด ๊ตฌ๋ฌธ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ';or'๋Š” '||'๋งŒํผ ์ •ํ™•ํ•˜๊ฒŒ ํ‚ค ์ž…๋ ฅ์„ ์ทจํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ ์„คํƒ•์œผ๋กœ ์ •๋ง ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

and ๋ฐ or ๋ช…๋ น์˜ ๋‹จ์ˆœํ•จ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” if ๋ฌธ์„ ์ด์ƒํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

if begin ; [ a = b ] ; and [ c = d ] ; end
   ...

์— ๋น„ํ•ด

if [ a = b ] && [ c = d ]
    ...

๋ˆ„๊ตฌ๋“ ์ง€ ๊ทธ๊ฒƒ์„ ๊ฐœ์„ ํ•  ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

if test a = b -a c = d # or [ ] syntax, but I didn't particularly liked it
    ...

๊ทธ๋Ÿฌ๋‚˜ test ๋‚ด์žฅ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. c ๋ฐ d ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‚ด์žฅ a ๋ฐ b ๊ฐ€ true ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

and b
and begin
    c
    d
end

๋˜๋Š” ๋ธ”๋ก ๊ตฌ๋ฌธ ๋ฐ if .

if begin
        a
        and b
    end
    c
    d
end

๋˜๋Š” ์ค‘์ฒฉ๋œ ์กฐ๊ฑด๋ถ€๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค.

if a
    if b
        c
        d
    end
end

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ, ์ด ํ•ดํ‚น์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ํ•„์š”ํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ searchco.de์— ๋”ฐ๋ฅด๋ฉด && ๋Š” ๋Œ€๋ถ€๋ถ„ test ๋‚ด์žฅ(๋˜๋Š” ๋ถ€์ž‘์šฉ)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋“œ๋ฌธ ๊ฒฝ์šฐ์— fish ์œ ์šฉํ•œ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ( test ์ฒ˜๋Ÿผ) ๋‚จ์•„ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์ด๋ฏธ [ ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ๋น„๋ฆฐ๋‚ด๊ฐ€ ๋‚˜์ง€๋Š” ์•Š์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค(์ƒ์„ ์ด ์ง€์›ํ•˜์ง€ ์•Š๋Š” [[ ์™€ ๋‹ฌ๋ฆฌ).

๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ(๋˜๋Š” ์ด ๊ฒฝ์šฐ์—๋Š” ์„ธ ๊ฐ€์ง€)์ด ์žˆ์œผ๋ฉด ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

if a
    b
end
a; and b
a && b

&& ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‚ฌ์‹ค์˜ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค. ;and ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ •ํ™•ํžˆ ๊ฐ™์€ ์ˆ˜์˜ ํ‚ค ์ž…๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค( & ์—๋Š” Shift๊ฐ€ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ). && ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(๋‹ค์‹œ and ๋Š” begin ์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ๋’ค์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ณ  ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ข…์˜ ํŠน๋ณ„ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค).

๋ฌธ์ œ๋Š” ; and ๋ฐ ; or ๊ตฌ๋ฌธ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ ๊ตฌ๋ฌธ์€ ์ค‘๋ณต์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์ด๋ฏธ ์ผ์ข…์˜ ๋งˆ๋ฒ•์ž…๋‹ˆ๋‹ค( $status ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ && ๋ฐ || ๋กœ ๋Œ€์ฒด ๋œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. || .

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•  ํ•˜๋‚˜์˜ ๊ตฌ๋ฌธ ๋งŒ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ; and ๋ฐ ; or ๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ์ด์ „ ๊ตฌ๋ฌธ์ด ์ œ๊ฑฐ๋œ๋‹ค๋ฉด && ๋ฐ || ์— ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•˜๋ฉด ; and ๋ฐ ; or ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ begin ๊ฐ€ ๋” ์งง๋‹ค๋ฉด(bash์˜ ์ค‘๊ด„ํ˜ธ์ฒ˜๋Ÿผ)... ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋น„๋ฆฐ๋‚ด๊ฐ€ ๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

bash์™€ ๊ฐ™์€ [[ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋” ๋น ๋ฅด๋ฉฐ(๊ธฐ๋ณธ ์ œ๊ณต ์—์ฝ” ์ฐธ์กฐ) && ๋ฐ || ๋ฐ/๋˜๋Š” ๋™์ž‘์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด [[ ๋ฐ ]] ๋‚ด์˜ ์—ฐ์‚ฐ์ž.

[[ ๋Š” ์‹ค์ œ ๋ช…๋ น์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— bash์—๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” [[ ๊ฐ€ ๋ถˆํ•„์š”ํ•œ ์ธ์šฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ ๋ถ„์„ ๊ทœ์น™์ด ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” [ (๋Œ€๋ถ€๋ถ„)์™€ ๋น„์Šทํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง๊ต์„ฑ ์˜ ๋ฒ•์น™๊ณผ ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅ์„ฑ์˜ ๋ฒ•์น™ ์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฌผ๊ณ ๊ธฐ์— ์—†๋Š” ์ด์œ ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ์‹ค, [ ๊ฐ€ ๋ฐœ๊ฒฌ ๊ฐ€๋Šฅ์„ฑ์˜ ๋ฒ•์น™๊ณผ ์ง๊ต์„ฑ์˜ ๋ฒ•์น™ ๋•Œ๋ฌธ์— ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฑฐ์˜ ํ™•์‹ ํ•˜์ง€๋งŒ /usr/bin ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. test ๋Š” ํƒญ ์™„์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น„์ •์ƒ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์ž„์˜์ ์ด๋ฏ€๋กœ ๋‚ด์žฅ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, bash์—์„œ [[ ๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์„ ์ž๋™์œผ๋กœ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค.

[[ abc = $variable ]]

๊ทธ๋Ÿฌ๋‚˜ ๊ณต๋ฐฑ ๋ถ„ํ•  ๋™์ž‘์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌผ๊ณ ๊ธฐ์—์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ && , || , < , > ๋Š” ๊ตฌ๋ฌธ์  ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์ž๋™์œผ๋กœ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๊ณ ๊ธฐ์—์„œ && ๋Š” -a , || ๋Š” -o ์ž…๋‹ˆ๋‹ค. < ๋ฐ > ๋„ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

=~ ์—ฐ์‚ฐ์ž๋„ ์žˆ์Šต๋‹ˆ๋‹ค. fish ์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด ์กฐ์šฉํ•œ grep์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

echo $ANSWER | grep -qE '^y(es)?$'

๋˜ํ•œ bash ์—๋Š” < ๋ฐ > ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘์€ ๋ฌธ์ž์—ด์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฑฐ์˜ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  = ๋ฐ != ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ธ€๋กœ๋น™ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๋ฅผ ์œ„ํ•ด ์กฐ์šฉํ•œ grep์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

[[ abc = a* ]]

๋˜ํ•œ [[ ๋Š” -e , -nt , -ot , -ef , ! ๋กœ ์ •์˜๋˜์ง€๋งŒ ๋ฌผ๊ณ ๊ธฐ๋Š” ์ด๋ฏธ test ์ด๊ฒƒ์„ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ธ€์Ž„, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ bash์˜ [[ ๋‚ด์žฅ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜๋“œ์‹œ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ์˜คํžˆ๋ ค ์ž์ฒด ์†์„ฑ์„ ๊ฐ€์ง„ ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋กœ ๋„์ž…๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๋ฌผ๊ณ ๊ธฐ๋Š” bash์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋งŽ์€ ํ‚ค์›Œ๋“œ์™€ ๊ตฌ์„ฑ์„ ๊ณต์œ ํ•˜์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ๋˜์ง€ ์•Š์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋งํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์•„๋งˆ๋„ ์šฐ๋ฆฌ ์ž์‹ ์˜ test ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๊ตฌ์„ฑ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ cond ์™€ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ด๋ฆ„์ด ๋ฐ”๋€Œ์—ˆ์ง€๋งŒ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋Œ€์‹  math ๋‚ด์žฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ expr . ์šฐ๋ฆฌ๋Š” ์‚ฌ์ „์ˆœ ์ •๋ ฌ ๋Œ€์‹  ์ž์—ฐ(์ˆซ์ž) ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ˆซ์ž์—์„œ๋„ ์ž‘๋™ํ•˜๋„๋ก < ๋ฐ >์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ง€์ ์œผ๋กœ ๊ฐˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@Undeterminant builtin [[ vs builtin [ vs /bin/[ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๋Š” bash์—์„œ ์ด๋ฏธ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. bash-[[ vs fish-[[ ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด!
๋˜ํ•œ bash์˜ ์ •์‹  [[ ์ง๊ต์„ฑ์˜ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. "์ˆ˜์ •" ๋ฐ/๋˜๋Š” ๊ตฌ์„ฑ์ด ์ง€์›ํ•˜๋Š” ํŠน์ • ์กฐ๊ฑด์—๋งŒ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

bash์˜ if commands...; then ...; fi ๊ฐ€ ๋ฌผ๊ณ ๊ธฐ ๋ฐ/๋˜๋Š” if...then ์‚ฌ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ธ์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์•„์ด๋Ÿฌ๋‹ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” "๊ทธ๋•Œ"๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ณ ์ณ์•ผ ํ•  ๊ฒƒ์€ ์‹œ์ž‘...๋์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์ด์ƒํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š”์ง€ ์ „ํ˜€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค):

if (foo; and bar)
  ...
end

ํ˜„์žฌ ๋ช…๋ น ์‹œ์ž‘ ์‹œ (...) ๋Š” ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ž์—ฐ์Šค๋Ÿฌ์šด ์ฝ๊ธฐ๋Š” ์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์„ ๋ช…๋ น ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” eval ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ง์ ‘ ์ฝ๊ธฐ๋ฅผ ์ ˆ๋Œ€ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒฝ์šฐ (...) ๋ฅผ begin ...; end ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์œ„์น˜์—์„œ stdout์„ ์บก์ฒ˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ผ๊ด€์„ฑ์ด ์—†์ง€๋งŒ ๋งค์šฐ ์ปดํŒฉํŠธํ•˜๊ณ  ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์‹ซ์–ดํ•˜๋Š” ๊ฒƒ์€ if (...) ๊ฐ€ ๋˜ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ตฌ๊ฑธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ์„ ์บก์ฒ˜ํ•˜๊ณ  ๋ถ€์šธ ํ•ด์„์„ ํ• ๋‹นํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ: if (math 2 \< 4) โ€” math ๋Š” ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  0 ๋˜๋Š” 1์„ stdout์— ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์šฉ๋„๋Š” if $saved_bool ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ์‹ค์šฉ์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ 0/1์ด ์ ˆ๋ง์ ์œผ๋กœ ํ˜ผ๋™๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์— ๋ถ€์šธ ์˜๋ฏธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ if (...) ๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ์„ ๋•Œ ํ•ฉ๋ฆฌ์ ์ธ ์ถ”์ธก์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด bash ๋ฐ zsh์— ์žˆ๋Š” ๊ณตํ†ต ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค. ์‹ ๊ทœ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „ ์‰˜ ๊ธฐ๋Šฅ์˜ ๋Œ€๋ถ€๋ถ„์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์›Œ์งˆ์ˆ˜๋ก ๋ฌผ๊ณ ๊ธฐ์˜ ํก์ˆ˜์œจ์ด ๋” ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋” ์ข‹์•„ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์–ด๋ฆฌ์„์€ ์ž‘์€ ์žฅ์• ๋ฌผ ์ค‘ ์ผ๋ถ€๋Š” ์‹ค์ œ๋กœ ์ง€์›ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” 15๋…„ ์ด์ƒ์˜ ์‰˜ ์‚ฌ์šฉ์ž ์ •์˜์™€ ํ•จ๊ป˜ ์˜ฌ ๋•Œ ์ด์ ๋ณด๋‹ค ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋” ๋งŽ์ด ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. .

์†”์งํžˆ && ๋ฅผ "์–ด๋ฆฌ์„์€ ์ž‘์€ ์žฅ์• ๋ฌผ"๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. zsh์™€ ๊ฐ™์€ "๋Œ€์ฒด ์‰˜" ๋Œ€์‹  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ž์ฒด ์–ธ์–ด๋กœ ์ทจ๊ธ‰ํ•˜๋ฉด ๋ฐฐ์šฐ๊ธฐ๊ฐ€ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์ฝ์œผ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

command1; and command2 ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด and ๊ฐ€ command2 ์˜ ์กฐ๊ฑด๋ถ€ ์‹คํ–‰์ด๋ฉฐ command1 ์™€ command2 ์‚ฌ์ด์˜ ์ผ๋ถ€ ์กฐ์ธ์ด ์•„๋‹˜์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๊ทธ๋Ÿฌ๋‚˜ @Undeterminant , ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ฒ˜์Œ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ ์ฒ˜์Œ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ๋Š๋‚Œ์ด๋‚˜ ์ˆ™๋ จ๋„๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์˜ค๊ฒŒ ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์˜ค๋ž˜๋œ ๋ ˆ๊ฑฐ์‹œ ๊ตฌ์„ฑ์—์„œ ์ˆ˜๋ฐฑ ์ค„์„ ๊ฐ€์ ธ์™”๋Š”๋ฐ ์†”์งํžˆ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ์„ ์ฆ‰์‹œ ๋ณ€ํ™˜ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ฌธ์ œ๊ฐ€ ๋‚ด ์ด์ „ ๊ตฌ์„ฑ ๋‚ด์—์„œ ์–ด๋””์— ์žˆ๋Š”์ง€์™€ ๊ด€๋ จํ•˜์—ฌ ๋ฌผ๊ณ ๊ธฐ์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์ค„ ๋ฒˆํ˜ธ๊ฐ€ ์—†๋Š” ์ด์ƒํ•œ ์ ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋„ค, ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹น์‹ ์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ค๋ž˜๋œ ์ผ์„ ํ•˜๋„๋ก ํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ๊ณ ๋ฅผ ์ฃผ์–ด ์‚ฌ๋žŒ๋“ค์„ ์žŠ๋„๋ก ํ•ฉ์‹œ๋‹ค.

@ylluminate ๋‹น์‹ ์€ ์ž์‹ ์„ ์†์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๊ณ ๊ธฐ๊ฐ€ && ๋ฅผ ์ง€์›ํ•˜๋”๋ผ๋„ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์Šคํฌ๋ฆฝํŒ… ๊ตฌ๋ฌธ์— ๋” ๋งŽ์€ ์ฐจ์ด์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ bash ๋˜๋Š” zsh์˜ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ. ๋ฌผ๊ณ ๊ธฐ๋Š” ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฆ‰, ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ bash๋กœ ์ž‘์„ฑ๋œ ๊ฒฝ์šฐ ๋ฌผ๊ณ ๊ธฐ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๋ช…์‹œ์ ์ธ ํ•„์š”๊ฐ€ ์—†๋Š” ํ•œ bash๋กœ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋“ค์€ ๋ณ„๋„์˜ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ
๋งŒ์•ฝ ๋‚ด๊ฐ€ํ•œ๋‹ค๋ฉด
๋ช…๋ น1 && ๋ช…๋ น2
๋ฌผ๊ณ ๊ธฐ์—์„œ ๊ทธ๊ฒƒ์€ ๋Œ€์‹  ๋‚ด๊ฐ€ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค
๋ช…๋ น1; ๋ฐ ๋ช…๋ น2

๋ˆ„๊ตฐ๊ฐ€ (๋ช…๋ น์ค„์—์„œ) ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์ด ๋” ๊นจ๋—ํ•˜๊ณ  ๋ฏธ๋ž˜์ ์ด๋ฉฐ ์ž…๋ ฅํ•˜๊ธฐ ๋” ์‰ฝ๋‹ค๊ณ  ์ •๋ง๋กœ ๋ฏฟ์Šต๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๋Š” ๋Œ€์‹  ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ๊ตฌ๋ฌธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค.

bash์—์„œ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

foo & bar # executes foo in the background, then bar in the foreground
foo && bar # executes foo in the foreground, then executes bar if foo has a zero exit status
foo & bar && baz & qux # left as an exercise for the reader

์ด๊ฒƒ์€ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ ๋Œ€์‹  ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”ผํ•˜๊ณ ์ž ํ•˜๋Š” ์ผ์ข…์˜ ๋„Œ์„ผ์Šค์ž…๋‹ˆ๋‹ค.

์ด ๋””์ž์ธ ๊ฒฐ์ •์€ ํŠนํžˆ if ๋ฌธ์—์„œ ํ™•์‹คํžˆ ๋น„์šฉ์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์ด๋ฅผ ์ค„์ด๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” "๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋‹ค๋ฅธ ์กฐ๊ฐœ์ฒ˜๋Ÿผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ž"๋ณด๋‹ค๋Š” "๋ฌผ๊ณ ๊ธฐ์˜ ๋””์ž์ธ ์ฒ ํ•™ ๋‚ด์—์„œ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ž"๋ผ๋Š” ์ž…์žฅ์—์„œ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(๋ธ”๋ก๊ณผ ํ•จ๊ป˜ & ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •)?

foo &
if bar
    baz
end &
qux

๋‚˜๋ฅผ ์œ„ํ•ด, ๊ทธ๊ฒƒ์€ ์ธ์œ„์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๋˜ํ•œ & ๊ตฌ๋ฌธ์ด ๋„ˆ๋ฌด ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋ฉด background ๋‚ด์žฅ ๋“ฑ์„ ๋งŒ๋“ค์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฐฐ๊ฒฝ์„ ๋‚ด์žฅ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฃผ์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€๋Š” ์•Š์ง€๋งŒ.

; and ๋ฐ ; or ๋Š” ํŒŒ์ดํ”„์™€ ์ œ๋Œ€๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. condition; and echo stuff | grep stuff ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ condition && echo stuff | grep stuff ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

and echo stuff | grep stuff ๋Š” ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์ž์„ธํžˆ ์•Œ๋ ค์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

@ridiculousfish ์ƒ์„ ์„ ๋จน๋‹ค ๋ฐœ๊ฒฌํ•œ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. or ์‹์€ if ๋ฌธ ๋ฐ–์—์„œ๋Š” true์ด์ง€๋งŒ if ๋ฌธ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ๋Š” false๋กœ ๋ณด์ž…๋‹ˆ๋‹ค(?). ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด?

root@smogon-dev ~# test 0 = 1; or echo stuff | grep stuff
stuff
root@smogon-dev ~# echo $status
0
root@smogon-dev ~# if test 0 = 1; or echo stuff | grep stuff
                       echo Success
                   else
                       echo Failure
                   end
Failure

bash์™€ ๋น„๊ต:

~/smogon/bin$ [[ 0 == 1 ]] || echo stuff | grep stuff
stuff
~/smogon/bin$ echo $?
0
~/smogon/bin$ if [[ 0 == 1 ]] || echo stuff | grep stuff; then
> echo Success
> else
> echo Failure
> fi
stuff
Success

์ด ๊ฒฝ์šฐ:

if test 0 = 1; or echo stuff | grep stuff

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if test 0 = 1
    or echo stuff | grep stuff
    ...

or ๋ฌธ์€ if ๋ณธ๋ฌธ์— ์žˆ์Šต๋‹ˆ๋‹ค! ๋ถ€์šธ์€ ๋ช…๋ น์ด๋ฏ€๋กœ ํŠน๋ณ„ํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘/๋์„ "๊ด„ํ˜ธ"๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

if begin; test 0 = 1; or echo stuff | grep stuff ; end
    ...

๊ทธ๋ž˜์„œ ํŒŒ์ดํ”„์™€ ๊ด€๋ จ์ด ์•„๋‹ˆ๋ผ ์šฐ์„  ์ˆœ์œ„์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฒ„๊ทธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋ถ€์šธ ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋งŽ์€ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. :)

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์— ์Ÿ์€ ์—๋„ˆ์ง€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‚ด ์˜๋„๋Š” ์–ด๋–ค ๊ฒƒ์ด ๋” ๋‚˜์€์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ํ† ๋ก ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์‹ค์šฉ์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„ ๋Œ€๋ถ€๋ถ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ €์—๊ฒŒ๋„ ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ์—๋„ && ์กฐ๊ฑด์€ ๋ช…๋ น ์„ฑ๊ณต(exit 0)์„ ๋ณด์žฅํ•˜์ง€๋งŒ ";" ๋ฌด์Šจ ์ผ์ด ์žˆ์–ด๋„ ์ƒ๊ด€ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ๊ฐ€์„ธ์š”. ์˜ค๋ฅธ์ชฝ? ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์€ ์ „ํ˜€ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์ด์— ๋™์˜ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. :)

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ทธ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ฌผ๊ณ ๊ธฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ, &&๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ &&๋„ ์‚ฌ์šฉํ•˜๋Š” bash๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ์˜ ํ‰ํ™”์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๋” ์ด์ƒ ๋‚ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! :๋””

๊ถ๊ธˆํ•ด์„œ์š”... ์ด ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌผ๊ณ ๊ธฐ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ํ•จ์ˆ˜๋‚˜ ์ •์˜๋ฅผ stablishํ•˜๊ณ (&&๋งŒ ์˜๋ฏธ) ๊ธฐ์กด bash์—์„œ์™€ ๊ฐ™์ด ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿด๋“ฏํ•œ? ํ•  ์ˆ˜ ์žˆ๋Š”?

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, "and"์˜ ์‚ฌ์šฉ์ด ๋” ์ข‹๊ณ  ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ์ฝ”๋“œ ๋˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์œ„์˜ ์ดˆ๋ณด์ž bash ์ฝ”๋“œ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ &&๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ด๋ฏธ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋Œ€์‹ (... ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค... ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค) ๋ˆ„๊ตฐ๊ฐ€ ์›ํ•˜๊ฑฐ๋‚˜ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ „ํ†ต์ ์ธ bash

์ˆ˜๊ณ ํ•˜์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!!

bash / zsh ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํ•œ ํ˜ธํ™˜์„ฑ์— ๊ฐ€๊นŒ์›Œ์ง„ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋งŽ์€ ์›Œํฌ์Šคํ…Œ์ด์…˜๊ณผ ์„œ๋ฒ„์˜ ์…ธ ํ™˜๊ฒฝ์— ์ด๋ฏธ ๊ตฌ์ถ•ํ•œ ๋ชจ๋“  ์ธํ”„๋ผ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์˜๊ฒฌ์— ๋”ฐ๋ผ fish ๋ฅผ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋” ๊ฐ€๊นŒ์šฐ๋ฉด ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ ์—†์ด ๊ณ„์† ํ–‰์ƒ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”.

@rhoconlinux && ๋ฅผ ์ง€์›ํ•˜๋„๋ก Fish๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด bash ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ณด๋‹ค ๋” ๋งŽ์€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ต๋ณ€์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค ^_^
&& ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ณ„์นญ์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@rhoconlinux ์•„๋‹ˆ์š”, Fish ํŒŒ์„œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(C++์—์„œ). ๋‚ด ์š”์ ์€ Fish๊ฐ€ && ๋ฅผ ์ง€์›ํ–ˆ๋‹ค๋ฉด Bash ์Šคํฌ๋ฆฝํŠธ๋Š” Fish์™€ Bash์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ์ฐจ์ด์  ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@kballard ์•„์•ผ! ํ .... ์ด๋Ÿฐ ๋ง์„ ๋“ค์œผ๋‹ˆ ๋„ˆ๋ฌด ์Šฌํ”„๋„ค์š”. ์ด์ œ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. :)

์ดˆ๊ณ ์† ํ”ผ๋“œ๋ฐฑ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋” ๋‚˜์€ ์ผ์ƒ์ ์ธ ๊ฒฝํ—˜์„ ์œ„ํ•ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ณ  ๋‚ด ๋ฌผ๊ฑด์„ ์œ„ํ•œ bash ํ„ฐ๋ฏธ๋„์„ ์œ ์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฑด๋ฐฐ! :+1:

&& ๊ฐ€ ๋ฌธ์ œ๋ผ๋ฉด ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sed 's/&&/; and /' ~/.bashrc > ~/.config/fish/config.fish

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ํ•ด์•ผ ํ•  ์œ ์ผํ•œ ์ผ์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ #522์˜ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

&& ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์ฃผ์š” ๋™๊ธฐ๋Š” ๊ธฐ์กด
์ฝ”๋“œ๋ฒ ์ด์Šค์ด์ง€๋งŒ ์ธํ„ฐ๋„ท์—์„œ ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด sudo add-apt-repo... && sudo apt-get update && sudo apt-get install ... ์Šค๋‹ˆํŽซ์„ ๋ณด๊ณ  ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ณ  ์‹ถ์ง€๋งŒ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ต์œก์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
์Šค๋‹ˆํŽซ์„ ๋ถ™์—ฌ๋„ฃ๊ณ  ํ‘œ์ค€ [ba]sh ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  && ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ๋ถ€๋”ช์น˜๊ณ  ์žˆ๋Š” #1 ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
( export FOO=bar ๋Š” #2 ์ด์ง€๋งŒ function export; set -x -g (echo $argv | sed 's/=/\n/'); end ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋ž˜๋„ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๋Š” ์Šต๊ด€์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.
bash , ๋ถ™์—ฌ๋„ฃ๊ธฐ, Ctrl+D.
ํ , ํ˜„์žฌ/์ด์ „์„ ์‹คํ–‰ํ•  ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
bash์—์„œ ๋ช…๋ น์ค„.

๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‚ด 2์„ผํŠธ:
์ €๋Š” ์…ธ ๋ช…๋ น์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฐํฌ ๋„๊ตฌ(https://github.com/andres-montanez/Magallanes)์—์„œ ์ž‘์—… ์ค‘์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์™€ ๊ธฐ์—ฌ์ž๋Š” bash ์…ธ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์—ฌ๊ธฐ์ €๊ธฐ์„œ '&&'๋Š” ๋ช…๋ น์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ช…๋ฐฑํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋ชจ๋“  ๋ช…๋ น์„ bash์— ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌ).
๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ณ ํ†ต์„ ๊ฐ€์ ธ๋‹ค์ค๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ด์ƒํ•œ ๋ถ€์ž‘์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: PATH ๋ฐ ๊ธฐํƒ€ ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ •์˜๋˜์ง€ ์•Š์Œ). ์ด๋Š” ์œ ์ผํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด ๋„๊ตฌ์˜ ์ผ๋ถ€ ํ•ต์‹ฌ ๋ถ€๋ถ„์„ ํ•ดํ‚นํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ ๋ฒ„์ „ ๊ฐ„์— ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งˆ๋‹ค.

&&๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋งŽ์€ bash ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด์ง€๋งŒ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ๋„๊ตฌ๋Š” PHP์— ์žˆ์œผ๋ฏ€๋กœ ๋ณต์žกํ•œ ๋ชจ๋“  ์ž‘์—…์€ PHP์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ ๊ธฐ๋ณธ ์‹œ์Šคํ…œ ๋ช…๋ น๋งŒ ์…ธ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ตœ์†Œํ•œ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋กœ ๊ตฌ๋ฌธ ๋น„ํ˜ธํ™˜์„ฑ์„ ์น˜๋Š” ๊ฒƒ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” @cben์ด && ๊ฐ€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ผ๊ณ  ๋งํ•œ ๊ฒƒ์— ์™„์ „ํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ณต์‚ฌ์™€ ๋ถ™์—ฌ๋„ฃ๊ธฐ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ && ๋Œ€ํ•œ ์ง€์›๋ฟ์ธ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์ด ์˜จ๋ผ์ธ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ตฌ๋ฌธ ๋“ฑ์˜ ์ธก๋ฉด์—์„œ ์•ž์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ•˜๋Š”์ง€ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋งŽ์€ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. && ๋ฅผ ; and ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋†€๋ผ์šด์ง€ ๋งํ•  ๋•Œ ํ•ญ์ƒ ์„ฑ๊ฐ€์‹œ๊ณ  ์–ด์ƒ‰ํ•˜๊ฒŒ ๋Š๊ปด์ง€์ง€๋งŒ ์ฃผ์œ„๋ฅผ ๋‘˜๋Ÿฌ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ‚ค์›Œ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ด๊ฐ€ ์™œ ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚˜๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•˜๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ™๋ณดํ•˜๋Š” ์ข‹์€ ์‚ฌ๋ก€๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋•Œ๋กœ๋Š” ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์š”์ปจ๋Œ€ ์ €๋Š” bash && ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@Globegitter ์™€ @cben์˜ ๋ง์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ์Šคํฌ๋ฆฝํŠธ์™€ ํ”„๋กœ๊ทธ๋žจ์€ && ๋ฐ || ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์›Œํฌ์Šคํ…Œ์ด์…˜์—์„œ ํ”ผ์‰ฌ ์‰˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‰˜ ๊ฐ„ ํ˜ธํ™˜์„ฑ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

&& ๋ฐ || ์™ธ์—๋„ Fish ์Šคํฌ๋ฆฝํŒ…๊ณผ Bash ์Šคํฌ๋ฆฝํŒ… ์‚ฌ์ด์— ์ƒ๋‹นํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์—ฌ๊ธฐ ๋Œ“๊ธ€์„ ๋‹ค์‹  ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘ Fish๊ฐ€ && ์ˆ˜๋ฝํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? Bash ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ bash ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์Šค๋‹ˆํŽซ์„ ์‹คํ–‰ํ•œ ๋‹ค์Œ Fish๋กœ ๋‹ค์‹œ ์ข…๋ฃŒํ•˜์‹ญ์‹œ์˜ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฌผ๊ณ ๊ธฐ๋กœ "์ „ํ™˜"ํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€๋งŒ ๊ฐ€์ ธ์˜ฌ ์ธํ”„๋ผ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ €๋Š” ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ 15๋…„ ๋™์•ˆ์˜ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ ์›Œํฌ์Šคํ…Œ์ด์…˜์—๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ช‡ ๋‹ฌ์— ๊ฑธ์ณ "๋ฌผ๊ณ ๊ธฐ ๋ฐฉ์‹"์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์‰˜๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ์›Œํฌํ”Œ๋กœ์— ์ดˆ๊ธฐ ํˆฌ์ž๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

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

ํ•„์š”์— ๋”ฐ๋ผ bash ๋˜๋Š” zsh ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ œ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์…ธ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์–‘์ด ๋  ๊ฒƒ์ด๋ฉฐ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค.

@kballard ์ €๋Š” ๋ฌผ๊ณ ๊ธฐ๋กœ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŒ…์˜ 95%์— ์ด์ƒ์ ์ธ ์›Œํฌํ”Œ๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. cmd+C ๋‹ค๋ฅธ ์†Œ์Šค์˜ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ, cmd+tab์—์„œ iTerm, cmd+v ๋ฐ Enter๋กœ. ์ถ”๊ฐ€ bash ๋˜๋Š” ๊ทธ ๋ฐ–์˜ ๊ฒƒ์€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  ๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ด ์ •ํ™•ํ•œ ์›Œํฌํ”Œ๋กœ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ && ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚˜์™€ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.
์ง์ ‘ ๊ฒฝํ—˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์›Œํฌํ”Œ๋กœ๊ฐ€ ๋„ˆ๋ฌด ์ž์ฃผ ์ค‘๋‹จ๋˜๋ฉด ๋”ํ•ด์ง€๊ณ  ๋งˆ์Œ์— ์™€ ๋‹ฟ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์‚ฌ๋ž‘ํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋‹ค์‹œ ์ „ํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. PR #1633์ด ๋„์ฐฉํ•˜๋ฉด ๋‹ค์Œ์„ ๊ฐ€์ ธ์™€ ~/.config/fish/functions/fish_user_key_bindings.fish ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function handle_input_bash_conditional --description 'Function used for binding to replace && and ||'
    # This function is expected to be called with a single argument of either & or |
    # The argument indicates which key was pressed to invoke this function
    if begin; commandline --search-mode; or commandline --paging-mode; end
        # search or paging mode; use normal behavior
        commandline -i $argv[1]
        return
    end
    # is our cursor positioned after a '&'/'|'?
    switch (commandline -c)[-1]
    case \*$argv[1]
        # experimentally, `commandline -t` only prints string-type tokens,
        # so it prints nothing for the background operator. We need -c as well
        # so if the cursor is after & in `&wat` it doesn't print "wat".
        if test -z (commandline -c -t)[-1]
            # Ideally we'd just emit a backspace and then insert the text
            # but injected readline functions run after any commandline modifications.
            # So instead we have to build the new commandline
            #
            # NB: We could really use some string manipulation operators and some basic math support.
            # The `math` function is actually a wrawpper around `bc` which is kind of terrible.
            # Instead we're going to use `expr`, which is a bit lighter-weight.

            # get the cursor position
            set -l count (commandline -C)
            # calculate count-1 and count+1 to give to `cut`
            set -l prefix (expr $count - 1)
            set -l suffix (expr $count + 1)
            # cut doesn't like 1-0 so we need to special-case that
            set -l cutlist 1-$prefix,$suffix-
            if test "$prefix" = 0
                set cutlist $suffix-
            end
            commandline (commandline | cut -c $cutlist)
            commandline -C $prefix
            if test $argv[1] = '&'
                commandline -i '; and '
            else
                commandline -i '; or '
            end
            return
        end
    end
    # no special behavior, insert the character
    commandline -i $argv[1]
end

function fish_user_key_bindings
    bind \& 'handle_input_bash_conditional \&'
    bind \| 'handle_input_bash_conditional \|'
end

์ด๊ฒƒ์€ & ๋ฐ | ๋ฐ”์ธ๋”ฉํ•˜๊ณ  && ๋˜๋Š” || ์ž๋™์œผ๋กœ ์ ์ ˆํ•œ ; and / ; or , ๋”ฐ๋ผ์„œ command one && command two ํ˜•์‹์˜ ํ–‰์— ๋ถ™์—ฌ๋„ฃ๊ณ  ์ž‘๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

PR #1633์ด ์Šน์ธ๋  ๋•Œ๊นŒ์ง€ ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” _typing_ && / || ๋Œ€ํ•ด ์ž‘๋™ํ•˜์ง€๋งŒ ๋ถ™์—ฌ๋„ฃ๊ธฐ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@kballard ์™€์šฐ, ํฌ์†Œ์‹์ž…๋‹ˆ๋‹ค! ์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ฒ€์ƒ‰ ๋ชจ๋“œ๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํŽ˜์ด์ € ๋ชจ๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ๊ตฌ์„ฑํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๊ฒ€์ƒ‰ ์ค‘์— & ๋˜๋Š” | ๋ˆ„๋ฅด๋ฉด ๊ฒ€์ƒ‰์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ค„ ๋ช…๋ น์— | ๋˜๋Š” & ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋ฒ„๊ทธ ์ˆ˜์ •์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

@kballard ํ™๋ณด๊ฐ€ && ์ด ์ตœ์‹  ๋งˆ์Šคํ„ฐ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋„ค, ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

- ์ผ€๋นˆ

2014๋…„ 9์›” 1์ผ ์˜ค์ „ 1์‹œ 14๋ถ„์— Markus Padourek [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@kballard ํ™๋ณด๊ฐ€

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ํšŒ์‹ ํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.

๋ฉฐ์น  ์ „์— ์ถœ์‹œ๋œ ์ƒˆ๋กœ์šด 2.1.1 ๋ฒ„์ „์œผ๋กœ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 2.2๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋‚˜์š”? ๊ฐ์‚ฌ ํ•ด์š”!

@pragmattica : 2.1.1์€ ๋ณด์•ˆ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฆด๋ฆฌ์Šค์˜€์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@xfix : ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค ์ค˜์„œ ๊ณ ๋งˆ์›Œ. 2.2๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

๊ต‰์žฅํ•˜๋‹ค :+1:

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ์ค‘์ธ ๋ณ€๊ฒฝ ๋กœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? CHANGELOG ๋ฃจํŠธ๊ฐ€ ์ƒ๋‹นํžˆ ์˜ค๋ž˜๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@pragmattica ์ด์ œ ๋ฌผ๊ณ ๊ธฐ 2.2๊ฐ€ ๋‚˜์™”์œผ๋‹ˆ ์šฐ๋ถ„ํˆฌ 14.04์—์„œ ์‹œ๋„ํ–ˆ๋Š”๋ฐ echo 'test1' && echo 'test2'; ๊ฐ€ echo test1 &; and echo 'test2'; ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

fish_user_key_bindings.fish ๋‚ด์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (๋‚ด๊ฐ€ ์ง์ ‘ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•˜์ง€๋งŒ ๋‚ด ๋ฌผ๊ณ ๊ธฐ/๋ฐฐ์‹œ ์Šคํฌ๋ฆฝํŠธ ์ง€์‹์ด ์•ฝ๊ฐ„ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค)

ํŽธ์ง‘: ๊ทธ๋Ÿฌ๋‚˜ && ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๊ณต๊ฐ„์—์„œ ์ผ์–ด๋‚œ๋‹ค๋ฉด ์กฐ๊ธˆ ์ข‹๊ฒ ์ง€๋งŒ ๊ทธ๊ฑด ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ˆ๋ฐ˜์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. :)

-1 ์ด์ƒํ•œ ๊ธฐํ˜ธ:

if [[ a = b ]]; and [[ b = a ]]; or [[ c = b ]]; then echo hello; and echo world; done

๋‹จ์ˆœ ๊ธฐํ˜ธ์— +1:

if [[ a = b ]] && [[ b = a ]] || [[ c = b ]]; then echo hello && echo world; done

Aaahhh @pragmattica commandline ๋ช…๋ น์€ ๋”ฐ์˜ดํ‘œ ์—†์ด ๋ฒ„ํผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋„ค ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ https://github.com/fish-shell/fish-shell/issues/2210 ์ด ์ˆ˜์ •๋˜๋ฉด ์œ„์˜ ์Šคํฌ๋ฆฝํŠธ๋„ ์ˆ˜์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ์‹œ์ž‘์ด ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๊นŒ?

+1
๊ธฐํ˜ธ๋Š” ์ด์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋…ผ๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋ณต์‚ฌ ๋ฐ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ˜ธํ™˜์„ฑ์€ ๋งค์šฐ ์‹ค์ œ์ ์ธ ์ฃผ์žฅ์ด๋ฉฐ ์ œ๊ฐ€ ์ง€์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋…ผ์˜๋œ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด์—๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ksh88(bash ์•„๋‹˜)์— ์˜ํ•ด ์ฒ˜์Œ ๋„์ž…๋œ ์ผ๋ถ€ [[ ... ]] ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ์žฅ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋งˆ๋„ ์ด๋Ÿฌํ•œ ํŠน์ˆ˜ ํ† ํฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ด์žฅ test ๋ช…๋ น ๋˜๋Š” ์ƒˆ ๋ช…๋ น์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ zsh์™€ bash๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด ๊ฐœ๋…์— ๋Œ€ํ•ด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ๋Š” ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ์ „์—๋Š” ๋ฌผ๊ณ ๊ธฐ์— ๊ด€์‹ฌ์ด ๋งŽ์•˜๋Š”๋ฐ ๋ฐ˜๋Œ€์— ๋ฐ€๋ ค ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ด๊ฒƒ์ด ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ์—ฌ๊ธฐ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„๊ธฐํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํฅ๋ฏธ๋กœ์šด ์ž‘ํ’ˆ์˜ ์ „์ง„ ์ถ”์ง„๋ ฅ๊ณผ ์ˆ˜์šฉ์„ ๊ถ๊ทน์ ์œผ๋กœ ๋ฐฉํ•ดํ•˜๋Š” ์ด๋Ÿฌํ•œ ์ง€์†์ ์ธ ์ €ํ•ญ์„ ๋ณด๋Š” ๊ฒƒ์€ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.

@ylluminate "zsh ๋ฐ bash ์ง€์›"์œผ๋กœ ๋ฌด์—‡์„ ์—ผ๋‘์— ๋‘๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ? ์–ด๋–ค ์ˆ˜์ค€์˜ ํ˜ธํ™˜์„ฑ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์—ฌ์ „ํžˆ zsh์™€ bash๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด ๊ฐœ๋…์— ๋Œ€ํ•ด ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ๊ฐ€ ์ดํ•ด๊ฐ€ ๊ฐ€๋„ค์š”...

๋ฌผ๊ณ ๊ธฐ ์ง€์› bash ๋ฐ zsh ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Java๋ฅผ ์›ํ•˜๋ฉด C++๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Perl์„ ์›ํ•œ๋‹ค๋ฉด ์™œ Python์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? @ridiculousfish๊ฐ€ ๋ฐฉ๊ธˆ ์งˆ๋ฌธํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ตฌ๋ฌธ์ƒ์˜ ์„คํƒ• ์™ธ์— ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋‹น์‹ ์„ ํ–‰๋ณตํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์›ํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์–ด๋–ค ์‹œ์ ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋˜ ๋‹ค๋ฅธ bash ํด๋ก ์ด๋ฉ๋‹ˆ๊นŒ?

์ถ”์‹ , ์ €๋Š” 1979๋…„๋ถ€ํ„ฐ ์ƒ๊ณ„๋ฅผ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ–ˆ์œผ๋ฉฐ 80๋…„๋Œ€ ์ค‘๋ฐ˜๋ถ€ํ„ฐ UNIX๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ์‰˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์…€ ์ˆ˜๋ฅผ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Bourne, Csh, Ksh88, Ksh93, Bash, Zsh, Xonsh). ์‰˜์„ ์ „ํ™˜ํ•˜๋ ค๋ฉด ํ•ญ์ƒ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(5๋…„์— ํ•œ ๋ฒˆ ์ด์ƒ ํ•˜์ง€ ์•Š๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค). ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ ์ƒˆ ์…ธ์ด ๋ชจ๋“  ๋ ˆ๊ฑฐ์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€๊ฒฝ ์—†์ด ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ถˆํ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@krader1961 ์ข‹์€ ๋‚ด ๊ฒธ์†ํ•œ ์ƒ๊ฐ์œผ๋กœ ...

๋‚˜๋Š” ํ•ญ์ƒ ๋ฌผ๊ณ ๊ธฐ์—์„œ ์Šคํฌ๋ฆฝํŒ…์„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ฃผ๋ฌธ์— ๋”ฐ๋ฆ„).

  1. ๋ฌผ๊ณ ๊ธฐ์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค(mksh๋ณด๋‹ค ๋Š๋ฆผ).
  2. ์ด์ƒํ•œ ๊ตฌ๋ฌธ(์˜ˆ: ; and , ; or ์ด ๋ณด๊ธฐ์—๋Š” ๋ณด๊ธฐ ํ‰ํ•ฉ๋‹ˆ๋‹ค)
  3. posix์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Œ(๊ตฌ๋ฌธ์€ ์‰ฝ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฐฐ์šธ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Œ)

๊ธ€์Ž„, ๋‚˜๋Š” ๋ฌผ๊ณ ๊ธฐ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋‹ค๋ฅธ ์‰˜ (์˜ˆ: mksh, bash)

๋ฐ˜๋ฉด์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹œ์ž‘ ์‹œ๊ฐ„์€ zsh๋ณด๋‹ค ๋น ๋ฅด์ง€๋งŒ bash๋ณด๋‹ค ๋Š๋ฆผ
  2. ๋งŽ์€ ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค).
  3. ๊ตฌ์„ฑ์€ ํ›Œ๋ฅญํ•˜๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ set -Ux ).

@ylluminate 4๋…„์ฐจ ์ด์Šˆ๋ฅผ ๋ณด๋‹ˆ ๋ฐฐ์‰ฌ ๊ฐ™์€ ์ƒ์„ ์„ ์ฆ๊ธฐ๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ์ „ํžˆ ๊ฒŒ์œผ๋ฅด๋‹ค/๋ฐ”์˜๋‹ค. ์—ด๋งํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ์˜ ๊ป๋ฐ๊ธฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: magicant/yash, elvish/elvish, michaelmacinnis/oh, ๊ทธ๋ฆฌ๊ณ  me :-P). ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ์ผ์„ ํ•˜๋ ค๋ฉด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์•„๋‹Œ ๊ป์งˆ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

&& || ๋ฅผ ๋ฌผ๊ณ ๊ธฐ์— ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•˜๊ณ  ๋งค์šฐ ์žฌ๋ฏธ์—†๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š์œผ๋ฉด begin; end ์ถ”๋ฐฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์นด์šดํ„ฐ- ; and or ๋Š” ์ด์ค‘ ์—ญํ• ์„ ํ•˜๊ณ ,๋งค์šฐ ์•ฝ๊ฐ„ ๋ชป์ƒ๊ธด) ์•ฝ๊ฐ„์˜ ์„คํƒ•๋งŒ ์–ป์œผ์‹ญ์‹œ์˜ค.

@pickfire "๋ฌผ๊ณ ๊ธฐ์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค"์— ๋Œ€ํ•ด ์ž์„ธํžˆ

๋‚ด ํ…Œ์ŠคํŠธ ๋ฌผ๊ณ ๊ธฐ FWIW๋Š” ๋•๋ถ„์—, ๋น ๋ฅธ ์ „์ฒด ๋ฐฐ์‰ฌ๋ณด๋‹ค posix_spawn ๊ฐ€ ๊ฐ™์€ ํŠน์ • ๊ฒฝ์šฐ์— ๋Š๋ฆฐ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ๋น ๋ฅธ ํŒŒ์„œ alias .

ivan<strong i="5">@alarmpi</strong> /tmp> echo 'echo test' > script
ivan<strong i="6">@alarmpi</strong> /tmp> time bash script
test
0.02user 0.01system 0:00.03elapsed 96%CPU (0avgtext+0avgdata 2776maxresident)k
0inputs+0outputs (0major+149minor)pagefaults 0swaps
ivan<strong i="7">@alarmpi</strong> /tmp> time mksh script
test
0.00user 0.00system 0:00.02elapsed 0%CPU (0avgtext+0avgdata 1420maxresident)k
480inputs+0outputs (2major+82minor)pagefaults 0swaps
ivan<strong i="8">@alarmpi</strong> /tmp> time fish script
test
0.07user 0.01system 0:00.09elapsed 85%CPU (0avgtext+0avgdata 4204maxresident)k
352inputs+0outputs (2major+231minor)pagefaults 0swaps

@ridiculousfish ๋‹จ ํ•˜๋‚˜์˜ echo ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ฒƒ๋“ค์— ๋น„ํ•ด ์ด๋ฏธ ๋งค์šฐ ๋Š๋ฆฌ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.

@krader1961 @ridiculousfish IMO, https://github.com/fish-shell/fish-shell/issues/2210 ์ด ์ถœ์‹œ๋˜๋ฉด ํ์‡„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @kballard๊ฐ€ ๊ฒŒ์‹œํ•œ ๋งค์šฐ ์‰ฌ์šด ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@pickfire ๊ณต์œ  echo ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ ์‹œ์ž‘ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ธก์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์‹œ๊ฐ„์€ ๋งค์šฐ ์ค‘์š”ํ•˜์ง€๋งŒ ํ•ด๋‹น ํ…Œ์ŠคํŠธ์—์„œ ์‹œ์ž‘ ์‹œ๊ฐ„(๋Œ€๋ถ€๋ถ„ config.fish์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)์„ ๋„˜์–ด์„œ๋Š” ๊ฒฐ๋ก ์„ ๋„์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ ๋ฒค์น˜๋งˆํฌ์ž…๋‹ˆ๋‹ค.

> cat test.fish
for i in (seq 1000)
    ls > /dev/null
end

> time fish test.fish
        1.51 real         0.74 user         0.65 sys

> cat test.sh
for i in {1..1000} ; do
    ls > /dev/null
done

> time bash test.sh
        2.01 real         0.85 user         1.12 sys

์—ฌ๊ธฐ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ์ด ์ด๊ฒผ์ง€๋งŒ ์ด๊ฒƒ์€ ์ฃผ๋กœ ํฌํฌ์™€ posix_spawn์˜ ์ฐจ์ด๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ๊ฒฐ๋ก ์€ ํฌ๊ด„์ ์ธ ๋ฒค์น˜๋งˆํฌ ์ œํ’ˆ๊ตฐ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ridiculousfish ๋‹น์‹ ์ด ์ €์—๊ฒŒ ์ค€ ๋ฒค์น˜๋งˆํฌ๊ฐ€ ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค:

> cat test.fish
for i in (seq 1000)
    ls > /dev/null
end
> time fish test.fish
4.18user 4.04system 0:22.62elapsed 36%CPU (0avgtext+0avgdata 4360maxresident)k
96inputs+0outputs (1major+321041minor)pagefaults 0swaps
> cat test.sh
for i in {1..1000} ; do
    ls > /dev/null
done
> time bash test.sh
0.70user 1.62system 0:09.81elapsed 23%CPU (0avgtext+0avgdata 2844maxresident)k
0inputs+0outputs (0major+154100minor)pagefaults 0swaps
> time mksh test.sh
0.00user 0.01system 0:00.04elapsed 24%CPU (0avgtext+0avgdata 1780maxresident)k
752inputs+0outputs (3major+203minor)pagefaults 0swaps

mksh ๋Š” ๋†€๋ผ์šด ์†๋„๋ฅผ ๊ฐ€์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@pickfire fish์˜ ls ๋Š” bash๊ฐ€ ํ•˜์ง€ ์•Š๋Š” ์ถœ๋ ฅ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” Linux์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. Linux์—์„œ ์‚ฌ๊ณผ ๋Œ€ ์‚ฌ๊ณผ ๋น„๊ต๋ฅผ ์›ํ•˜๋ฉด command ls . (๋‹ค์œˆ์—์„œ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ls ๋ž˜ํผ๊ฐ€ ํ›จ์”ฌ ์–‡์Šต๋‹ˆ๋‹ค. ์ง€์ ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ๊นœ๋นกํ–ˆ์Šต๋‹ˆ๋‹ค.)

ํ…Œ์ŠคํŠธ์—์„œ mksh์˜ "์ธ์ƒ์ ์ธ ์†๋„"์— ๋Œ€ํ•œ ์„ค๋ช…์€ mksh์— ์ค‘๊ด„ํ˜ธ ํ™•์žฅ์ด ์—†์œผ๋ฏ€๋กœ ls ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ls ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด 1000๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์„ฑ๋Šฅ ์ธก์ •์ด ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ธก์ •ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค!

@ridiculousfish , ls ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ command ls ๋น„๊ตํ•˜์—ฌ ๋ฌผ๊ณ ๊ธฐ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๊นŒ? ์Šคํฌ๋ฆฝํŒ… ์ค‘์—๋Š” ์ถœ๋ ฅ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ์ด๋ฒˆ์—๋Š” ๋‹น์‹ ์ด ๋งํ•œ ๋Œ€๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

> cat test.fish
for i in (seq 1000)
    command ls > /dev/null
end
> time fish test.fish
0.66user 1.04system 0:08.08elapsed 21%CPU (0avgtext+0avgdata 4364maxresident)k
624inputs+0outputs (4major+113176minor)pagefaults 0swaps
> cat test.sh
for i in $(seq 1000) ; do
    ls > /dev/null
done
> time mksh test.sh
0.21user 0.65system 0:07.64elapsed 11%CPU (0avgtext+0avgdata 1884maxresident)k
0inputs+0outputs (0major+119632minor)pagefaults 0swaps
> time bash test.sh
0.15user 1.04system 0:08.66elapsed 13%CPU (0avgtext+0avgdata 2816maxresident)k
0inputs+0outputs (0major+150700minor)pagefaults 0swaps

๊ฒฐ๊ตญ mksh ๊ฐ€ ์—ฌ์ „ํžˆ ๊ฐ€์žฅ ๋น ๋ฅด์ง€๋งŒ ์ด์ œ fish ๊ฐ€ mksh ๋ณด๋‹ค ๋น ๋ฅด๋‹ค๋Š” ๊ฒƒ์ด ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. fish ์— ๋ณ‘๋ ฌ ๋ช…๋ น ์‹คํ–‰ ์ง€์›์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์—ˆ๋‹ค๋ฉด ๊ฐ€์žฅ ๋นจ๋ž์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

0.66 ์‚ฌ์šฉ์ž ์‹œ๊ฐ„์€ ์ƒ๋‹นํžˆ ๋†’์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ณ„์นญ ๋“ฑ์„ ์ •์˜ํ•˜๋Š” config.fish ๋‚ด์šฉ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ถ”์ธกํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ก์„ ์œ„ํ•ด ์ด๊ฒƒ์€ ๋‚ด Linux ์ƒ์ž์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐ๊ฐ 3๊ฐœ ์ค‘ ์ตœ๊ณ ).

> time fish test.fish
0.15user 1.21system 0:01.33elapsed...
> time mksh test.mksh
0.12user 1.13system 0:01.24elapsed...
> time bash test.sh
0.18user 1.34system 0:01.47elapsed...

๋ชจ๋‘๊ฐ€ ๋งค์šฐ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๋ฒค์น˜๋งˆํฌ๊ฐ€ ์ผ๋ถ€ ๊ฒฝ๋กœ ๋ช…๋ น์— ๋Œ€ํ•ด fork/exec ๋˜๋Š” posix_spawn์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ผ์ข…์˜ "oracular shell"์„ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ OS๊ฐ€ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์†๋„์—์„œ ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

@ridiculousfish , ๋‚ด config.fish๋Š” ๋งค์šฐ ์งง์Šต๋‹ˆ๋‹ค.

# Solarized colors
test $SHLVL = 2
and sh $HOME/.config/base16-shell/base16-solarized.dark.sh &
set fisher_home ~/.local/share/fisherman
set fisher_config ~/.config/fisherman
source $fisher_home/config.fish

์•„๋งˆ๋„ fisherman ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋Š๋ ค์งˆ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @bucaran ์€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ข‹์€ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” config.fish ๋น„์› ์Šต๋‹ˆ๋‹ค (5๋ฒˆ์˜ ์žฌ์‹œ๋„ ์ค‘ ์ตœ์ƒ์˜ ๊ฒฐ๊ณผ).

> time fish test.fish; time mksh test.sh; time bash test.sh
0.62user 1.09system 0:07.28elapsed 23%CPU (0avgtext+0avgdata 4396maxresident)k
0inputs+0outputs (0major+108240minor)pagefaults 0swaps
0.21user 0.62system 0:06.92elapsed 11%CPU (0avgtext+0avgdata 1888maxresident)k
0inputs+0outputs (0major+116674minor)pagefaults 0swaps
0.29user 0.81system 0:07.78elapsed 14%CPU (0avgtext+0avgdata 2780maxresident)k
0inputs+0outputs (0major+145628minor)pagefaults 0swaps

@ridiculousfish @pickfire ๋‚ด๊ฐ€ ๋‹น์‹ ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ๋ฌธ์ œ์—์„œ ์ฑ„ํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ด ๋ฌธ์ œ์— ์ŠคํŒธ์„ ๋ณด๋‚ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. @pickfire ํŠนํžˆ ํฅ๋ฏธ

bash ๋ฐ zsh ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ๊ฐœ์ธ์ ์œผ๋กœ ์™„์ „ํ•œ ํ˜ธํ™˜์„ฑ์„ ๊ธฐ๋Œ€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ˜ธํ™˜์„ฑ์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋” ์ธ๊ธฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์Šคํฌ๋ฆฝํŒ…์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋”๋ผ๋„ && ๋ฐ || ๋Š” ๋ช…๋ น์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ๋งค์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด #2292์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฌผ๊ณ ๊ธฐ ๋ฒŒ๋ ˆ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์‹ค์€ ๋ฌผ๊ณ ๊ธฐ ํ˜ธํ™˜์„ฑ์„ ๊ฐœ์„ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์—ฌ๊ธฐ maxfl๊ณผ ํ•จ๊ป˜ ์žˆ์Šต๋‹ˆ๋‹ค. :-1: || ๋ฐ && ๋ฅผ ๋ฌผ๊ณ ๊ธฐ ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ธ๊ธฐ ์žˆ๋Š” ํˆฌํ‘œ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋ฌผ๊ณ ๊ธฐ๋Š” bash(๋˜๋Š” zsh)๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. && ๋ฐ || ์…ธ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ฐ•๋ ฅํ•œ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์ƒ ์œ ์ง€์™€์˜ ํ˜ธํ™˜์„ฑ์€ ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฐ˜๋Œ€ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

@Nodd : ๋ฌธ์ œ #2292์— ๋Œ€ํ•œ ์–ธ๊ธ‰์€ ์‹ค์ œ๋กœ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ POSIX(bash, zsh ๋“ฑ) ํด๋ก ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋˜ ๋‹ค๋ฅธ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ์ง€์—ญ์˜ ๊ป์งˆ์ฒ˜๋Ÿผ ํ–‰๋™ํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๋‹ค๋ฅธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ƒ์„ฑํ•  ๋ฟ์ž…๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด fish 2.3 ์ดํ›„๋กœ ๋งˆ์นจ๋‚ด ์™„์ „ํžˆ ์ž‘๋™ํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋‹ต๋ณ€์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. PR #1633์ด ๋„์ฐฉํ•˜๋ฉด ๋‹ค์Œ์„ ๊ฐ€์ ธ์™€์„œ ~/.config/fish/functions/fish_user_key_bindings.fish์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function handle_input_bash_conditional --description 'Function used for binding to replace && and ||'
    # This function is expected to be called with a single argument of either & or |
    # The argument indicates which key was pressed to invoke this function
    if begin; commandline --search-mode; or commandline --paging-mode; end
        # search or paging mode; use normal behavior
        commandline -i $argv[1]
        return
    end
    # is our cursor positioned after a '&'/'|'?
    switch (commandline -c)[-1]
    case \*$argv[1]
        # experimentally, `commandline -t` only prints string-type tokens,
        # so it prints nothing for the background operator. We need -c as well
        # so if the cursor is after & in `&wat` it doesn't print "wat".
        if test -z (commandline -c -t)[-1]
            # Ideally we'd just emit a backspace and then insert the text
            # but injected readline functions run after any commandline modifications.
            # So instead we have to build the new commandline
            #
            # NB: We could really use some string manipulation operators and some basic math support.
            # The `math` function is actually a wrawpper around `bc` which is kind of terrible.
            # Instead we're going to use `expr`, which is a bit lighter-weight.

            # get the cursor position
            set -l count (commandline -C)
            # calculate count-1 and count+1 to give to `cut`
            set -l prefix (expr $count - 1)
            set -l suffix (expr $count + 1)
            # cut doesn't like 1-0 so we need to special-case that
            set -l cutlist 1-$prefix,$suffix-
            if test "$prefix" = 0
                set cutlist $suffix-
            end
            commandline (commandline | cut -c $cutlist)
            commandline -C $prefix
            if test $argv[1] = '&'
                commandline -i '; and '
            else
                commandline -i '; or '
            end
            return
        end
    end
    # no special behavior, insert the character
    commandline -i $argv[1]
end

function fish_user_key_bindings
    bind \& 'handle_input_bash_conditional \&'
    bind \| 'handle_input_bash_conditional \|'
end

@Globegitter

๊ทธ๋ƒฅ ์–ด์ฉŒ์ง€?

function sudo_bang_bang --on-event fish_postexec
    abbr !! sudo $argv[1]
end

@brj ๋˜ํ•œ ~/.config/fish/functions/fish_user_key_bindings.fish ๋„ฃ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ํŠธ๋ฆญ์„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์†Œ์‹ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ต์…˜์€ config.fish์— ๋„ฃ๊ฑฐ๋‚˜ ~/.conf.d/[name-dont-matter].fish์— ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@brj : ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ "!!"๊ฐ€ ์•„๋‹ˆ๋ผ "&&" ๋ฐ "||"์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. - ๋‹ค๋ฅธ ๊ฒƒ๋“ค.

@faho lol, ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ•ญ์ƒ ๊ทธ ๋ฌธ์ œ์—์„œ ์•Œ๋ฆผ์„ ๋ฐ›์•„ ์ด๊ฒƒ์ด sudo์˜ ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค !!.

@Globegitter ํ˜ผ๋ž€์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

์‚ฌ์šฉ์ž๊ฐ€ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ˆ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ฌผ๊ณ ๊ธฐ์™€ ํ•จ๊ป˜ ๋ฐฐ์†กํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‰ฝ๊ฒŒ ์ฆ๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์…ธ(unix-y ์…ธ ์™ธ์— Windows cmd.exe ํฌํ•จ)์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— &&๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๋™์ผํ•œ ๋ผ์ด๋„ˆ(gerrit ์ฝ”๋“œ ๊ฒ€ํ† ์—์„œ)๋ฅผ ๊ณ„์† ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค(๋‚˜๋Š” ์ž ์‹œ ๋™์•ˆ bash -c "paste here"๋ฅผ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค...).

&&๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”? ํ•ด์ƒ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ์ธ๋ฐ ์ •๋ง ๋ฐฉ๋ฒ•์ด ์—†๋„ค์š”

gcc test2.c -o a.out && ./a.out

๋ฌผ๊ณ ๊ธฐ์—์„œ.

gcc test2.c -o a.out; and ./a.out

@ivan ์€ ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ "and"์™€ "./a.out"์„ gcc์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

//ํŽธ์ง‘: ๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ , ๋‚˜๋Š” bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ ๋ฌผ๊ณ ๊ธฐ์—์„œ ์™„์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค :(

gcc test2.c -lwlc -o a.out && (( sleep 2s; DISPLAY=:2 xterm ) & ./a.out)

๋‚˜๋Š” ์ด "์™„์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•œ" ์ผ์„ ์•„์ฃผ ์ž์ฃผ ํ•œ๋‹ค. ๊นจ๋—ํ•œ ๋ฌผ๊ณ ๊ธฐ ํ™˜๊ฒฝ์—์„œ ; and ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๊นŒ? ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์„ธ๋ฏธ์ฝœ๋ก ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ๋ฌผ๊ณ ๊ธฐ์— ์ž…๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@ivan ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์–ด๋ฆฌ์„์€ ์งˆ๋ฌธ์— ์ฃ„์†กํ•˜์ง€๋งŒ ๊ด„ํ˜ธ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”? ๋ฌธ์„œ์—์„œ ๊ทธ์— ๋Œ€ํ•œ ๋‹จ์–ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉฐ ์ •ํ™•ํžˆ Google ๊ฐ€๋Šฅํ•œ ์ฃผ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

gcc test2.c -lwlc -o a.out && (( sleep 2s; DISPLAY=:2 xterm ) & ./a.out)

@kozec ์—ฌ๊ธฐ์—์„œ ํ•ญ๋ชฉ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์™ผ์ชฝ ์ค‘๊ด„ํ˜ธ์™€ ๊ฐ™์€ begin ์ด๊ณ (์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค) ์˜ค๋ฅธ์ชฝ ์ค‘๊ด„ํ˜ธ์™€ ๊ฐ™์€ end ์ž…๋‹ˆ๋‹ค.

gcc test2.c -lwlc -o a.out; and begin sleep 2s; env DISPLAY=:2 xterm; end & ./a.out

๋˜๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ:

      gcc test2.c -lwlc -o a.out
         and begin sleep 2s
             env DISPLAY=:2 xterm
         end & ./a.out

@floam ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ & ์ด์ „์˜ ๊ฒƒ๋“ค์€ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ณด๋‚ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค :(

์ตœ์†Œํ•œ์˜ ์˜ˆ:

begin sleep 2s ; env DISPLAY=:2 xterm ; end & Xephyr :2

2์ดˆ ํ›„์— xterm์„ ์‹œ์ž‘ํ•˜๊ณ  _๊ทธ๋•Œ_ ํ•ด๋‹น xterm์— ๋Œ€ํ•ด XServer๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. XServer๊ฐ€ ์ค€๋น„๋˜๊ธฐ ์ „์— xterm of๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

์•„, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ: https://github.com/fish-shell/fish-shell/issues/238

๋‹น์‹ ์€ ๋‹น์‹ ์ด ํ•ด์•ผ ํ•˜๋Š” ๊ณณ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

fish -c 'sleep 2s; env DISPLAY=:2 xterm' & Xephyr :2

๋งŽ์€ ์–‘์˜ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ, ๋นŒ๋“œ ๋ฐ npm ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ผ๋ถ€/๋Œ€๋ถ€๋ถ„์ด ๋ฌผ๊ณ ๊ธฐ์— ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. shebang์ด ์žˆ๋Š” ์ผ๋ฐ˜ bash ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ ๋ฌผ๋ก  ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

&&์˜ ์ข‹์€(๋˜๋Š” "์ข‹์€") ์ ์€ Linux ๋ฐ Mac๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Windows์—์„œ๋„ ์ผ๋ฐ˜ ์…ธ์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋“ฑ์˜ ๋น ๋ฅธ ์„ค์ •์— ์ข‹์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ๋“  ๊ฑฐ๋ž˜ ์ฐจ๋‹จ๊ธฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ ๋„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ์ด๊ฒƒ์€ ๋‹ค์†Œ ์–ด๋ฆฌ์„์€ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ๋ฌผ๊ณ ๊ธฐ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ "๋ชจ๋“œ"๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฆ‰, "์ˆœ์ˆ˜ํ•œ" ์ƒ์„  ์žฌ๋ฃŒ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์„ค์ • ๋˜๋Š” ์ƒ์„  ํŠน์ง•๊ณผ ํ•จ๊ป˜ bash์™€ ๊ฐ™์€ ๊ป์งˆ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ์„ค์ •์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‰˜์— ๋Œ€ํ•ด ๋‹ค๋ฅธ "์ˆ˜์ค€"์˜ ํ˜ธํ™˜์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์™„์ „ํ•œ ํ˜ธํ™˜์„ฑ, ํ˜ธํ™˜์„ฑ ์—†์Œ ๋˜๋Š” ๊ทธ ์‚ฌ์ด์˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๊ธฐ๋ณธ ์ˆ˜์ค€์—์„œ ์ตœ์†Œํ•œ ์ด๋ฅผ ์œ„ํ•ด ์ผ์ข…์˜ ์†Œ์Šค ๋Œ€ ์†Œ์Šค ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” bash ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฌผ๊ณ ๊ธฐ์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ์ค‘๊ฐ„ ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๋ฒˆ์—ญ์„ ์œ„ํ•ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•˜์ง€๋งŒ bash et al. ๋ฌผ๊ณ ๊ธฐ ๋Œ€ ๋ฌผ๊ณ ๊ธฐ๋Š” ์„ธ๊ณ„๋ฅผ ๋’คํ”๋“ค ์ •๋„๋กœ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์–ด์จŒ๋“ , ์ด๊ฒƒ์€ ๋‹ค์Œ์„ ์ „์ œ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ์–ด๋ฆฌ์„์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ œ 0.02๋‹ฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.

"pure fish"
XOR
"compatibility with bash / becoming another bash clone"

์ด ๋‘ ๊ฐœ๋… ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ง€์ ์„ ๊ฐ–๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์ด ์—†์„ ๋•Œ.

์ตœ์†Œํ•œ bash์™€ ๊ฐ™์€ ์กฐ๊ฐœ๋Š” ๋ฌผ๊ณ ๊ธฐ์™€ ๊ฐ™์€ ๋‚œํ•ดํ•œ ์กฐ๊ฐœ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํ‘œ์ค€์ ์ด๊ณ  ๋Œ€์ค‘์ ์ด๋ผ๋Š” ํ˜„์‹ค์„ ์ง์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - ๋„๋ฆฌ ๋ณด๊ธ‰๋˜๊ณ  ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ bash์™€ ๋Œ€๋“ฑํ•ฉ๋‹ˆ๋‹ค.

...์ด ๋‘ ๊ฐœ๋… ์‚ฌ์ด์— ์ค‘๊ฐ„ ์ง€์ ์„ ๊ฐ–๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์ด ์—†์„ ๋•Œ.

ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ 2,000์‹œ๊ฐ„(1์ธ 1๋…„) ์ด์ƒ ํˆฌ์žํ•˜๋Š” ์‚ฌ๋žŒ(๋˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ทธ๋ฃน) ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด @ylluminarious ๋‹˜์˜ pull-request๋ฅผ ๊ฒ€ํ† ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ ์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Python๋„ PHP๋ฅผ ํ•ด์„ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์—†๋Š”์ง€ ๋ฌป๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€๋‹ต์€ ์ด๋ก ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธํ™˜์„ฑ ์Šค์œ„์น˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

#4620์—์„œ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰