假设我有一个始终从交互式 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 文件。