Search code examples
linuxterminaldebian

Why does xdg-open block on command-line?


My system is Debian 12. I try to use xdg-open to open an image file, yet it blocks when the image file is opened. The image viewer has to be closed before xdg-open returns.

While many people state that xdg-open returns immediately in their environment. I wonder whether this is a configuration or distribution issue. If possible, is there any option to let xdg-open detach and return immediately. I searched the xdg-open document yet didn't find anything.


Solution

  • xdg-open is just a wrapper to open a file with an application that can handle it.

    As such, it doesn't make any guarantees about whether it will block or return immediately: this is up to the delegated application (so if xdg-open ends up calling display-im6.q16, then it is display-im6.q16 that is blocking (or not).

    Of course things are a bit more complicated. E.g. if i run xdg-open file.jpg then i also get display-im6.q16, but without blocking. Why? Because i have also installed the exo-utils, so xdg-open does not call display-im6.q16 directly, but instead calls exo-open which (for whatever reasons) does not block.

    Now, i haven't found any documentation that guarantees that exo-open will not block. If you want to xdg-open to return immediately, just background it:

    xdg-open myfile &
    

    If you don't want to remember having to do this, you could also create an excutable file /usr/local/bin/xdg-open which (depending on your PATH) should take precedence over the system installed /usr/bin/xdg-open:

    #!/bin/sh
    /usr/bin/xdg-open "$@" &
    

    Or install some lightweight (at least I think it is lightweight) middleware like exo-utils