41 lines
		
	
	
		
			675 B
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			675 B
		
	
	
	
		
			Bash
		
	
	
	
	
	
| emulate -L zsh
 | |
| 
 | |
| zmodload zsh/curses
 | |
| 
 | |
| test_fd0() {
 | |
|     true <&0
 | |
| }
 | |
| 
 | |
| local restore=0 FD
 | |
| 
 | |
| # Reattach to terminal
 | |
| if [ ! -t 0 ]; then
 | |
|     # Check if can reattach to terminal in any way
 | |
|     if [[ ! -c /dev/tty && ! -t 2 ]]; then
 | |
|         echo "No terminal available (no /dev/tty and no terminal at stderr)"
 | |
|         return 1
 | |
|     fi
 | |
| 
 | |
|     if test_fd0 2>/dev/null; then
 | |
|         exec {FD}<&0
 | |
|         restore=2
 | |
|     else
 | |
|         restore=1
 | |
|     fi
 | |
| 
 | |
|     if [[ ! -c /dev/tty ]]; then
 | |
|         exec <&2
 | |
|     else
 | |
|         exec </dev/tty
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| # Run the command
 | |
| "$@"
 | |
| 
 | |
| # Restore FD state
 | |
| (( restore == 1 )) && exec <&-
 | |
| (( restore == 2 )) && exec <&$FD && exec {FD}<&-
 | |
| 
 | |
| # vim: set filetype=zsh:
 |