Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

i'd like to start zsh similar to

zsh -c 'my_prog option1 option2'

but instead of exiting after running that command, leaving me at the propt of the invoked zsh (not wherever it is being called from). one particular use-case for this is in screenrc files, you could do something like:

screen -t my_prog 0 zsh -c 'my_prog opt1 opt2'

and after running that command you're left with a shell there instead of it closing.

share|improve this question
up vote 14 down vote accepted

Not that I would advise doing this.

(sirius)~: zsh -c 'print hello; zsh -i'
hello
(sirius)~: echo $SHLVL
2

There are other tricks you can play with screen and using the $STY variable.

If you want something run from zsh with individual screens, you can check the $STY variable within your .zshrc or .zlogin. It is in the format <PID>.<TTY>.<HOSTNAME>.

if [[ -n $STY ]] then
  if [[ -f ~/.zsh-$STY[(ws:.:)2] ]] then
    . ~/.zsh-$STY[(ws:.:)2]
  fi
fi

If in screen, and if ~/.zsh-<TTY> (from the $STY variable) exists, source that, then continue on your merry way. You can also set an environment variable before calling the interactive shell.

> FOO=bar zsh -i
> env | grep FOO
FOO=bar

> RUNTHISCOMMAND=/path/to/script zsh -i
.zshrc:
if [[ -n $RUNTHISCOMMAND ]] then
   $RUNTHISCOMMAND
fi

Add those checks into your .zshrc/.zlogin.

share|improve this answer
    
kudos for teaching me about SHLVL – NicDumZ Jan 6 '10 at 5:00
    
i was hoping to avoid the nested shell, but oh well. – Autoplectic Jan 6 '10 at 9:24

I found a solution that works without an extra shell here. Add:

if [[ $1 == eval ]]
then
    "$@"
set --
fi

to .zshrc, then call zsh with

zsh -is eval 'your shell command here'

Really great for starting up lots of shells at once.

share|improve this answer

What about appending ; exec zsh to the command? That way there's only one shell left at the end.

share|improve this answer
3  
You actually don't need the exec if you ; zsh -i, it does that for you already. – Darren Hall Jan 6 '10 at 17:47

I have eval "$RUN" at the end of my .zshrc. I can now run commands without the extra shell, with:

RUN='my_prog opt1 opt2' zsh
share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .