쉘 스크립트에서 프롬프트하려면 Ctrl-C를 전달하십시오.

쉘 스크립트에서 프롬프트하려면 Ctrl-C를 전달하십시오.

Mercurial의 선반 확장 기능을 사용할 때 발생한 상황을 재현하기 위해 쉘 스크립트를 작성하려고 합니다.

이를 위해서는 Mercurial 명령줄 사용자 인터페이스(UI)에서 제공하는 프롬프트를 중단해야 합니다. 다음 스크립트를 참조하세요

rm -rf test-shelveinterrupt
hg init test-shelveinterrupt
cd test-shelveinterrupt

hg branch foo
echo "First line of foo" >> foo
hg add foo
hg ci -m "First line of foo" foo
echo "Second line of foo" >> foo
hg shelve

hg up null

hg branch bar
echo "First line of bar" >> bar
hg add bar
hg ci -m "First line of bar" bar

hg unshelve

pkill -INT shelveinterrupt

이 스크립트를 실행하면

bash shelveinterrupt.sh

, 에 종료됩니다

file 'foo' was deleted in local [working-copy] but was modified in other [shelve].
You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
What do you want to do? 

hg unshelve이는 스크립트 끝의 명령에 대한 응답입니다.

방해하여 메시지를 중단하고 싶습니다. 마지막 것은 pkill쉘 프로세스를 중단하도록 설계되었지만 물론 스크립트가 입력을 기다리는 동안에는 호출되지 않습니다. 첫 번째 스크립트를 호출하기 위해 두 번째 스크립트를 만들지 않고 호출할 수 있는 방법이 있나요?

스크립트를 중단한 후에는 다음과 같은 메시지가 표시됩니다.

해결되지 않은 충돌("hg 해결"을 참조한 다음 "hg unshelve --continue" 참조)

답변1

내가 하고 싶은 일이 Tcl 확장을 통해 이루어질 수 있다는 것이 밝혀졌고, 그것을 기대하고 있다. 그러나 이를 위해서는 두 개의 스크립트가 필요합니다.

쉘 스크립트.

#################################
shelveinterrupt.sh
#################################
#!/bin/bash

rm -rf test-shelveinterrupt
hg init test-shelveinterrupt
cd test-shelveinterrupt
hg branch foo
echo "First line of foo" >> foo
hg add foo
hg ci -m "First line of foo" foo

echo "Second line of foo" >> foo
hg shelve

hg up null

hg branch bar
echo "First line of bar" >> bar
hg add bar
hg ci -m "First line of bar" bar

hg log -vG

hg branch

hg unshelve

Expect 스크립트도 있습니다.

#################################
shelveinterrupt.exp
#################################
#!/usr/bin/expect -f

spawn ./shelveinterrupt.sh
expect "What do you want to do?"
send -- "^C"
expect eof

# Check `hg status
cd test-shelveinterrupt
set hgst [exec hg status]
puts $hgst
exec hg update .

그러면 다음과 같은 출력이 생성됩니다.

faheem@orwell:~/test-mercurial$ ./shelveinterrupt.exp
spawn ./shelveinterrupt.sh
marked working directory as branch foo
(branches are permanent and global, did you want a bookmark?)
shelved as foo
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
marked working directory as branch bar
unshelving change 'foo'
rebasing shelved changes
file 'foo' was deleted in local [working-copy] but was modified in other [shelve].
You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
What do you want to do? interrupted!
# The repository is in an unfinished *update* state.

# Unresolved merge conflicts:
#
#     foo
#
# To mark files as resolved:  hg resolve --mark FILE

# To continue:    hg update .

abort: outstanding merge conflicts
(use 'hg resolve' to resolve)
    while executing
"exec hg update ."
    (file "./shelveinterrupt.exp" line 11)

그래서 hg update .그것은 작동하지 않습니다.

관련 정보