Fish-shell: {x,y,z} λ§€κ°œλ³€μˆ˜ ν™•μž₯이 μ΄μŠ€μΌ€μ΄ν”„λ˜μ§€ μ•ŠμŒ

에 λ§Œλ“  2017λ…„ 12μ›” 30일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: fish-shell/fish-shell

λ¬Όκ³ κΈ° λ§€κ°œλ³€μˆ˜λŠ” 일반적으둜 λ¬Όκ³ κΈ° λͺ…령에 μ£Όμž…λ˜κΈ° 전에 μ΄μŠ€μΌ€μ΄ν”„λ©λ‹ˆλ‹€.

mqudsi@freebsd> echo hello > hello\ world.txt
mqudsi@freebsd> file (echo hello world.txt)
hello world.txt: ASCII text

κ·ΈλŸ¬λ‚˜ μ€‘κ΄„ν˜Έ ν™•μž₯의 κ²°κ³ΌλŠ” μ˜¬λ°”λ₯΄κ²Œ μ΄μŠ€μΌ€μ΄ν”„λ˜μ§€ μ•ŠμœΌλ©° _그리고_ λ§€κ°œλ³€μˆ˜ μ£Όμœ„μ— λ”°μ˜΄ν‘œλ₯Ό λ„μž…ν•˜λ©΄ ν™•μž₯이 μ€‘λ‹¨λ˜λ―€λ‘œ μˆ˜λ™μœΌλ‘œ μ΄μŠ€μΌ€μ΄ν”„ν•˜λŠ” μ‰¬μš΄ 방법이 μ—†μŠ΅λ‹ˆλ‹€.

mqudsi@freebsd> echo -n hello\ {1,2,3}.txt\n
hello 1.txt
 hello 2.txt
 hello 3.txt

λ³΄μ‹œλ‹€μ‹œν”Ό 첫 번째 λ§€κ°œλ³€μˆ˜ λ‹€μŒμ— echo 두 개의 κ°œλ³„ 인수 hello 및 #.txt κ°€ μ „λ‹¬λ˜μ–΄ 단어 μ•žμ— μΆ”κ°€ 곡백이 μƒκΉλ‹ˆλ‹€.

인수λ₯Ό λ”°μ˜΄ν‘œλ‘œ 묢으면 λ‹€μŒμ΄ λ°œμƒν•©λ‹ˆλ‹€.

mqudsi@freebsd> echo -n "hello\ {1,2,3}.txt\n"
hello\ {1,2,3}.txt\n

μ΄μŠ€μΌ€μ΄ν”„λœ λ”°μ˜΄ν‘œλ₯Ό μ›λž˜ λ¬Έμžμ—΄μ— μ‚½μž…ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” λ™μ•ˆ(λ¬Έμžμ—΄ λ‚΄μš©μ΄ ꡐ체 ν›„ 및 μ‚½μž… 전에 μ΄μŠ€μΌ€μ΄ν”„λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ°€μ •ν•˜μ—) λ”°μ˜΄ν‘œκ°€ μ˜¬λ°”λ₯΄κ²Œ μ΄μŠ€μΌ€μ΄ν”„λ˜μ–΄ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

mqudsi@freebsd> echo -n \"hello\ {1,2,3}.txt\n\"                                                                                                     "hello 1.txt                                                                                                                                                       " "hello 2.txt                                                                                                                                                     " "hello 3.txt                                                                                                                                                     
"

인수 λΆ„ν•  단계 이후에 λ§€κ°œλ³€μˆ˜ ν™•μž₯이 μΌμ–΄λ‚˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

question

λͺ¨λ“  3 λŒ“κΈ€

echo 두 개의 별도 인수 hello 및 #.txtκ°€ μ „λ‹¬λ˜μ–΄ 단어 μ•žμ— μΆ”κ°€ 곡백이 μƒκΉλ‹ˆλ‹€.

λ‚˜λŠ” κ·Έ 진단에 λ™μ˜ν•˜μ§€ μ•ŠλŠ”λ‹€. echo μ—λŠ” 3개의 인수(각각 \n 끝남)κ°€ μ „λ‹¬λ˜κ³  있으며, echo 사이에 곡백이 ν¬ν•¨λ˜μ–΄ μΆ©μ‹€ν•˜κ²Œ μΈμ‡„λ©λ‹ˆλ‹€. 여기에 버그가 μ—†μŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ 인수λ₯Ό λ””λ²„κ·Έν•˜κΈ° μœ„ν•΄ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μž…λ‹ˆλ‹€.

