Open File from Terminal – How to Open a File by Typing Its Name in Terminal

bashcommand linegnome-terminal

I know that xdg-open will open from terminal a file in the user's preferred application like this:

xdg-open filename

But I wonder how can I open a file from the current directory in its default application only by typing:

filename

followed by Enter, of course. Nothing more.

Best Answer

Use Ubuntu's command-not-found hook, as specified in Command Not Found Magic. It is currently used to suggest packages to install. Refer to /usr/share/doc/command-not-found/README which should be installed on your system.

Better yet, because it does not depend on the command-not-found package, (re)implement the Bash builtin command_not_found_handle to do an xdg-open if $1 is an existing file, and to delegate all other cases to the previous implementation.

# Save the existing code for the handler as prev_command_not_found_handle.
# Bit of a hack, as we need to work around bash's lack of lexical closure,
# and cover the case when it is not defined at all.
eval "prev_$(declare -f command_not_found_handle)" >& /dev/null \
     || prev_command_not_found_handle () { 
            echo "$1: command not found" 1>&2
            return 127
        }

# Define the new implementation, delegating to prev_handler.
command_not_found_handle () {
    if [ -f "$1" ]; then
        xdg-open "$1"
    else
        prev_command_not_found_handle "$@"
    fi
}

Good question, nifty feature.


Thinking it over some more: you might not like the feature as much as you think, unless you also extend the bash_completion handler. Imagine wanting to open file-with-a-long-name.txt, then setting

alias o='xdg-open'  

will make (about) four key presses suffice:

o f<Tab><Enter>

Whereas typing the full file name takes a tedious 26 - and that excludes backspacing over the inevitable typos.