Fish-shell: κΈ°λŠ₯에 νŒŒμ΄ν”„λ₯Ό 읽을 수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2012λ…„ 07μ›” 05일  Β·  21μ½”λ©˜νŠΈ  Β·  좜처: fish-shell/fish-shell

ν…ŒμŠ€νŠΈ:

function testfun
    set input (cat)
    echo $input
end

echo testing123 | testfun

"testing123"을 좜λ ₯ν•΄μ•Όν•˜μ§€λ§Œ 아무것도 μƒμ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

bashμ—μ„œ μ™„λ²½ν•˜κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

function testfun
{
    input="$(cat)"
    echo $input
}

echo testing123 | testfun

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 λ¬Έμ œλŠ” grep λŒ€ν•œ κΈ°λ³Έ grep ν•¨μˆ˜μ™€ κ²°ν•©λ˜μ–΄ λͺ‡ 가지 λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.이 λ¬Έμ œκ°€ 곧 ν•΄κ²°λ˜μ§€ μ•Šμ„ 경우 κΈ°λ³Έ grep 별칭을 μ œκ±°ν•΄μ•Όν•©λ‹ˆλ‹€ (λ˜λŠ” 적어도 λ°œμƒμ„ μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ μ•½μ–΄μΌκΉŒμš”?).

@milieuκ°€ μ•”μ‹œν•˜λŠ” κ²ƒμ²˜λŸΌ cat λ₯Ό μ‚¬μš©ν•˜λ©΄ Fish 2.3.1μ—μ„œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ (방금 κΉ¨λ‹¬μ•˜μ§€λ§Œ Fedora 25 용 νŒ¨ν‚€μ§€ λ²„μ „μž…λ‹ˆλ‹€).

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

ν•΄κ²° λ°©λ²•μœΌλ‘œ '읽기'κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

function t
    while read -l line
        echo $line
    end
end

λ‚˜λŠ” stdin이 'cat'λŒ€μ‹  'set'으둜 νŒŒμ΄ν”„λ˜κΈ° λ•Œλ¬Έμ— λ¬Όκ³ κΈ°μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” νŠΉμ • λ°©μ‹μœΌλ‘œ μž‘λ™ν•˜λŠ” "μ„€μ •"보닀 더 κΉŠμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜μ— λŒ€ν•œ 배관이 μ „ν˜€ λ§κ°€μ‘ŒμŠ΅λ‹ˆλ‹€. 그리고 ν•¨μˆ˜λ‘œ 전솑 된 터미널 I / OλŠ” μž‘λ™ν•˜μ§€λ§Œ μ—¬μ „νžˆ μ•½κ°„ μ΄μƒν•©λ‹ˆλ‹€. μž…λ ₯을 λ²„νΌλ§ν•˜κ³  ν•œ λ²ˆμ— λͺ¨λ‘ μ „λ‹¬ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. 이 ν•¨μˆ˜μ—μ„œ μ–΄λ–€ 일이 λ°œμƒν•˜λŠ”μ§€ κ΄€μ°°ν•˜μ‹­μ‹œμ˜€.

~> function meh
       cat
   end
~> # First, the way it's supposed to work.
~> # As input, we press the keys: a RET b RET control-D
~> cat
a
a
b
b
~> cat | cat
a
a
b
b
~> # Now...
~> meh
a
a
b
b
~> # So far so good, but...
~> cat | meh
a
b
^D
... um...
^D
control-D repeatedly does not work
try control-C
Job 1, β€œcat | meh” has stopped
~> fg
Send job 1, β€œcat | meh” to foreground
cat: stdin: Interrupted system call
~> jobs
jobs: There are no jobs
~> # Dear lord.
~> # For completeness...
~> meh | cat
a
b
aD
b
~> 

λ˜ν•œ cat | meh | cat λŠ” cat | begin; cat; end 와 같은 λ°©μ‹μœΌλ‘œ μž‘λ™ν•©λ‹ˆλ‹€.
cat | meh μ—μ„œ 쀑단 된 μ‹œμŠ€ν…œ ν˜ΈμΆœμ— λŒ€ν•΄ λΆˆν‰ν•˜λŠ” "고양이"κ°€ 첫 번째 "고양이"라고 더 말할 수 μžˆμŠ΅λ‹ˆλ‹€. 그건:

~> cp /bin/cat mycat
~> ./mycat | meh
Job 1, β€œ./mycat | meh” has stopped  #after control-C
~> fg
Send job 1, β€œ./mycat | meh” to foreground
mycat: stdin: Interrupted system call

