Яка мета затримки призупинення (Ctrl-Y) у Bash?


30

Повна частина сторінки Bash man, яка застосовується, говорить лише:

Якщо операційна система, на якій працює bash, підтримує контроль за роботою, bash містить засоби для його використання. Введення символу призупинення (зазвичай ^ Z, Control-Z) під час запуску процесу призводить до того, що процес зупиняється і повертає керування в bash. Введення символу відкладеної зупинки (як правило, ^ Y, Control-Y) призводить до зупинки процесу, коли він намагається зчитувати вхід з терміналу, а керування повертається в bash. Потім користувач може маніпулювати станом цього завдання, використовуючи bg команду для продовження його у фоновому режимі,fgкоманда продовжувати його на передньому плані або команда kill для вбивства. A ^ Z набирає чинності негайно і має додатковий побічний ефект, який спричиняє відмову від очікуваного виводу та набору тексту.

Я ніколи не використовував Ctrl- Y; Я тільки що дізнався про це. У мене все добре Ctrl- лише Z(призупинити).

Я намагаюся уявити собі , що цей варіант для . Коли це було б корисно?

(Зверніть увагу, що ця функція існує не у всіх варіантах Unix. Вона присутня в Solaris і FreeBSD, але не в Linux. Відповідне налаштування є stty dsusp.)

Можливо, менш суб'єктивно: чи є щось, що можна досягти Ctrl- Yчого не можна зробити так само легко Ctrl- Z?


@Gilles, хоча у FreeBSD, здається, є stty dsusp, я не зумів змусити його надсилати SIGTSTP на ^ Y (я це робив на Solaris). Чи ти?
Стефан Шазелас

Відповіді:


23

З посібника 4BSD для csh :

A ^Zнабирає чинності негайно і є як перерив у тому, що очікуваний вихід та непрочитаний вхід відкидаються під час його введення. Є ще один спеціальний ключ, ^Yякий не генерує сигнал STOP, поки програма не спробує прочитати (2) його. Це може бути корисно набрано заздалегідь, коли ви підготували кілька команд для завдання, яке ви хочете зупинити після того, як їх прочитали.

Отже, мета - ввести декілька входів під час обробки першого та припинити роботу після їх завершення.


Цей опис тонко відрізняється від посібника з bash. «... не генерує сигнал СТОП , поки програма намагається не читати його. » Це звучить , як і всі у вхідному потоці до^Y буде прочитаний успішно, а потім , коли ^Yвдарив процес буде зупинено. Чи читаю я це правильно?
Wildcard

@Wildcard в моєму тесті на Mac OS X, процес зупиняється, перш ніж read () повертається (але після виклику read (), який би повернув Y запускається), і після його відновлення він отримує вхід до раніше ^ Y . Я думаю, як це було призначено для використання, хоча воно буде використовуватися на початку рядка, тому поведінка в цьому випадку не мала б значення. Я підозрюю, що в дійсному коді він призупиняється, коли ^ Y був би скопійований у буфер зчитування користувача.
Випадково832

Я мав рацію, в оригінальній функції третьої ядра BSD ви можете побачити це, а також сучасний OSX
Random832

Але, коли процес відновиться, виклик буде успішним, і він буде містити дані, які ви ввели раніше у свій термінал ^Y, навіть якщо ви відмовились від нього та закрили свій термінал до того, як процес відновиться. Правильно? ( "... після його відновлення він отримує вхід до раніше ^ Y". Це я мав на увазі; я зазвичай не маю справи з кодом С.) :)
Wildcard

Так. І повертається без нового рядка в кінці, що незвично для читання в канонічному режимі [подібно до того, якби ви набрали якийсь текст, а потім натиснули ^ D один раз], я підозрюю, що вони не дуже думали про цю справу, оскільки він дійсно призначений для введення на початку рядка.
Випадково832

11

Скажіть, є вхід читання циклу читання. Може бути корисним дозволити завдання закінчити поточну інструкцію, яку вона обчислює, не перериваючи її, перш ніж вона повернеться до командного рядка для нового. Таким чином, щоб закінчити цикл. Це закінчує цикл витончено і запобігає його повторному запуску, якщо readвін обмежений.


Але якщо він буде намагатися читати вхідні дані з терміналу в будь-якому випадку, він буде зупинятися в цій точці (і чекати вашого входу), і ви можете ^Zйого потім .
Wildcard

Так. Дивіться оновлення.
Томаш

Перевірте ще одну. @Wildcard
Tomasz

1
Але якщо у вас є тайм-аут, чи не закінчилося б це також витончено, якби ви нічого не зробили?
Даніель Вагнер

1
Це могло б. Але це може також продовжуватись і виконувати якусь роботу за замовчуванням.
Томаш

4

Я можу придумати один сценарій, коли це може бути корисним, але це щось із надуманого кращого випадку.

Припустимо, ви налагоджуєте сценарій, який записує тимчасові файли, які ви хочете проаналізувати, перш ніж їх видалити як частину процедури очищення.

Ви можете додати read fooдесь після написання файлів (але перед очищенням), запустіть скрипт і натисніть Ctrl- Yколи вони створюються. Тоді ви будете переведені на підказку, коли сценарій буде призупинено у фоновому режимі, щоб зробити все, що вам потрібно зробити, а потім fgможете дозволити виконання сценарію.


1
Здається, малоймовірно, оскільки сценарій все одно буде чекати введення. Таким чином, ви можете так само легко спостерігати за тим, щоб запропонувати ввести, а потім призупинити його ^Z. Іншими словами: після того, як ви наберете fgви повинні дати сценарій деякий вхідний сигнал в будь-якому випадку , перш ніж він буде тривати. Звідси моє запитання; Я досі не бачу сенсу ^Y. (Дякую за відповідь!) :)
Wildcard

2

Єдиний сценарій, про який я можу придумати (і навіть я не вважаю це дуже переконливим), це якщо ви хочете використовувати якийсь тип вперед для команди оболонки. Скажіть, виконується якась команда, яка буде читати вхід деякий час у майбутньому. Тоді ви можете ^ Y це, а потім негайно ввести наступну команду оболонки, яку ви хочете виконати, коли запущена команда призупиняється. Я не думаю, що я ніколи не використовував це за кілька десятиліть використання BSD Unix.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.