36

I've got a problem. I'm searching for long time for this answer - how can I run command in new bash shell and stay in this NEW shell after this commands executes. So for example:

bash -c "export PS1='> ' && ls"

will make new shell, export PS1, list directories and ... will exit to my current shell. I want to stay in the new one.

Ciro Santilli OurBigBook.com
  • 347,512
  • 102
  • 1,199
  • 985
Wojciech Danilo
  • 11,573
  • 17
  • 66
  • 132
  • 1
    can you explain us what you're trying to achieve. Maybe there're other way to do it. – dimba Aug 25 '11 at 15:27
  • @dimba I can't speak for danilo, but in my case I'm trying to ssh into my web server, cd into the app directory, and open a rails console for that app. – Derek Dahmer Jul 19 '13 at 18:11
  • possible duplicate of [Invoke bash, run commands inside new shell, then give control back to user](http://stackoverflow.com/questions/7120426/invoke-bash-run-commands-inside-new-shell-then-give-control-back-to-user) – Ciro Santilli OurBigBook.com Apr 09 '14 at 18:47

3 Answers3

41

You can achieve something similar by abusing the --rcfile option:

bash --rcfile <(echo "export PS1='> ' && ls")

From bash manpage:

--rcfile file

Execute commands from file instead of the system wide initialization file /etc/bash.bashrc and the standard personal initialization file ~/.bashrc if the shell is interactive

Shawn Chin
  • 84,080
  • 19
  • 162
  • 191
2

For the case where the initial set of command is static and contain multiple commands, it is usually easier to use here documents to pass the initial commands, instead of constructing a script with series of echo commands.

This approach helps when the commands contain quotes, or various expansions. With the quoted here-documents (the 3<<'__INIT__' ... '__INIT__') variant, no expansion of the here document text is performed, eliminating the need to quote specific part of the commands.

Instead of

bash --rcfile <(echo "export PS1='> ' && ls && command1 && command2")

Use

bash --rcfile /dev/fd/3 3<<'__INIT__'
export PS1='> '
ls
command1
command2
__INIT__
dash-o
  • 13,723
  • 1
  • 10
  • 37
-1

The lazy one:

bash -c "export PS1='> ' && ls; bash"
dimba
  • 26,717
  • 34
  • 141
  • 196