2012-10-24 6 views
6

저는 스크립팅 개념을 배우기 위해 bash 래퍼를 작성하고 있습니다. 아이디어는 bash에 스크립트를 작성하고 로그인시 사용자 쉘로 설정하는 것입니다.SIGINT를 사용하여 bash 스크립트에서 읽기를 취소 하시겠습니까?

나는 readeval이라는 사용자 입력을 입력 한 후 사용자가 CTRL + C을 입력 할 때마다 스크립트가 중단되어 사용자 세션이 종료된다는 사실을 알게되었습니다.

이 문제를 방지하기 위해 나는 트랩에서 아무것도하지 않고 SIGINT을 잡았습니다.

이제 명령의 절반에 CTRL + C을 입력하면 bash에서 수행하는 것처럼 취소되지 않습니다. 단지 CTRL + C을 무시합니다.

그래서 ping stockoverf^Cping stackoverflow.com을 입력하면 내가 원하는 ping stackoverflow.com 대신 ping stockoverfping stackoverflow.com이됩니다.

그렇게 할 방법이 있습니까?

#!/bin/bash 

# let's trap SIGINT (CTRL + C) 
trap "" SIGINT 

while true 
do 
    read -e -p "$USER - SHIELD: `pwd`> " command 
    history -s $command 
    eval $command 
done 
당신은 Ctrl 키-A를 보내 xdotool 같은 도구를 사용할 수

답변

3

는 (시작 - 중 - 라인) Ctrl 키-K (삭제 - 투 - 엔드 오브 라인) 반환 (정리에 선)

#!/bin/bash 
trap "xdotool key Ctrl+A Ctrl+k Return" SIGINT; 
unset command 
while [ "$command" != "quit" ] ;do 
    eval $command 
    read -e -p "$USER - SHIELD: `pwd`> " command 
    done 
trap SIGINT 

하지만 강력 RTFM에 ...``디버그 ''키워드 검색에 초대 ...

man -Pless\ +/debug bash 
+0

xdotool은 100 % 해킹, 트릭을 할 것입니다. '^ C^A^K'와 순수한 bash (단지'^ C')에서는 보이지 않는 빈 줄을 얻습니다. 그러나 그것은 아무것도 아닌 것보다 낫습니다. 어쨌든,'xdotool'에 의존하지 말고, 여분의 마커를 피하기 위해 bash와 똑같이 만드십시오. 어쨌든, rtfm 초대장을받지 못했습니다 ... 무엇을 보여줘야합니까? – mgarciaisaia

+0

예, 이것은 거대한 해킹입니다. 그러나 주에서, 이것은 일을합니다. 원래 아이디어를 따르는 올바른 방법은 ioctl을 통해 파일 설명자에 액세스해야합니다. –

+0

@mgarciaisaia * debug *가 할 수있는 일과 그 사용 방법에 대해. [나노초로 프로파일 링하는 bash] (http://stackoverflow.com/a/20855353/1765658)를 살펴보십시오. –