2006-02-08 19:20:05 +10:00
2007-01-16 11:29:18 +10:00
function psub --description "Read from stdin into a file and output the filename. Remove the file when the command that called psub exits."
2006-02-08 19:20:05 +10:00
set -l filename
set -l funcname
2007-01-16 03:43:30 +10:00
set -l use_fifo 1
set -l shortopt -o hf
set -l longopt -l help ,file
2006-02-08 19:20:05 +10:00
2007-01-16 03:43:30 +10:00
if getopt -T > /dev/null
set longopt
end
if not getopt -n psub -Q $shortopt $longopt -- $argv
return 1
end
set -l tmp ( getopt $shortopt $longopt -- $argv )
eval set opt $tmp
while count $opt > /dev/null
switch $opt [ 1 ]
case -h --help
2006-11-18 02:24:38 +10:00
__fish_print_help psub
2006-02-08 19:20:05 +10:00
return 0
2007-01-16 03:43:30 +10:00
case -f --file
set use_fifo 0
case --
set -e opt [ 1 ]
break
2006-02-08 19:20:05 +10:00
end
2007-01-16 03:43:30 +10:00
set -e opt [ 1 ]
2006-02-08 19:20:05 +10:00
end
if not status --is-command-substitution
echo psub : Not inside of command substitution > & 2
return
end
# Find unique file name for writing output to
while true
set filename /tmp/.psub.( echo %self) .( random ) ;
if not test -e $filename
break ;
end
end
2007-01-16 03:43:30 +10:00
if test use_fifo = 1
# Write output to pipe. This needs to be done in the background so
# that the command substitution exits without needing to wait for
# all the commands to exit
mkfifo $filename
cat > $filename &
else
cat > $filename
end
2006-02-08 19:20:05 +10:00
# Write filename to stdout
echo $filename
# Find unique function name
while true
set funcname __fish_psub_( random ) ;
if not functions $funcname > /dev/null ^ /dev/null
break ;
end
end
# Make sure we erase file when caller exits
2006-12-12 22:28:53 +10:00
eval function $funcname --on-job-exit caller\; command rm $filename \; functions -e $funcname \; end
2006-02-08 19:20:05 +10:00
end