Search code examples
shellfish

Change directory in fish function and return to original directory after abort


I am switching from bash to fish, but am having trouble porting over a convenience function I use often. The point of this function is to run make from the root directory of my source tree regardless of which directory my shell is currently in.

In bash, this was simply:

function omake {(
  cd $SOURCE_ROOT;
  make $@;
)}

Since fish doesn't have subshells, the best I've been able to do is:

function omake
    pushd
    cd $SOURCE_ROOT
    make $argv
    popd
end

This works, but with the caveat that after interrupting the fish version with ^C, the shell is still in $SOURCE_ROOT, but interrupting the bash version puts me back in the original directory.

Is there a way to write a script that works identically to the bash one in fish?


Solution

  • This is as close as I can get to a subshell:

    function omake
        echo "cd $SOURCE_ROOT; and make \$argv" | fish /dev/stdin $argv
    end
    

    Process substitution does not seem to be interruptable: Ctrl-C does not stop this sleep cmd

    echo (cd /tmp; and sleep 15)
    

    However, fish has a very nice way to find the pid of a backgrounded process:

    function omake
        pushd dir1
        make $argv &
        popd
    end
    

    Then, to stop the make, instead of Ctrl-C, do kill %make