How to get default shell

前端 未结 5 688
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-08 02:56

We can run something like chsh -s /usr/local/bin/zsh to set a new default shell. Is there a command we can run to know what that shell is?

I don’t mean

相关标签:
5条回答
  • 2020-12-08 03:06

    if you want to get the default shell of a user, you could grep the /etc/passwd. like:

    kent$  grep "$USER" /etc/passwd
    kent:x:1000:1000::/home/kent:/bin/zsh
    

    telling me that the current user (kent) has default shell /bin/zsh

    if you just want to catch the shell part:

    kent$  awk -F: -v u="$USER" 'u==$1&&$0=$NF' /etc/passwd
    /bin/zsh
    

    If you want to get the default shell of other user, just replace the $USER part.

    0 讨论(0)
  • 2020-12-08 03:10

    For macOS:

    dscl . -read /Users/username UserShell
    

    For the current macOS user:

    dscl . -read ~/ UserShell
    

    To parse the path inline using sed:

    dscl . -read ~/ UserShell | sed 's/UserShell: //'
    

    Using $SHELL will report the current login shell, not the default login shell. In certain cases, these are not the same. For example, when working in an IDE such as Visual Studio Code which opens an integrated terminal without consulting the default shell.

    In addition, as pointed out by Martin C. Martin, $SHELL is a constant that will not change after chsh changes the default login shell.

    0 讨论(0)
  • 2020-12-08 03:16

    In OS X, using the command env | grep -i 'SHELL' produces an output such as: SHELL=/bin/sh (as root, however regular users tend to have /bin/bash as default shell) with a little parsing, the path the shell (and thus the shell itself) could be easily identified and extracted from there..

    0 讨论(0)
  • 2020-12-08 03:22

    You can grep in the /etc/passwd file for current username, and use cut to extract the appropriate column of information:

    grep ^$(id -un): /etc/passwd | cut -d : -f 7-
    

    $(id -un) is a safer than $USER to get user name. Using ^ in front of user name and : after makes sure you don't get a false match if your user name is a sub section of someone else user name.

    $SHELL can also be used, as suggested. However it won't work if chsh was used in current shell, as the variable is not updated. Also the variable is not protected against being changed, so it can theoretically be set to something completely different.

    Update to attempt an OS X compatible solution. Probably not optimal regexp:

    grep ^.*:.*:$(id -u): /etc/passwd | cut -d : -f 7-
    

    This is based on user id's. If the whole user entry is missing, not only user name, then osx must store this somewhere else.

    0 讨论(0)
  • 2020-12-08 03:28

    you can use the following command echo $SHELL

    0 讨论(0)
提交回复
热议问题