Shell при запуске linux

How do I make Bash my default shell on Ubuntu?

I have a .bash_profile in my home directory, but it isn’t getting run on login. If I do the following, then things seem to be as I expect:

ssh myhost bash source ~/.bash_profile 

Also make sure that you don’t have a ~/.profile or ~/.bash_login , as only one of the three is sourced. (I forgot the exact order.)

9 Answers 9

Enter your password and state the path to the shell you want to use.

For Bash that would be /bin/bash . For Zsh that would be /usr/bin/zsh .

+1 — not sure why the OP decided that editing the password file was a better choice, but this is the best answer

On top of akira’s answer, you can also edit your /etc/passwd file to specify your default shell.

You will find a line like this example:

john:x:1000:1000:john. /home/john:/bin/sh 

The shell is specified at the end.

Better to use the ‘chsh’ command as suggested by akira — less chance to screw something up by mistake.

But if you so have access to modifying the /etc/passwd and you’re careful, John’s answer is making good use of the tools the system provides.

If you’re running a server without user passwords — providing access only through public/private ssh keys . it also makes a lot of sense. chsh requires a password.

$ sudo usermod -s /bin/bash username 
 -s, --shell SHELL new login shell for the user account 

(1) What do you mean by “enable bash”? (2) The user wants to change his own login shell on a remote system. Why do you assume that he has sudo access on that system? Why do you provide instructions in terms of changing another user’s login shell?

Читайте также:  Linux filesystem block size

You might check your terminal program. It might be configured to run /bin/sh rather than /bin/bash

Bash executes .bash_profile only for login sessions. .bashrc is executed for all bash sessions, not only login sessions. Try sourcing .bash_profile from .bashrc (avoid circular dependency!) or configuring your terminal program to run /bin/bash -l as a shell program.

terminal program has nothing to do with the problem because it is the sshd on the remote machine, which spawns the new shell.

To make any shell your default, first verify it is installed and recognized on your computer by looking at the contents of /etc/shells :

$ cat /etc/shells # /etc/shells: valid login shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash /usr/bin/rbash /bin/dash /usr/bin/dash /usr/bin/fish 

Then use chsh to change your shell:

$ sudo chsh -s /usr/bin/bash $(whoami) # or sudo chsh -s /bin/bash $(whoami) 

References

If you somehow don’t see your username in the /etc/passwd file [this is the case when your system is under control of some other domain e.g. in IT companies] Or it says «user not found» with chsh option than below process might help you.

The logic behind the below trick -> On Ubuntu, /bin/sh is dash. You can switch your system to using bash. On Ubuntu, /bin/sh is a symbolic link to dash. You can make it a symbolic link to bash instead.To change it, run

sudo dpkg-reconfigure dash

And press No to switch to bash.

Now, go to Terminal->Edit->preferences->Command and tick the checkbox with statement

One alternative is to rename your startup script into .profile. This file is being source by most Unix shells.

There’s not enough information in your question for me to say for sure, but I’ve hit the same problem before. Assuming you’ve already get /bin/bash set in your password entry, it may be the way your terminal launches.

If you’re trying to launch a GUI terminal, say gnome-terminal you may be expecting the shell to read your bash startup files. However, this doesn’t happen on Ubuntu and maybe other systems by default.

Читайте также:  Linux create folder and files

The way I’ve fixed it on Ubuntu is to edit the gnome-terminal preferences, and set the startup command to be bash -l . -l is short for —login . This tells bash to startup as as login shell, which causes it to load the startup scripts as you get when logging in via ssh.

I’m sure there’s a good rationale for this being the way it is, but I found it surprising and a more than a bit annoying as I share the same profiles across linux, cywgin and macos systems.

Источник

Запуск Bash в деталях

Если вы нашли эту страницу в поиске, то наверняка пытаетесь решить какую-то проблему с запуском bash.

Возможно, в вашем окружении bash не устанавливается переменная среды и вы не понимаете, почему. Возможно, вы засунули что-то в различные загрузочные файлы bash или в профили, или во все файлы наугад, пока это не сработало.

В любом случае, смысл этой заметки — как можно проще изложить процедуру запуска bash, чтобы вы могли справиться с проблемами.

Диаграмма

Эта блок-схема обобщает все процессы при запуске bash.

Теперь подробнее рассмотрим каждую часть.

Login Shell?

Сперва нужно выбрать, находитесь вы в командной оболочке входа (login shell) или нет.

Оболочка входа — это первая оболочка, в которую вы попадаете при входе в систему для интерактивного сеанса. Оболочка входа не требует ввода имени пользователя и пароля. Вы можете форсировать запуск оболочки входа, добавив флаг —login при вызове bash , например:

Оболочка входа настраивает базовую среду при первом запуске оболочки bash.

Интерактивный?

Затем вы определяете, является оболочка интерактивной или нет.

Это можно проверить по наличию переменной PS1 (она устанавливает функцию ввода команд):

if [ "$" ]; then echo interactive else echo non-interactive fi

Или посмотреть, установлен ли параметр -i , с помощью специальной переменной дефиса — в bash, например:

Если в выдаче есть символ i , то оболочка является интерактивной.

Читайте также:  Android ndk build linux

В оболочке входа?

Если вы находитесь в оболочке входа, то bash ищет файл /etc/profile и запускает, если он существует.

Затем ищет любой из этих трёх файлов в следующем порядке:

~/.bash_profile ~/.bash_login ~/.profile

Когда находит один, то запускает его и пропускает другие.

В интерактивной оболочке?

Если вы находитесь в интерактивной оболочке без входа в систему (non-login shell), предполагается, что вы уже побывали в оболочке входа, окружение настроено и будет унаследовано.

В этом случае выполняются по порядку следующие два файла, если они существуют:

Ни один вариант?

Если вы не находитесь ни в оболочке входа, ни в интерактивной оболочке, то ваше окружение действительно будет пустым. Это вызывает большую путаницу (см. ниже о заданиях cron).

В этом случае bash смотрит на переменную BASH_ENV вашей среды и выполняет соответствующий файл, который там указан.

Типичные трудности и эмпирические правила

Задания cron

У меня в 95% случаев отладка запуска bash связана с тем, что задание cron работает не так, как ожидалось.

Эта проклятая задача работает нормально, когда я запускаю её в командной строке, но фейлится при запуске в crontab.

  • Задания cron не являются интерактивными.
  • В отличие от скриптов в командной строке, задания cron не наследуют среду оболочки.

Вот почему зачастую приходится установить конкретный PATH для задачи cron, как здесь:

* * * * * PATH=$:/path/to/my/program/folder myprogram

Скрипты, вызывающие друг друга

Ещё одна распространенная проблема, когда скрипты по ошибке настроены на вызов друг друга. Например, /etc/profile обращается к ~/.bashrc .

Обычно так происходит, когда кто-то пытался исправить какую-то ошибку и вроде бы всё заработало. К сожалению, когда нужно разделить эти разные типы сессий, то возникают новые проблемы.

Образ Docker в песочнице

Чтобы поэкспериментировать с запуском оболочки, я создал образ Docker, который можно использовать для отладки запуска оболочки в безопасной среде.

$ docker run -n bs -d imiell/bash_startup $ docker exec -ti bs bash

Для принудительного логина и имитации оболочки входа:

Для проверки набора переменных BASH_ENV :

Для отладки crontab каждую минуту выполнятся простой скрипт (в /root/ascript ):

$ crontab -l $ cat /var/log/script.log

Источник

Оцените статью
Adblock
detector