Fish shell: Check if argument is provided for function

user14492 picture user14492 · Apr 14, 2015 · Viewed 13.5k times · Source

I am creating a function (below) with which you can provide an argument, a directory. I test if the $argv is a directory with -d option, but that doesn’t seem to work, it always return true even if no arguments are supplied. I also tried test -n $argv -a -d $argv to test is $argv is empty sting, but that returns test: Missing argument at index 1 error. How should I test if any argument is provided with the function or not? Why is test -d $argv not working, from my understanding it should be false when no argument is provided, because empty string is not a directory.

function fcd
     if test -d $argv
         open $argv
     else
         open $PWD
     end
 end

Thanks for the help.

Answer

ridiculous_fish picture ridiculous_fish · Apr 15, 2015

count is the right way to do this. For the common case of checking whether there are any arguments, you can use its exit status:

function fcd
    if count $argv > /dev/null
        open $argv
    else
        open $PWD
    end
end

To answer your second question, test -d $argv returns true if $argv is empty, because POSIX requires that when test is passed one argument, it must "Exit true (0) if $1 is not null; otherwise, exit false". So when $argv is empty, test -d $argv means test -d which must exit true because -d is not empty! Argh!

edit Added a missing end, thanks to Ismail for noticing