κ·Έλž˜μ„œ 거기에 μžˆμŠ΅λ‹ˆλ‹€. λΆ„λͺ…νžˆ 이것은 λ¬Όκ³ κΈ°κ°€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법과 νŒŒμ΄ν”„λ₯Ό κ΅¬μ„±ν•˜λŠ” 방법과 관련이 μžˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅¬λ“ μ§€ 이것에 λŒ€ν•΄ μ•Œκ³  μžˆμŠ΅λ‹ˆκΉŒ?

μ’‹μ•„, λ‚˜λŠ” κ·Έ 싀행을 μ°Ύκ³ μžˆλ‹€.
pbpaste | begin; cat; end
클립 λ³΄λ“œκ°€ "23n"인 μ‹ μ„ ν•œ 생선 κ»λ°κΈ°μ—μ„œ λ°˜λ³΅ν•΄μ„œ 23 λ²ˆμ„ λ‹€μ‹œ μΈμ‡„ν•˜κ³  λ•Œλ‘œλŠ” 셸이 잠기 κ²Œν•˜μ—¬ control-Cκ°€ 아무것도 ν•  μˆ˜μ—†λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것이 μΌμ’…μ˜ 경쟁 μ‘°κ±΄μ΄μ–΄μ•Όν•œλ‹€κ³  μƒκ°ν•œλ‹€. 였 μ†Œλ…„.

ν•œνŽΈ, SIGTTIN μ‹ ν˜Έκ°€ ./mycat | begin; cat; end 의 "mycat"으둜 전솑 된 κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

     21    SIGTTIN      stop process         background read attempted from
                                             control terminal

그런 λ‹€μŒ GNU libc μ„€λͺ…μ„œμ— λ”°λ₯΄λ©΄ "λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μœΌλ‘œ 싀행쀑인 ν”„λ‘œμ„ΈμŠ€λŠ” μ‚¬μš©μžμ˜ ν„°λ―Έλ„μ—μ„œ 읽을 수 μ—†μŠ΅λ‹ˆλ‹€. λ°±κ·ΈλΌμš΄λ“œ μž‘μ—…μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ ν„°λ―Έλ„μ—μ„œ μ½μœΌλ €κ³ ν•˜λ©΄ μž‘μ—…μ˜ λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€κ°€ μ „μ†‘λ©λ‹ˆλ‹€. SIGTTIN μ‹ ν˜Έ. "

λ”°λΌμ„œ "mycat"이 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹œμž‘λ˜κ±°λ‚˜ μ‹œμž‘λœ λ‹€μŒ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ λ°°μΉ˜λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. 피쉬 ν•¨μˆ˜ μ’…λ₯˜λ‘œ νŒŒμ΄ν”„κ°€ 연결될 λ•Œμž…λ‹ˆλ‹€. μ•„λ§ˆλ„μ΄ 지식이 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

이것은 λΆ„λͺ…νžˆ νŒŒμ΄ν”„μ˜ μ–‘μͺ½μ„ λ°°κ²½μœΌλ‘œν•©λ‹ˆλ‹€.ν•˜μ§€λ§Œ fg λͺ…령을 내리면 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ Έ μ™€μ„œ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜λ„λ‘ν•©λ‹ˆλ‹€.

~ $ alias pjson='python -m json.tool | pygmentize -l json'
~ $ curl -u smoku -X GET -H "Content-Type: application/json" 'https://jira.......' | pjson
Job 4, 'curl -u smoku -X GET…' has stopped
~ $ fg
Enter host password for user 'smoku': ********
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   593    0   593    0     0   1372      0 --:--:-- --:--:-- --:--:--  1375
~ $ fg
{
    "expand": "renderedFields,names,schema,transitions,operations,editmeta,changelog",
    "id": "29874"
}

