启动子shell然后运行命令

启动子shell然后运行命令

假设我有一个始终从交互式 shell 运行的脚本。我希望这个脚本启动一个交互式子shell,它是父级的副本(即保留所有环境变量等),然后运行任意命令(具体来说,我想修改PS1和定义一些别名)。我需要一个真正的子shell(而不是使用source,否则脚本完成后环境变量将不会保留)它需要与 shell 无关(即与 bash、zsh 等一起使用)

到目前为止,我能够完成此任务的唯一方法是使用expect.这有点可怕,但它确实有效:

expect <(cat <<-EXPECT
  spawn $SHELL
  send "export FOO=\"$foo\"\r"
  send "PS1=\"(foo:$FOO) \\\$PS1\"\r"
  send "alias foo=\"do_somthing --foo=$FOO\"\r"
  send "clear\r"
  interact
EXPECT)

有没有更好的办法? (我还注意到这种方法似乎引入了屏幕重绘和字符编码的问题。)

执行类似操作的问题PS1="$foo" $SHELL是,它PS1可能会被 shell 的全局文件和用户 .rc 文件覆盖。似乎没有一种与 shell 无关的方法来提供自定义 .rc 文件。

相关内容