调用 zsh,让其运行命令,然后进入交互模式而不是退出

调用 zsh,让其运行命令,然后进入交互模式而不是退出

我想启动类似于

zsh -c 'my_prog option1 option2'

但是运行该命令后并没有退出,而是停留在被调用的 zsh 的 propt 处(而不是调用它的地方)。一个特定的用例是在 screenrc 文件中,你可以执行以下操作:

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

运行该命令之后,你会留在那里一个 shell,而不是关闭它。

答案1

我并不建议这么做。

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

您还可以使用屏幕和变量来玩其他技巧$STY

如果您希望从 zsh 运行某些具有单独屏幕的程序,您可以检查 .zshrc 或 .zlogin 中的 $STY 变量。其格式为<PID>.<TTY>.<HOSTNAME>

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

如果在屏幕上,并且如果~/.zsh-<TTY>(来自 $STY 变量)存在,则获取该变量,然后继续。您还可以在调用交互式 shell 之前设置环境变量。

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

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

将这些检查添加到您的 .zshrc/.zlogin 中。

答案2

我找到了一个不需要额外 shell 的解决方案这里。 添加:

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

到 .zshrc,然后使用以下命令调用 zsh

zsh -is eval 'your shell command here'

非常适合同时启动大量 shell。

答案3

那么附加; exec zsh到命令中怎么样?这样最后就只剩下一个 shell 了。

答案4

我的里面有这个.zshrc

alias uce='USE_CUSTOM_ENV=1 zsh'
if [[ "${USE_CUSTOM_ENV}" == "1" ]]; then
        alias a='stuff I need in this context'
        alias x='exit'
        ...

        PROMPT="${PROMPT}%{$terminfo[bold]$fg[red]%}[CUSTOM_ENV] %{$reset_color%}"
        my_prog option1 option2
fi

uce在命令行上调用时,将调用一个新的交互式子 shell,并my_prog执行。这种方法的优点是为我提供了针对特定上下文的自定义环境(具有别名、函数、环境变量等)。

相关内容