How to have script detect if terminal emulator is running in a desktop session or not?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP








up vote
10
down vote

favorite
2












I have scripts I run that write out a text file, then open it in an editor. If I open a terminal emulator window in my desktop session and run the script, I'd like the editor to be a graphical one such as gedit. But, if I'm logged in through ConnectBot on my phone or similar (no desktop session), I'd like the editor to be nano.



Currently I have to maintain 2 different scripts, identical except for the last step (or let the graphical one run, error off, then manually open the file in nano). Having two mostly identical scripts is inefficient from a maintenance standpoint.



Can a script detect which of these situations I'm in, and open the correct editor?



(I have found ways for a script to detect whether it's running in a terminal emulator window or by being double-clicked, but not yet found a way to detect if the window is running in a desktop...I don't think I know the correct terminology to google for)







share|improve this question
















  • 6




    If your script is for use by other people you should use the program specified by $EDITOR by default instead of nano, and fallback on nano if it is not set.
    – Bakuriu
    May 21 at 17:42










  • Thanks, great advice, and it's great to hear what is good practice. Just me though.
    – Organic Marble
    May 21 at 17:42















up vote
10
down vote

favorite
2












I have scripts I run that write out a text file, then open it in an editor. If I open a terminal emulator window in my desktop session and run the script, I'd like the editor to be a graphical one such as gedit. But, if I'm logged in through ConnectBot on my phone or similar (no desktop session), I'd like the editor to be nano.



Currently I have to maintain 2 different scripts, identical except for the last step (or let the graphical one run, error off, then manually open the file in nano). Having two mostly identical scripts is inefficient from a maintenance standpoint.



Can a script detect which of these situations I'm in, and open the correct editor?



(I have found ways for a script to detect whether it's running in a terminal emulator window or by being double-clicked, but not yet found a way to detect if the window is running in a desktop...I don't think I know the correct terminology to google for)







share|improve this question
















  • 6




    If your script is for use by other people you should use the program specified by $EDITOR by default instead of nano, and fallback on nano if it is not set.
    – Bakuriu
    May 21 at 17:42










  • Thanks, great advice, and it's great to hear what is good practice. Just me though.
    – Organic Marble
    May 21 at 17:42













up vote
10
down vote

favorite
2









up vote
10
down vote

favorite
2






2





I have scripts I run that write out a text file, then open it in an editor. If I open a terminal emulator window in my desktop session and run the script, I'd like the editor to be a graphical one such as gedit. But, if I'm logged in through ConnectBot on my phone or similar (no desktop session), I'd like the editor to be nano.



Currently I have to maintain 2 different scripts, identical except for the last step (or let the graphical one run, error off, then manually open the file in nano). Having two mostly identical scripts is inefficient from a maintenance standpoint.



Can a script detect which of these situations I'm in, and open the correct editor?



(I have found ways for a script to detect whether it's running in a terminal emulator window or by being double-clicked, but not yet found a way to detect if the window is running in a desktop...I don't think I know the correct terminology to google for)







share|improve this question












I have scripts I run that write out a text file, then open it in an editor. If I open a terminal emulator window in my desktop session and run the script, I'd like the editor to be a graphical one such as gedit. But, if I'm logged in through ConnectBot on my phone or similar (no desktop session), I'd like the editor to be nano.



Currently I have to maintain 2 different scripts, identical except for the last step (or let the graphical one run, error off, then manually open the file in nano). Having two mostly identical scripts is inefficient from a maintenance standpoint.



Can a script detect which of these situations I'm in, and open the correct editor?



(I have found ways for a script to detect whether it's running in a terminal emulator window or by being double-clicked, but not yet found a way to detect if the window is running in a desktop...I don't think I know the correct terminology to google for)









share|improve this question











share|improve this question




share|improve this question










asked May 21 at 12:10









Organic Marble

9,65763053




9,65763053







  • 6




    If your script is for use by other people you should use the program specified by $EDITOR by default instead of nano, and fallback on nano if it is not set.
    – Bakuriu
    May 21 at 17:42










  • Thanks, great advice, and it's great to hear what is good practice. Just me though.
    – Organic Marble
    May 21 at 17:42













  • 6




    If your script is for use by other people you should use the program specified by $EDITOR by default instead of nano, and fallback on nano if it is not set.
    – Bakuriu
    May 21 at 17:42










  • Thanks, great advice, and it's great to hear what is good practice. Just me though.
    – Organic Marble
    May 21 at 17:42








6




6




If your script is for use by other people you should use the program specified by $EDITOR by default instead of nano, and fallback on nano if it is not set.
– Bakuriu
May 21 at 17:42




If your script is for use by other people you should use the program specified by $EDITOR by default instead of nano, and fallback on nano if it is not set.
– Bakuriu
May 21 at 17:42












Thanks, great advice, and it's great to hear what is good practice. Just me though.
– Organic Marble
May 21 at 17:42





Thanks, great advice, and it's great to hear what is good practice. Just me though.
– Organic Marble
May 21 at 17:42











3 Answers
3






active

oldest

votes

















up vote
13
down vote



accepted










You can use the environment variable $DISPLAY as trigger within a if condition. Usually when this variable has a value you are able to run graphical applications.



Here is a bash example:





if [[ -z $DISPLAY ]]
then
nano
else
gedit
fi


The operator -z will return true when the envvar $DISPLAY is empty and your script will run nano, in all other cases it will run gedit.




According to the this comment of @vurp0:




On most modern Wayland desktops (like the default desktop in Fedora
and Ubuntu), $DISPLAY is still set due to backwards compatibility
(through XWayland), but for a more robust script it would be good to
test for both $DISPLAY and $WAYLAND_DISPLAY to be sure.




I would suggest to modify the test expression in the following way:



[[ -z $DISPLAY$WAYLAND_DISPLAY ]]


Thus, the values of the two variables will be concatenated into a common string, which will be processed by the operator -z.




References:



  • Advanced Bash-Scripting Guide: 7. Tests

  • Advanced Bash-Scripting Guide: 7.1. Test Constructs

  • Advanced Bash-Scripting Guide: 7.3. Other Comparison Operators





share|improve this answer


















  • 1




    Or for explicit logic: [[ -z $DISPLAY && -z $WAYLAND_DISPLAY ]]
    – Dennis Williamson
    May 21 at 21:00

















up vote
7
down vote













Typically virtual terminals use /dev/pts pseudo-terminals. So, based on the output of tty command, we can build a simple case statement to handle opening particular editor:



case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac


Or formatted more nicely:



case "$(tty)" in
"/dev/pts"*) gedit ;;
"/dev/tty"*) nano ;;
*) echo "Not suitable tty" > /dev/stderr ;;
esac


Compared to using environment variables, this is slightly more reliable and considering it uses case statement with tty command slightly more portable. What probably would be best is to combine both, with extra testing, such as "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;






share|improve this answer






















  • Isn't this the wrong way around? On my Ctrl+Alt+F1 console, tty gives /dev/tty1, whereas gnome-terminal (first tab) gives /dev/pts/0.
    – Paddy Landau
    May 29 at 11:25










  • @PaddyLandau Yes, gedit should be in /dev/pts* case. I switched them around while error testing in tty and ended up copying it here without switching back. Thanks, edited already.
    – Sergiy Kolodyazhnyy
    May 29 at 14:40

















up vote
3
down vote













This is what I've been using:





# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
exit 1
fi


The reason for this code was this question: Desktop shortcut to Bash script crashes and burns



You can modify it to look like this:



# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
nano ...
else
gedit ...
fi





share|improve this answer






















    Your Answer







    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "89"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: false,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );








     

    draft saved


    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1038684%2fhow-to-have-script-detect-if-terminal-emulator-is-running-in-a-desktop-session-o%23new-answer', 'question_page');

    );

    Post as a guest






























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    13
    down vote



    accepted










    You can use the environment variable $DISPLAY as trigger within a if condition. Usually when this variable has a value you are able to run graphical applications.



    Here is a bash example:





    if [[ -z $DISPLAY ]]
    then
    nano
    else
    gedit
    fi


    The operator -z will return true when the envvar $DISPLAY is empty and your script will run nano, in all other cases it will run gedit.




    According to the this comment of @vurp0:




    On most modern Wayland desktops (like the default desktop in Fedora
    and Ubuntu), $DISPLAY is still set due to backwards compatibility
    (through XWayland), but for a more robust script it would be good to
    test for both $DISPLAY and $WAYLAND_DISPLAY to be sure.




    I would suggest to modify the test expression in the following way:



    [[ -z $DISPLAY$WAYLAND_DISPLAY ]]


    Thus, the values of the two variables will be concatenated into a common string, which will be processed by the operator -z.




    References:



    • Advanced Bash-Scripting Guide: 7. Tests

    • Advanced Bash-Scripting Guide: 7.1. Test Constructs

    • Advanced Bash-Scripting Guide: 7.3. Other Comparison Operators





    share|improve this answer


















    • 1




      Or for explicit logic: [[ -z $DISPLAY && -z $WAYLAND_DISPLAY ]]
      – Dennis Williamson
      May 21 at 21:00














    up vote
    13
    down vote



    accepted










    You can use the environment variable $DISPLAY as trigger within a if condition. Usually when this variable has a value you are able to run graphical applications.



    Here is a bash example:





    if [[ -z $DISPLAY ]]
    then
    nano
    else
    gedit
    fi


    The operator -z will return true when the envvar $DISPLAY is empty and your script will run nano, in all other cases it will run gedit.




    According to the this comment of @vurp0:




    On most modern Wayland desktops (like the default desktop in Fedora
    and Ubuntu), $DISPLAY is still set due to backwards compatibility
    (through XWayland), but for a more robust script it would be good to
    test for both $DISPLAY and $WAYLAND_DISPLAY to be sure.




    I would suggest to modify the test expression in the following way:



    [[ -z $DISPLAY$WAYLAND_DISPLAY ]]


    Thus, the values of the two variables will be concatenated into a common string, which will be processed by the operator -z.




    References:



    • Advanced Bash-Scripting Guide: 7. Tests

    • Advanced Bash-Scripting Guide: 7.1. Test Constructs

    • Advanced Bash-Scripting Guide: 7.3. Other Comparison Operators





    share|improve this answer


















    • 1




      Or for explicit logic: [[ -z $DISPLAY && -z $WAYLAND_DISPLAY ]]
      – Dennis Williamson
      May 21 at 21:00












    up vote
    13
    down vote



    accepted







    up vote
    13
    down vote



    accepted






    You can use the environment variable $DISPLAY as trigger within a if condition. Usually when this variable has a value you are able to run graphical applications.



    Here is a bash example:





    if [[ -z $DISPLAY ]]
    then
    nano
    else
    gedit
    fi


    The operator -z will return true when the envvar $DISPLAY is empty and your script will run nano, in all other cases it will run gedit.




    According to the this comment of @vurp0:




    On most modern Wayland desktops (like the default desktop in Fedora
    and Ubuntu), $DISPLAY is still set due to backwards compatibility
    (through XWayland), but for a more robust script it would be good to
    test for both $DISPLAY and $WAYLAND_DISPLAY to be sure.




    I would suggest to modify the test expression in the following way:



    [[ -z $DISPLAY$WAYLAND_DISPLAY ]]


    Thus, the values of the two variables will be concatenated into a common string, which will be processed by the operator -z.




    References:



    • Advanced Bash-Scripting Guide: 7. Tests

    • Advanced Bash-Scripting Guide: 7.1. Test Constructs

    • Advanced Bash-Scripting Guide: 7.3. Other Comparison Operators





    share|improve this answer














    You can use the environment variable $DISPLAY as trigger within a if condition. Usually when this variable has a value you are able to run graphical applications.



    Here is a bash example:





    if [[ -z $DISPLAY ]]
    then
    nano
    else
    gedit
    fi


    The operator -z will return true when the envvar $DISPLAY is empty and your script will run nano, in all other cases it will run gedit.




    According to the this comment of @vurp0:




    On most modern Wayland desktops (like the default desktop in Fedora
    and Ubuntu), $DISPLAY is still set due to backwards compatibility
    (through XWayland), but for a more robust script it would be good to
    test for both $DISPLAY and $WAYLAND_DISPLAY to be sure.




    I would suggest to modify the test expression in the following way:



    [[ -z $DISPLAY$WAYLAND_DISPLAY ]]


    Thus, the values of the two variables will be concatenated into a common string, which will be processed by the operator -z.




    References:



    • Advanced Bash-Scripting Guide: 7. Tests

    • Advanced Bash-Scripting Guide: 7.1. Test Constructs

    • Advanced Bash-Scripting Guide: 7.3. Other Comparison Operators






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited May 21 at 18:57

























    answered May 21 at 12:28









    pa4080

    11.8k52255




    11.8k52255







    • 1




      Or for explicit logic: [[ -z $DISPLAY && -z $WAYLAND_DISPLAY ]]
      – Dennis Williamson
      May 21 at 21:00












    • 1




      Or for explicit logic: [[ -z $DISPLAY && -z $WAYLAND_DISPLAY ]]
      – Dennis Williamson
      May 21 at 21:00







    1




    1




    Or for explicit logic: [[ -z $DISPLAY && -z $WAYLAND_DISPLAY ]]
    – Dennis Williamson
    May 21 at 21:00




    Or for explicit logic: [[ -z $DISPLAY && -z $WAYLAND_DISPLAY ]]
    – Dennis Williamson
    May 21 at 21:00












    up vote
    7
    down vote













    Typically virtual terminals use /dev/pts pseudo-terminals. So, based on the output of tty command, we can build a simple case statement to handle opening particular editor:



    case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac


    Or formatted more nicely:



    case "$(tty)" in
    "/dev/pts"*) gedit ;;
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
    esac


    Compared to using environment variables, this is slightly more reliable and considering it uses case statement with tty command slightly more portable. What probably would be best is to combine both, with extra testing, such as "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;






    share|improve this answer






















    • Isn't this the wrong way around? On my Ctrl+Alt+F1 console, tty gives /dev/tty1, whereas gnome-terminal (first tab) gives /dev/pts/0.
      – Paddy Landau
      May 29 at 11:25










    • @PaddyLandau Yes, gedit should be in /dev/pts* case. I switched them around while error testing in tty and ended up copying it here without switching back. Thanks, edited already.
      – Sergiy Kolodyazhnyy
      May 29 at 14:40














    up vote
    7
    down vote













    Typically virtual terminals use /dev/pts pseudo-terminals. So, based on the output of tty command, we can build a simple case statement to handle opening particular editor:



    case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac


    Or formatted more nicely:



    case "$(tty)" in
    "/dev/pts"*) gedit ;;
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
    esac


    Compared to using environment variables, this is slightly more reliable and considering it uses case statement with tty command slightly more portable. What probably would be best is to combine both, with extra testing, such as "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;






    share|improve this answer






















    • Isn't this the wrong way around? On my Ctrl+Alt+F1 console, tty gives /dev/tty1, whereas gnome-terminal (first tab) gives /dev/pts/0.
      – Paddy Landau
      May 29 at 11:25










    • @PaddyLandau Yes, gedit should be in /dev/pts* case. I switched them around while error testing in tty and ended up copying it here without switching back. Thanks, edited already.
      – Sergiy Kolodyazhnyy
      May 29 at 14:40












    up vote
    7
    down vote










    up vote
    7
    down vote









    Typically virtual terminals use /dev/pts pseudo-terminals. So, based on the output of tty command, we can build a simple case statement to handle opening particular editor:



    case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac


    Or formatted more nicely:



    case "$(tty)" in
    "/dev/pts"*) gedit ;;
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
    esac


    Compared to using environment variables, this is slightly more reliable and considering it uses case statement with tty command slightly more portable. What probably would be best is to combine both, with extra testing, such as "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;






    share|improve this answer














    Typically virtual terminals use /dev/pts pseudo-terminals. So, based on the output of tty command, we can build a simple case statement to handle opening particular editor:



    case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac


    Or formatted more nicely:



    case "$(tty)" in
    "/dev/pts"*) gedit ;;
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
    esac


    Compared to using environment variables, this is slightly more reliable and considering it uses case statement with tty command slightly more portable. What probably would be best is to combine both, with extra testing, such as "/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited May 29 at 14:38

























    answered May 22 at 10:08









    Sergiy Kolodyazhnyy

    64k9127274




    64k9127274











    • Isn't this the wrong way around? On my Ctrl+Alt+F1 console, tty gives /dev/tty1, whereas gnome-terminal (first tab) gives /dev/pts/0.
      – Paddy Landau
      May 29 at 11:25










    • @PaddyLandau Yes, gedit should be in /dev/pts* case. I switched them around while error testing in tty and ended up copying it here without switching back. Thanks, edited already.
      – Sergiy Kolodyazhnyy
      May 29 at 14:40
















    • Isn't this the wrong way around? On my Ctrl+Alt+F1 console, tty gives /dev/tty1, whereas gnome-terminal (first tab) gives /dev/pts/0.
      – Paddy Landau
      May 29 at 11:25










    • @PaddyLandau Yes, gedit should be in /dev/pts* case. I switched them around while error testing in tty and ended up copying it here without switching back. Thanks, edited already.
      – Sergiy Kolodyazhnyy
      May 29 at 14:40















    Isn't this the wrong way around? On my Ctrl+Alt+F1 console, tty gives /dev/tty1, whereas gnome-terminal (first tab) gives /dev/pts/0.
    – Paddy Landau
    May 29 at 11:25




    Isn't this the wrong way around? On my Ctrl+Alt+F1 console, tty gives /dev/tty1, whereas gnome-terminal (first tab) gives /dev/pts/0.
    – Paddy Landau
    May 29 at 11:25












    @PaddyLandau Yes, gedit should be in /dev/pts* case. I switched them around while error testing in tty and ended up copying it here without switching back. Thanks, edited already.
    – Sergiy Kolodyazhnyy
    May 29 at 14:40




    @PaddyLandau Yes, gedit should be in /dev/pts* case. I switched them around while error testing in tty and ended up copying it here without switching back. Thanks, edited already.
    – Sergiy Kolodyazhnyy
    May 29 at 14:40










    up vote
    3
    down vote













    This is what I've been using:





    # $TERM variable may be missing when called via desktop shortcut
    CurrentTERM=$(env | grep TERM)
    if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
    fi


    The reason for this code was this question: Desktop shortcut to Bash script crashes and burns



    You can modify it to look like this:



    # $TERM variable may be missing when called via desktop shortcut
    CurrentTERM=$(env | grep TERM)
    if [[ $CurrentTERM == "" ]] ; then
    nano ...
    else
    gedit ...
    fi





    share|improve this answer


























      up vote
      3
      down vote













      This is what I've been using:





      # $TERM variable may be missing when called via desktop shortcut
      CurrentTERM=$(env | grep TERM)
      if [[ $CurrentTERM == "" ]] ; then
      notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
      exit 1
      fi


      The reason for this code was this question: Desktop shortcut to Bash script crashes and burns



      You can modify it to look like this:



      # $TERM variable may be missing when called via desktop shortcut
      CurrentTERM=$(env | grep TERM)
      if [[ $CurrentTERM == "" ]] ; then
      nano ...
      else
      gedit ...
      fi





      share|improve this answer
























        up vote
        3
        down vote










        up vote
        3
        down vote









        This is what I've been using:





        # $TERM variable may be missing when called via desktop shortcut
        CurrentTERM=$(env | grep TERM)
        if [[ $CurrentTERM == "" ]] ; then
        notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
        exit 1
        fi


        The reason for this code was this question: Desktop shortcut to Bash script crashes and burns



        You can modify it to look like this:



        # $TERM variable may be missing when called via desktop shortcut
        CurrentTERM=$(env | grep TERM)
        if [[ $CurrentTERM == "" ]] ; then
        nano ...
        else
        gedit ...
        fi





        share|improve this answer














        This is what I've been using:





        # $TERM variable may be missing when called via desktop shortcut
        CurrentTERM=$(env | grep TERM)
        if [[ $CurrentTERM == "" ]] ; then
        notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
        exit 1
        fi


        The reason for this code was this question: Desktop shortcut to Bash script crashes and burns



        You can modify it to look like this:



        # $TERM variable may be missing when called via desktop shortcut
        CurrentTERM=$(env | grep TERM)
        if [[ $CurrentTERM == "" ]] ; then
        nano ...
        else
        gedit ...
        fi






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited May 22 at 12:25

























        answered May 22 at 12:05









        WinEunuuchs2Unix

        34.5k756131




        34.5k756131






















             

            draft saved


            draft discarded


























             


            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1038684%2fhow-to-have-script-detect-if-terminal-emulator-is-running-in-a-desktop-session-o%23new-answer', 'question_page');

            );

            Post as a guest













































































            Popular posts from this blog

            pylint3 and pip3 broken

            Missing snmpget and snmpwalk

            How to enroll fingerprints to Ubuntu 17.10 with VFS491