Когда вы нажимаете Ctrl+C, то весь shell job (группа процессов) получает SIGINT, less
перехватывает его, чтобы прервать поиск, но gunzip
завершится. Чтобы избежать этого, вы можете сделать:
(trap '' INT; gunzip < file.gz) | less
так, чтобы gunzip
игнорировал SIGINT,
но учтите, что после этого вы больше не сможете прервать gunzip
.
Для gunzip
это, вероятно, нормально, поскольку все, что вам нужно сделать, это выйти из less
, после чего gunzip
умрет от SIGPIPE в следующий раз, когда будет что-то писать, но для приложений, которые просто зависают, не выводя ничего, это будет более проблематично (вы все еще сможете использовать Ctrl+Z для SIGTSTP или Ctrl+\ для SIGQUIT).
Также обратите внимание, что некоторые команды, такие как pv
или ping
, устанавливают свой собственный обработчик SIGINT, который отменит наш trap '' INT
.
Вы можете создать функцию для экономии набора текста, например:
iless() {
(trap '' INT; "$@") | less
}
iless gunzip < file.gz
Или:
noint() (trap '' INT; "$@")
noint gunzip < file.gz | less
Но обратите внимание, что для:
gunzip < file.gz | grep foo | less
вам придется написать:
noint gunzip < file.gz | notint grep foo | less
или:
noint eval 'gunzip < file.gz | grep foo' | less
или:
iless eval 'gunzip < file.gz | grep foo'
Альтернативой является использование подстановки процесса:
less -f <(gunzip < file.gz | grep foo)
или (правда, не в zsh
):
less < <(gunzip < file.gz | grep foo)
В этих случаях оболочка не включает команды внутри подстановки процесса в группу процессов переднего плана (кроме второго случая для zsh
). Их группа процессов остается такой же, как и у оболочки. Это означает, что они не получают SIGINT, когда вы нажимаете Ctrl+C.
Обратите внимание, что эти процессы также не будут затронуты Ctrl+Z или Ctrl+\.
Проверено в zsh
, ksh93
и bash
.
Единственный вариант, который я нашел, это удалить все, кроме одного, сетевые интерфейсы машины VirtualBox, тогда программа установки автоматически выберет этот.
Тьфу, разогреваю старые вещи. Но у меня была такая же проблема, и я нашел решение.
Проблема в том, что файл preseed загружается после d -i выполняет настройку сети (sic! ). Поэтому, когда вы дойдете до выбора интерфейса, предварительные ответы еще не известны.
Так что вам нужно добавить соответствующий интерфейс в командную строку ядра вот так:
auto=true priority=critical interface=enp0s8 url=http://host/path/to/preseed.cfg
interface
является псевдонимом для netcfg/choose_interface
Таким образом, вы можете (и должны )удалить все netcfg/
записи из файла preseed.