Восстановить интерактивные команды после случайного перелистывания входных данных канала до меньшего?

Используйтеgetent:

$ getent hosts unix.stackexchange.com
151.101.193.69    unix.stackexchange.com  unix.stackexchange.com
4
21.10.2019, 05:57
1 ответ

Если я правильно понял ваш вопрос, ваше желаемое поведение состоит в том, чтобы прервать сон и вернуться в интерактивныйvim-подобный режим с помощью :.

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

#!/bin/bash 


trap 'kill $(jobs -p)' INT


for i in {1..90}
do
    printf '%s\n' "$i"
done

sleep infinity &
wait

printf '91\n'

sleep 10 &
printf 'done\n'

Я немного модифицировал ваш исходный скрипт, чтобы он засыпал на бесконечность для тестирования.

Когда вы достигаете и затем пытаетесь пройти линию 90, sleepвключается и работает вечно. Чтобы выйти из него, просто нажмите CTRL+C , что благодаря ловушке сигнала не только прервет нашу sleepработу, но и вернет вам желаемый :и его функционал (, который вам может понадобиться нажать клавишу после выполнения CTRL+C). Кроме того, как только вы снова попытаетесь пройти дальше строки 90, сразу же будет напечатана строка 91, так как выполнение скрипта прошло мимо первого задания sleep.

0
27.01.2020, 21:02

Теги

Похожие вопросы