2015-02-10 2 views

ответ

6

CTRL - D это "конец файла (EOF)" и то, что вам нужно сделать, это "ловушка" этот вход. К сожалению, нет символа EOF - когда вы нажимаете на аккорд CTRL - D, tty отправляет сигнал приложению чтения, который завершил входной поток, возвращая значение часового, чтобы заставить его выйти.

Чтобы предотвратить использование этого символа в качестве дополнительного ввода, он должен быть особым символом (например, что-то вне допустимого диапазона, например -1). Когда терминал обнаруживает такой символ, он буферизует все его символы, так что вход пуст, что в свою очередь заставляет вашу программу читать нулевые байты (конец файла).

У вас может возникнуть проблема, поскольку команда read выходит при приеме eof, поэтому ваш сценарий, вероятно, заканчивается, прежде чем перейти к вашему условному. Это имеет побочный эффект от выхода из сценария, но, вероятно, не так, как вы хотели.

Try:

#!/usr/bin/env ksh 

# unmap so we can control the behavior 
stty eof ^D 

while true; do 
    read cmd 
    echo $cmd 

    # are we out of input? let's get a taco 
    if [ ! -n "$cmd" ]; then 
    echo 'taco time' 
    fi 

done 

Когда вы получите другие сигналы (например,^C) общая форма:

ловушки [команда] [сигналы поймать]

+0

'[! -n "$ cmd"] 'не будет работать, если нажать ENTER, не вводя никаких символов. – pynexj

4

Просто используйте while read:

while read cmd; do 
    echo $cmd 
done 
+0

Да, спасибо. Оно работает. Но как я могу использовать сравнение? –

+0

Зачем вам сравнивать? – pynexj

+0

для личной культуры и повышения моих навыков. Может быть, я должен буду сделать перерыв, когда я нажимаю ctrl + something –

Смежные вопросы