~> printf 'Β«%sΒ»' hei\ {1,2,3}.txt\n
Β«hei 1.txt
»«hei 2.txt
»«hei 3.txt
»⏎

λ‹€μŒμ€ 인수λ₯Ό λ””λ²„κ·Έν•˜κΈ° μœ„ν•΄ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μž…λ‹ˆλ‹€.

λ‚˜λŠ” string escape , 즉

> string escape -- hello\ {1,2,3}.txt\n
hello\ 1.txt\n
hello\ 2.txt\n
hello\ 3.txt\n

즉, μ‹€μ œλ‘œ λ‚΄κ°€ κΈ°λŒ€ν•˜λŠ” 것을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. "1"둜 전체 인수λ₯Ό 얻은 λ‹€μŒ "2"둜, 그리고 "3"으둜 전체 인수λ₯Ό μ–»μŠ΅λ‹ˆλ‹€. 전체 μΈμˆ˜μ—λŠ” κ°œν–‰μ΄ ν¬ν•¨λ©λ‹ˆλ‹€.

@mqudsi : μ—¬κΈ°μ„œ 당신을

  • μš°λ¦¬λŠ” 쀄 λ°”κΏˆμ—μ„œ λͺ…λ Ή λŒ€μ²΄( (command) )만 λΆ„ν• ν•©λ‹ˆλ‹€. 즉, μ—¬κΈ°μ„œ \n λŠ” κ°œν–‰ 문자둜 λŒ€μ²΄λœ ν›„ νŠΉλ³„ν•œ μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. λ‚˜λ¨Έμ§€λŠ” "캐릭터"μž…λ‹ˆλ‹€. 캐릭터λ₯Ό _μ΄μŠ€μΌ€μ΄ν”„_ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. 뢄할을 μ‹€ν–‰ν•˜μ§€ μ•ŠκΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ˜λŠ” file (echo hello world.txt) μ—μ„œ "hello world.txt" λŠ” hello\ world.txt _is not_ μ΄μŠ€μΌ€μ΄ν”„λ˜μ§€ μ•ŠμœΌλ©°, κ°œν–‰μ΄ μ—†κΈ° λ•Œλ¬Έμ— λΆ„ν• λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. hello\nworld.txt λΌλŠ” 파일이 있으면 bash의 곡백 λ¬Έμ œμ™€ μœ μ‚¬ν•œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

  • echo λŠ” 인수 사이에 곡백을 μ‚½μž…ν•©λ‹ˆλ‹€("-s"κ°€ μ§€μ •λ˜μ§€ μ•Šμ€ 경우). 이것이 μ΄μƒν•œ λ“€μ—¬μ“°κΈ°λ₯Ό μΌμœΌν‚€λŠ” μ›μΈμž…λ‹ˆλ‹€. 곡백이 κ°œν–‰ λ°”λ‘œ 뒀에 λ°œμƒν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

즉, 좜λ ₯을 원할 경우

hello 1.txt
hello 2.txt
hello 3.txt

echo -s λ˜λŠ” printf '%s\n' hello\ {1,2,3}.txt .

λ‚˜λŠ” 이것이 버그가 μ•„λ‹ˆλΌ μ˜€ν•΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€. μ œκ°€ λ§žμŠ΅λ‹ˆκΉŒ?

μ£„μ†‘ν•©λ‹ˆλ‹€, μ—¬λŸ¬λΆ„! λ‚˜λŠ” λ¬Έμ œμ— λŒ€ν•œ μ΅œμ†Œν•œμ˜ μž¬ν˜„μ„ μ‹œλ„ν•˜κ³  μžˆμ—ˆκ³  μ™„μ „νžˆ λ‹€λ₯Έ 것에 μ˜ν•΄ ν˜Όλž€μŠ€λŸ¬μ›Œν–ˆμŠ΅λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜ ν™•μž₯ λ™μž‘μ΄ 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 특히 parallel λ˜λŠ” xargs 와 1의 μ œν•œμ΄ μžˆλŠ” 것과 ν˜Όλ™ν–ˆμŠ΅λ‹ˆλ‹€. 즉, echo {1,2,3} κ°€ 3으둜 ν™•μž₯될 것이라고 κ°€μ •

λ°”λ‘œμž‘μ•„μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