Qual é o objetivo da suspensão atrasada (Ctrl-Y) no Bash?

29

A parte integral da página man do Bash que é aplicável diz apenas:

If the operating system on which bash is running supports job control, bash contains facilities to use it. Typing the suspend character (typically ^Z, Control-Z) while a process is running causes that process to be stopped and returns control to bash. Typing the delayed suspend character (typically ^Y, Control-Y) causes the process to be stopped when it attempts to read input from the terminal, and control to be returned to bash. The user may then manipulate the state of this job, using the bg command to continue it in the background, the fg command to continue it in the foreground, or the kill command to kill it. A ^Z takes effect immediately, and has the additional side effect of causing pending output and typeahead to be discarded.

Eu nunca usei Ctrl - Y ; Eu só soube disso. Eu fiz bem com Ctrl - Z (suspender) apenas.

Estou tentando imaginar o que é essa opção para . Quando seria útil?

(Observe que esse recurso não existe em todas as variantes do Unix. Ele está presente em Solaris e FreeBSD mas não no Linux. A configuração correspondente é stty dsusp .)

Talvez menos subjetivamente: Existe algo que pode ser feito com Ctrl - Y que não pode ser realizado tão facilmente com Ctrl - < kbd> Z ?

    
por Wildcard 16.08.2016 / 03:12

4 respostas

23

Do manual do 4BSD para csh :

A ^Z takes effect immediately and is like an interrupt in that pending output and unread input are discarded when it is typed. There is another special key ^Y which does not generate a STOP signal until a program attempts to read(2) it. This can usefully be typed ahead when you have prepared some commands for a job which you wish to stop after it has read them.

Portanto, o objetivo é digitar várias entradas enquanto a primeira está sendo processada e fazer com que a tarefa pare depois que elas forem concluídas.

    
por 16.08.2016 / 07:36
11

Digamos que haja uma entrada de leitura de loop e execução. Pode ser útil deixar a tarefa concluir a instrução atual que ela calcula, sem interrompê-la antes de retornar à linha de comando para uma nova. Então, assim, para terminar um ciclo. Isso finaliza o loop normalmente e impede que ele seja executado novamente se read estiver sob uma restrição de tempo limite.

    
por 16.08.2016 / 05:02
4

Eu posso pensar em um cenário em que pode ser útil, mas é algo como um caso de borda artificial.

Suponha que você esteja depurando um script que esteja gravando arquivos temporários que você deseja analisar antes de serem excluídos como parte de uma rotina de limpeza.

Você pode adicionar um read foo em algum lugar após os arquivos serem gravados (mas antes da limpeza), executar o script e pressionar Ctrl - Y como eles são sendo gerado. Você será então encaminhado para um prompt com o script suspenso em segundo plano para fazer o que for necessário e, em seguida, poderá fg para permitir que o script seja concluído.

    
por 16.08.2016 / 03:57
2

O único cenário em que consigo pensar (e até não acho muito convincente) é se você quiser usar algum tipo de digitação antecipada para um comando shell. Digamos que algum comando esteja em execução, o que lerá a entrada em algum momento no futuro. Em seguida, você pode ^ Y e, em seguida, digite imediatamente o próximo comando de shell que deseja executar quando o comando de execução for suspenso. Eu acho que nunca usei isso em várias décadas de uso do BSD Unix.

    
por 16.08.2016 / 10:39