κ°„λ‹¨ν•œ 별칭 λŒ€μ‹  $PATH μ—μ„œ pjson 래퍼 슀크립트λ₯Ό λ§Œλ“€μ–΄μ•Όν•˜λŠ” μ•½κ°„ μ„±κ°€μ‹  ... :(

참고둜 이것은 λ˜ν•œ openSUSE λ²„κ·Έμž…λ‹ˆλ‹€ https://bugzilla.opensuse.org/show_bug.cgi?id=963548

예이! ν•΄κ²° 방법을 찾은 것 κ°™μŠ΅λ‹ˆλ‹€! fish piping ꡬ문을 μ„€λͺ…ν•˜λŠ” 문제 # 110의 gustafj의 의견 덕뢄에 λ‹€μŒκ³Ό 같은 κ²°κ³Όλ₯Ό

function line --argument-names n
    cat 1>| tail -n +$n | head -1
end

이 λ¬Έμ œλŠ” grep λŒ€ν•œ κΈ°λ³Έ grep ν•¨μˆ˜μ™€ κ²°ν•©λ˜μ–΄ λͺ‡ 가지 λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.이 λ¬Έμ œκ°€ 곧 ν•΄κ²°λ˜μ§€ μ•Šμ„ 경우 κΈ°λ³Έ grep 별칭을 μ œκ±°ν•΄μ•Όν•©λ‹ˆλ‹€ (λ˜λŠ” 적어도 λ°œμƒμ„ μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ μ•½μ–΄μΌκΉŒμš”?).

@milieuκ°€ μ•”μ‹œν•˜λŠ” κ²ƒμ²˜λŸΌ cat λ₯Ό μ‚¬μš©ν•˜λ©΄ Fish 2.3.1μ—μ„œ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€ (방금 κΉ¨λ‹¬μ•˜μ§€λ§Œ Fedora 25 용 νŒ¨ν‚€μ§€ λ²„μ „μž…λ‹ˆλ‹€).

μ…Έ λ‚΄μ—μ„œμ™€ λͺ…λ Ή μ€„μ—μ„œ μ‹€ν–‰ν•˜λŠ” 데 μ°¨μ΄κ°€μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

(zsh)$ ./fish -c "read n | grep nothing"    
read> lol
(zsh)$ ./fish
(fish)$ read n | grep nothing
read> 
# Stuck forever, needs to kill the terminal. ^C, ^Z have no impact.

문제λ₯Ό λ””λ²„κ·Έν•˜λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆκΉŒ?

@layus : μ•„λ‹ˆμš”, 그것은 # 3805, λ¬Όκ³ κΈ° μžμ²΄κ°€ 터미널을 μ œμ–΄ ν•  μˆ˜μ—†λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

_이 μ μ—μ„œ μ›λž˜ λ™μž‘ 쀑 일뢀가 λ³€κ²½λœ 것 κ°™μŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” fish master / 3.0에 λŒ€ν•œ κ²ƒμž…λ‹ˆλ‹€.

λ¬Όκ³ κΈ°κ°€ μ—¬κΈ°μ„œ 잘λͺ»λ˜λŠ” 두 가지 근본적인 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 첫 λ²ˆμ§ΈλŠ” 버퍼링 ν•¨μˆ˜ / 블둝 좜λ ₯ (ν˜„λŒ€ μ‰˜μ€ 아무 데도 λ²„νΌλ§ν•˜μ§€ μ•Šμ„ κ²ƒμž„)이고 두 λ²ˆμ§ΈλŠ” 블둝 μ „μ²΄μ—μ„œ μž…λ ₯ / 좜λ ₯을 μ˜¬λ°”λ₯΄κ²Œ μ—°κ²°ν•  수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 일뢀 μ½”λ„ˆ μΌ€μ΄μŠ€μ—μ„œ μ˜¬λ°”λ₯Έ 행동이 μ–΄λ–€ λͺ¨μŠ΅μ΄μ–΄μ•Όν•˜λŠ”지에 λŒ€ν•΄ λ§Žμ€ λͺ¨ν˜Έν•¨ (λ˜λŠ” μ΅œμ†Œν•œ 의견 차이λ₯Ό 수용 ν•  μˆ˜μžˆλŠ” 여지가 있음)이 μžˆμ§€λ§Œ, ν˜„μž¬ λ¬Όκ³ κΈ°κ°€ 졜적 인 κ²ƒμœΌλ‘œ μ˜Ήν˜Έν•˜λŠ” μ‚¬λžŒμ€ 아무도 μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

일반적으둜 μ™ΈλΆ€ λͺ…λ Ή (및 λŒ€μ²΄λ‘œ λ™μΌν•œ λ°©μ‹μœΌλ‘œ 효과적으둜 μ²˜λ¦¬λ˜λŠ” λ‚΄μž₯)이 μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜μ˜ μž…λ ₯, 두 개의 좜λ ₯, 그쀑 ν•˜λ‚˜λŠ” 후속 λͺ…령에 연결될 수 있고 λ‹€λ₯Έ ν•˜λ‚˜λŠ” λ¦¬λ””λ ‰μ…˜λ˜μ–΄μ•Όν•©λ‹ˆλ‹€. 파일 λ˜λŠ” tty. κ·ΈλŸ¬λ‚˜ 블둝과 ν•¨μˆ˜λŠ” 기본적으둜 μž…λ ₯ (ν•˜λ‚˜λ§Œμžˆμ„ 수 있기 λ•Œλ¬Έμ—)을 일련의 (κ²°κ΅­ ν™•μž₯λ˜λŠ”) μ™ΈλΆ€ λͺ…λ Ήμ΄λ‚˜ λ‚΄μž₯에 λ§€ν•‘ν•˜κΈ° λ•Œλ¬Έμ— κΉŒλ‹€ λ‘­μŠ΅λ‹ˆλ‹€.

즉, ν˜„μž¬ 행동이 잘λͺ»λ˜μ—ˆλ‹€λŠ” 데 λ™μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (cat) λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” λͺ…λ ΉμœΌλ‘œ νŒŒμ΄ν”„ 된 데이터λ₯Ό μ½μ–΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. :

mqudsi<strong i="11">@ZBook</strong> /m/c/U/m/Documents> type testfun
testfun is a function with definition
function testfun
    set input (cat)
    printf "You said '%s'\n" $input
end
mqudsi<strong i="12">@ZBook</strong> ~/r/fish-shell> echo testing123 | testfun
hello
^D
You said 'hello'

μ„ΈνŠΈκ°€ μž…λ ₯을 μ†ŒλΉ„ν•˜λŠ”μ§€, μž…λ ₯의 일뢀λ₯Ό μ†ŒλΉ„ν•˜λŠ”μ§€ λ˜λŠ” μž…λ ₯을 μ™„μ „νžˆ λ¬΄μ‹œν•˜λŠ”μ§€μ— 관계없이 μž…λ ₯을 λΈ”λ‘μœΌλ‘œ νŒŒμ΄ν”„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. cat은 μž…λ ₯을 μœ„ν•΄ /dev/tty 에 μ—°κ²°ν•˜λŠ” 것이 μ •ν™•ν•©λ‹ˆλ‹€. λͺ…λ Ή μ€„λ‘œ λŒ€μ²΄ν•˜κΈ°μœ„ν•œ μ…Έ. 사싀,이 μ €μž₯μ†Œμ— λŒ€ν•΄ λͺ‡ 가지 μˆ˜μ€€μ˜ κ°„μ ‘μ μœΌλ‘œ 싀행될 λ•Œ "μ„œλΈŒ μ‰˜"이 ν„°λ―Έλ„μ—μ„œ 읽지 μ•ŠλŠ” κ²½μš°μ— λŒ€ν•΄ λΆˆν‰ν•˜λŠ” 버그가 (λ§Žμ€) μ œμΆœλ˜μ—ˆμŠ΅λ‹ˆλ‹€. IMHO, 특히 bashκ°€ μ‹€μ œ μ„œλΈŒ μ‰˜μ„ μ§€μ›ν•˜κ³  μ—¬κΈ°μ—μ„œ 비동기 성을 μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ— μ—¬κΈ°μ—μ„œ 깨진 것은 bashμž…λ‹ˆλ‹€.

λ‚΄κ°€ λ§ν•˜λŠ” μœ μΌν•œ 깨진 λ™μž‘μ€ μ™ΈλΆ€ λͺ…령이 ν•¨μˆ˜ / λΈ”λ‘μ—μ„œ μ‹œμž‘λ˜κ³  μž…λ ₯을 μ™„μ „νžˆ μ†ŒλΉ„ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ—μ„œ λΉ„λ‘―λ©λ‹ˆλ‹€.

mqudsi<strong i="19">@ZBook</strong> /m/c/U/m/r/fish-shell> printf 'foo\nbar\n' | begin
                                        head -n1 | read -l line1
                                        head -n2 | read -l line2
                                        echo line1: $line1
                                        echo line2: $line2
                                    end
line1: foo
line2:

TBH λ‚˜λŠ” 맀우 λ†€λžμ§€ 만 이것은 μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•©λ‹ˆλ‹€.

mqudsi<strong i="23">@ZBook</strong> /m/c/U/m/r/fish-shell> printf 'foo\nbar\n' | begin
                                        /bin/echo 'hi from echo'
                                        cat | read -z from_cat
                                        printf 'from_cat: "%s"' $from_cat
                                    end
hi from echo
from_cat: "foo
bar
"ΒΆ  

그리고 이것은 λ˜ν•œ μ •ν™•ν•©λ‹ˆλ‹€.

mqudsi<strong i="27">@ZBook</strong> /m/c/U/m/r/fish-shell> printf 'foo\nbar\n' | begin
                                        cat | read -zl from_cat1
                                        cat | read -zl from_cat2
                                        printf 'from_cat1: "%s"\n' $from_cat1
                                        printf 'from_cat2: "%s"\n' $from_cat2
                                    end
from_cat1: "foo
bar
"
from_cat2: ""

특히 μ–Έμ  κ°€ 비동기 μ‹€ν–‰μœΌλ‘œ 물고기에 μ‹€μ œ μ„œλΈŒ μ‰˜μ„ λ„μž… ν•  κ³„νšμ„ κ³ λ €ν•  λ•Œ 여기에보고 된 μ›λž˜ 사둀에 λŒ€ν•œ 물고기의 행동이 μ •ν™•ν•˜λ‹€κ³  말할 수 μžˆμŠ΅λ‹ˆλ‹€. 사싀, λ‚˜λŠ” λˆ„κ΅°κ°€κ°€ λ°˜λŒ€ν•˜κ³  μ—¬κΈ°μ—μ„œ 섀득λ ₯μžˆλŠ” μ£Όμž₯을 ν•  μˆ˜μ—†λŠ” ν•œμ΄ 문제λ₯Ό μ™„μ „νžˆ μ’…κ²°ν•˜κ³ μžν•©λ‹ˆλ‹€.

μ›λž˜ 버그 λ³΄κ³ μ„œλŠ” μœ νš¨ν•˜μ§€ μ•Šμ§€λ§Œ @waterhouseμ—μ„œ 제기 ν•œ λ¬Έμ œλŠ” cat | meh 사둀λ₯Ό ν¬ν•¨ν•˜μ—¬ # 5219κ°€ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κ²ƒμœΌλ‘œ λ³΄μΈλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

mqudsi<strong i="8">@ZBook</strong> ~/r/fish-shell> cat | meh
a
a
b
b
^D
mqudsi<strong i="9">@ZBook</strong> ~/r/fish-shell>

즉, ν˜„μž¬ 행동이 잘λͺ»λ˜μ—ˆλ‹€λŠ” 데 λ™μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (cat) λ‚΄μ—μ„œ μ‹€ν–‰λ˜λŠ” λͺ…령에 νŒŒμ΄ν”„ 된 데이터λ₯Ό μ½μ–΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€. :

λ‚˜λŠ” 그것에 λŒ€ν•΄ 맀우 λ™μ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!

cat은 μž…λ ₯을 μœ„ν•΄ / dev / tty에 μ—°κ²°ν•˜λŠ” 것이 μ •ν™•ν•©λ‹ˆλ‹€.

그것은 λ©˜νƒˆ λͺ¨λΈμ˜ λ¬Έμ œμž…λ‹ˆλ‹€. λ‚˜λŠ” cat이 μž…λ ₯을 μœ„ν•΄ "ν˜„μž¬ ν‘œμ€€ μž…λ ₯"에 μ—°κ²°λœλ‹€κ³  말할 것이닀. ν•¨μˆ˜ λ‚˜ 블둝이 λ¦¬λ””λ ‰μ…˜λ˜μ§€ μ•ŠμœΌλ©΄ ttyμž…λ‹ˆλ‹€. λ¦¬λ””λ ‰μ…˜λ˜λ©΄ 그게 λ‹€μž…λ‹ˆλ‹€! λ”°λΌμ„œ μ—¬κΈ°μ—μ„œ / dev / tty에 μ—°κ²°ν•˜λŠ” 것은 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ–΄λ–€ μˆ˜μ€€μ˜ κ°„μ ‘μ μœΌλ‘œ 싀행될 λ•Œ "μ„œλΈŒ μ‰˜"이 ν„°λ―Έλ„μ—μ„œ 읽지 μ•ŠλŠ” κ²½μš°μ— λŒ€ν•΄ λΆˆν‰

이것듀은 λͺ¨λ‘ "μ „μ—­"λͺ…λ Ή λŒ€μ²΄μ— κ΄€ν•œ κ²ƒμž…λ‹ˆλ‹€. 예 : λͺ…λ Ή μ€„μ—μ„œ echo (fzf) μ‹€ν–‰. 이 경우 stdin이 μ—†μŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ œκ°€ λ§ν•˜κ³  싢은 것은 λ‹€μŒκ³Ό 같이 μž‘λ™ν•©λ‹ˆλ‹€.

echo | echo (cat) # from tty

begin
   echo | echo (cat) # from file
end < file

이 경우 stderr에 λŒ€ν•΄ λ¬»λŠ” κ΄€λ ¨ 문제 (# 1035)κ°€ 있으며 λ¦¬λ””λ ‰μ…˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이전 math ν•¨μˆ˜μ—λŠ” μƒλ‹Ήν•œ λ¬Έμ œκ°€μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 내뢀에 λͺ…λ Ή λŒ€μ²΄ κΈ°λŠ₯μ΄μžˆμ–΄μ„œ λ¦¬λ””λ ‰μ…˜ ν•  수 μ—†μ—ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

이것은 κ·Έκ²ƒμ˜ stdin λΆ€λΆ„μž…λ‹ˆλ‹€. ν•¨μˆ˜κ°€ λ² μ–΄ (cat) ν•œλ‹€λ©΄ 항상 ttyμ—μ„œ μ½λŠ” 것이 정말 μœ μš©ν•©λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ κ·Έλƒ₯ </dev/tty λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆκΉŒ?

ν₯미둜운 생각.

λ‚˜λŠ” κ΄„ν˜Έκ°€ κ°„λ‹¨ν•œ λŒ€μ²΄λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 지 (즉, "κ΄„ν˜Έμ˜ λ‚΄μš©μ΄ μœ„ μ€„μ—μžˆλŠ” κ²ƒμ²˜λŸΌ κ°€μž₯ν•˜κ³ , μ™„λ£ŒκΉŒμ§€ μ‹€ν–‰ν•˜κ³ , κ²°κ³Όλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜κ³ , 여기에 λ³€μˆ˜λ₯Ό λŒ€μ²΄") λ‚˜νƒ€λ‚΄λŠ” 지 μ—¬λΆ€λ‘œ κ·€κ²°λœλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. re (ν˜„μž¬ κ³ μž₯λ‚œ) μ„œλΈŒ μ‰˜. λ‚˜λŠ” λ¬Όκ³ κΈ°κ°€ μ μ ˆν•œ μ„œλΈŒ μ‰˜ 지원을 λ†“μΉ˜κ³  μžˆλ‹€λŠ” 것이 ν•©μ˜ 된 것이라고 μƒκ°ν–ˆμ§€λ§Œ, μ˜λ„λŠ” 항상 "μ–Έμ  κ°€λŠ”"그것을 κ³ μΉ˜λŠ” κ²ƒμ΄μ—ˆλ‹€.

μ „μž 인 경우, 예, λ™μ˜ν•©λ‹ˆλ‹€. κ΄„ν˜Έμ˜ λ‚΄μš©μ„ λ‹€λ₯Έ μ€„λ‘œ μ΄λ™ν•˜λ©΄ λΈ”λ‘μœΌλ‘œ λ¦¬λ””λ ‰μ…˜λ˜λŠ” μž…λ ₯μ—μ„œ ν™•μ‹€νžˆ μ½μ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— ν˜„μž¬ λ™μž‘μ΄ κΉ¨μ§‘λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ„œλΈŒ μ‰˜μ€ 훨씬 더 κ°•λ ₯ν•œ κ°œλ…μ΄λ©° λͺ…λ Ή λŒ€μ²΄λ‘œλŠ” λΆˆκ°€λŠ₯ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  훨씬 더 λ°˜μ‘μ μ΄κ³  유λŠ₯ν•œ 슀크립트λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 블둝에 μž…λ ₯λ˜λŠ” λͺ¨λ“  것을 μ„œλΈŒ μ‰˜μ—μ„œ μ‹€ν–‰λ˜λŠ” λͺ…λ Ήμ˜ ν‘œμ€€ μž…λ ₯에 μ—°κ²°ν•˜λŠ” 것은 기술적으둜 κ°€λŠ₯ν•˜μ§€λ§Œ, κ±°κΈ° μžˆλŠ” λ©˜νƒˆ λͺ¨λΈκ³Ό ν˜Έν™˜λ˜μ§€ μ•Šμ„ 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

κ΄„ν˜Έκ°€ κ°„λ‹¨ν•œ λŒ€μ²΄λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 지 (즉, "κ΄„ν˜Έμ˜ λ‚΄μš©μ΄ μœ„ μ€„μ—μžˆλŠ” κ²ƒμ²˜λŸΌ κ°€μž₯ν•˜κ³ , μ™„λ£Œ 될 λ•ŒκΉŒμ§€ μ‹€ν–‰ν•˜κ³ , κ²°κ³Όλ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜κ³ , 여기에 λ³€μˆ˜λ₯Ό λŒ€μ²΄") λ˜λŠ” (ν˜„μž¬ λŠμ–΄μ§„) ν•˜μœ„ μ‰˜μΈμ§€ μ—¬λΆ€ .

λ‚˜λŠ”μ΄ μš©μ–΄λ“€μ΄ μ—¬κΈ°μ„œ λ„ˆλ¬΄ 많이 μ‚¬μš©λ˜κΈ°μ— μΆ©λΆ„νžˆ λͺ…ν™•ν•˜κ²Œ μ •μ˜λ˜μ—ˆλ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ €μ—κ²ŒλŠ” 더 μžμ—°μŠ€λŸ½κ³  더 일반적이며 더 μœ μš©ν•œ 것이 무엇인지에 달렀 μžˆμŠ΅λ‹ˆλ‹€.

ν„°λ―Έλ„μ—μ„œ μ½λŠ” 것은 ν™•μ‹€νžˆ μœ μš©ν•˜λ©° λ•Œλ‘œλŠ” λ‹€λ₯Έ ν‘œμ€€ μž…λ ₯이 μžˆλ”λΌλ„ ν„°λ―Έλ„μ—μ„œ 읽기λ₯Ό μ›ν•©λ‹ˆλ‹€ (예 : fzf λŠ” 기본적으둜이 μž‘μ—… 만 μˆ˜ν–‰ν•¨).

κ·ΈλŸ¬λ‚˜ stdinμ—μ„œ μ½λŠ” 것이 훨씬 더 일반적이라고 μƒκ°ν•©λ‹ˆλ‹€. 특히 λΉ„ λŒ€ν™” ν˜• μ‚¬μš©μ΄ ttyμ—μ„œ μ „ν˜€ 읽지 μ•ŠλŠ”λ‹€λŠ” 점을 κ³ λ €ν•˜λ©΄ λ”μš± κ·Έλ ‡μŠ΅λ‹ˆλ‹€. 그리고 ttyμ—μ„œ μ½λŠ” 것이 μ—¬μ „νžˆ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— ( </dev/tty λ¦¬λ””λ ‰μ…˜μ„ 톡해), 보쑰 μ˜΅μ…˜μœΌλ‘œ λ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ œμ•ˆν•˜λŠ” λͺ¨λΈμ—μ„œ </dev/tty λ°˜λŒ€κ°€ μ—†λ‹€λŠ” 사싀은 λ‚΄ μž…μž₯을 μž¬κ³ ν•˜κ²Œ λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” 토둠을 μ™„μ „νžˆ μ΄ν•΄ν•˜κΈ°μ—λŠ” 껍데기에 μΆ©λΆ„ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 문제λ₯Ό ν•΄κ²°ν•΄μ•Όν•˜λŠ”λ°μ΄λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ bash μŠ€ν¬λ¦½νŠΈκ°€ ν•„μš”ν•œμ§€ κΆκΈˆν•©λ‹ˆλ‹€.

기본적으둜 맀우 κ°„λ‹¨ν•œ μž‘μ—…μž…λ‹ˆλ‹€. (z) catμ—μ„œ pvλ₯Ό 톡해 mysql cli둜 stdout을 νŒŒμ΄ν”„ν•˜κ³  (기본적으둜 백업을 λ³΅μ›ν•˜κΈ° μœ„ν•΄) μ—°κ²° λ¬Έμžμ—΄μ„ μž…λ ₯ν•˜κ³  싢지 μ•ŠκΈ° λ•Œλ¬Έμ— ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. :

function mysqlenv --description connect to mysql server using config from .env
  mysql -u (getEnv DB_USERNAME) -p(getEnv DB_PASSWORD) (getEnv DB_DATABASE)
end

λ¨Όμ € λͺ…령에 λŒ€ν•œ stdin이 μ™Όμͺ½μ˜ λͺ…λ Ήμ—μ„œ stdoutμ΄λΌλŠ” 것이 λΆ„λͺ…ν•˜κΈ° λ•Œλ¬Έμ— 이것이 μž‘λ™ν•œλ‹€κ³  ν™•μ‹ ν–ˆμ§€λ§Œ μ§€κΈˆμ€ ν˜Όλž€ μŠ€λŸ½μŠ΅λ‹ˆλ‹€. Ok mysqlenvλŠ” λͺ…령이 μ•„λ‹ˆλΌ ν•¨μˆ˜μž…λ‹ˆλ‹€. μ§€κΈˆ λ‚˜λŠ” μ—¬κΈ°μ—μ„œ λ§Žμ€ ν…μŠ€νŠΈμ™€ "이것은 μž‘λ™ν•΄μ•Όν•œλ‹€"λ₯Ό 많이 읽고 μžˆμ§€λ§Œ 아무것도 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ‹œλ„ν•œ 것 :

  • cat -|mysql... 좜λ ₯ μ—†μŒ; mysql은 μž…λ ₯을받지 μ•ŠμŠ΅λ‹ˆλ‹€. ctr + cλŠ” mysql이 μ‘΄μž¬ν•©λ‹ˆλ‹€. νŒŒμ΄ν”„κ°€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€.
  • mysql... <&0 좜λ ₯ μ—†μŒ; mysql은 μž…λ ₯을받지 μ•ŠμŠ΅λ‹ˆλ‹€. ctr + cλŠ” mysql이 μ‘΄μž¬ν•©λ‹ˆλ‹€. νŒŒμ΄ν”„κ°€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€.
  • set input (cat); mysql... 좜λ ₯ μ—†μŒ; mysql은 μž…λ ₯을받지 μ•ŠμŠ΅λ‹ˆλ‹€. ctr + cλŠ” λͺ¨λ‘ μ‘΄μž¬ν•©λ‹ˆλ‹€. 배경에 아무것도 남아 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€
  • read -z|mysql... 좜λ ₯ μ—†μŒ; mysql은 μž…λ ₯을받지 μ•ŠμŠ΅λ‹ˆλ‹€. ctr + cλŠ” ^c μΈμ‡„ν•©λ‹ˆλ‹€.

λ‹€μ‹œ λ‚΄ λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ : zcat some_backup.sql.gz|pv -s (zsize some_backup.sql.gz)|mysqlenv . mysqlκ³Ό ν•¨κ»˜ 직접 μ‚¬μš©ν•  λ•Œ (fish ν•¨μˆ˜μ—†μ΄) νŒŒμ΄ν”„ μƒνƒœλ₯Ό ν‘œμ‹œν•˜λ―€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ ν•¨μˆ˜ λ‚΄μ—μ„œ λͺ…λ Ήμ˜ stdin에 ν•¨μˆ˜μ—μ„œ stdin을 μ œκ³΅ν•˜λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

while read... λ₯Ό 톡해 λͺ¨λ“  라인에 λŒ€ν•΄ λ‹€μ‹œ μ—°κ²°ν•΄μ•Όν•œλ‹€κ³  λ§ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€. μž‘λ™ ν•  μˆ˜λŠ” μžˆμ§€λ§Œ μž‘μ—…ν•˜κΈ°μ—λŠ” λ„ˆλ¬΄ 느리기 λ•Œλ¬Έμ— 해결책이 μ•„λ‹™λ‹ˆλ‹€.

@tflori : 훨씬 κ°„λ‹¨ν•©λ‹ˆλ‹€. λ¦¬λ””λ ‰μ…˜μ—†μ΄ λͺ…령을 κ·ΈλŒ€λ‘œ λ‘μ‹­μ‹œμ˜€. λ¬Έμ œλŠ” ν•¨μˆ˜μ—μ„œ 직접 λͺ…령을 μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. 같은 것

function foo
    cat
end

곡μž₯. cat 은 (λŠ”) μ •μƒμ μœΌλ‘œ ν‘œμ€€ μž…λ ₯λ©λ‹ˆλ‹€.

그렇지 μ•Šμ€ 것은 λͺ…λ Ή λŒ€μ²΄μ—μžˆμ„ λ•Œμ΄ 버그에 λΆ€λ”ͺ 힐 λ•Œμž…λ‹ˆλ‹€.

@faho λŠ” 초기 κΈ°λŠ₯이 μž‘λ™ν•΄μ•Ό 함을 μ˜λ―Έν•©λ‹ˆκΉŒ? ν•˜μ§€λ§Œ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€. λ‚΄ 버전이 μ˜€λž˜λ˜μ—ˆμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ? ν˜„μž¬ 2.7.1을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄ 버전이 μ˜€λž˜λ˜μ—ˆμ„ 수 μžˆμŠ΅λ‹ˆκΉŒ? ν˜„μž¬ 2.7.1을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

@tflori : 예, 3.0.2κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

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