mirror of
				https://github.com/ohmyzsh/ohmyzsh.git
				synced 2025-11-04 13:21:19 +08:00 
			
		
		
		
	fix(async): avoid blocking the shell while waiting (#12304)
Co-authored-by: Marc Cornellà <marc@mcornella.com>
This commit is contained in:
		
							parent
							
								
									130002a79e
								
							
						
					
					
						commit
						b43b84abc7
					
				@ -82,10 +82,8 @@ function _omz_async_request {
 | 
			
		||||
    exec {fd}< <(
 | 
			
		||||
      # Tell parent process our PID
 | 
			
		||||
      builtin echo ${sysparams[pid]}
 | 
			
		||||
      # Store handler name for callback
 | 
			
		||||
      builtin echo $handler
 | 
			
		||||
      # Set exit code for the handler if used
 | 
			
		||||
      (exit $ret)
 | 
			
		||||
      () { return $ret }
 | 
			
		||||
      # Run the async function handler
 | 
			
		||||
      $handler
 | 
			
		||||
    )
 | 
			
		||||
@ -98,8 +96,7 @@ function _omz_async_request {
 | 
			
		||||
    command true
 | 
			
		||||
 | 
			
		||||
    # Save the PID from the handler child process
 | 
			
		||||
    read pid <&$fd
 | 
			
		||||
    _OMZ_ASYNC_PIDS[$handler]=$pid
 | 
			
		||||
    read -u $fd "_OMZ_ASYNC_PIDS[$handler]"
 | 
			
		||||
 | 
			
		||||
    # When the fd is readable, call the response handler
 | 
			
		||||
    zle -F "$fd" _omz_async_callback
 | 
			
		||||
@ -114,15 +111,14 @@ function _omz_async_callback() {
 | 
			
		||||
  local err=$2  # Second arg will be passed in case of error
 | 
			
		||||
 | 
			
		||||
  if [[ -z "$err" || "$err" == "hup" ]]; then
 | 
			
		||||
    # Get handler name from first line
 | 
			
		||||
    local handler
 | 
			
		||||
    read handler <&$fd
 | 
			
		||||
    # Get handler name from fd
 | 
			
		||||
    local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}"
 | 
			
		||||
 | 
			
		||||
    # Store old output which is supposed to be already printed
 | 
			
		||||
    local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}"
 | 
			
		||||
 | 
			
		||||
    # Read output from fd
 | 
			
		||||
    _OMZ_ASYNC_OUTPUT[$handler]="$(cat <&$fd)"
 | 
			
		||||
    IFS= read -r -u $fd -d '' "_OMZ_ASYNC_OUTPUT[$handler]"
 | 
			
		||||
 | 
			
		||||
    # Repaint prompt if output has changed
 | 
			
		||||
    if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user