是否可以在子shell中执行一些命令而不立即退出?

hug*_*omg 5 shell fish exec

我使用fish shell,并希望能够“获取”一些用sh兼容语法编写的shell脚本,而fish无法读取这些脚本。例如,许多软件希望您提供一些 shell 脚本来导出有用的环境变量:

# customvars.sh
FOOBAR=qwerty
export FOOBAR
Run Code Online (Sandbox Code Playgroud)

如果我不关心保留局部变量和函数定义,一种解决方法是使用 exec 用 /bin/sh 替换当前进程,然后返回到fish

# We start out on fish
exec /bin/sh
Run Code Online (Sandbox Code Playgroud)
# Running a POSIX shell now
. customvars.sh
exec /usr/bin/fish
Run Code Online (Sandbox Code Playgroud)
# Back on fish
echo $FOOBAR
Run Code Online (Sandbox Code Playgroud)

有没有办法将这种模式归结为一个单行代码,我可以将其保存在某个函数中?如果我尝试做

exec /bin/sh -c '. vars.sh; /usr/bin/fish'
Run Code Online (Sandbox Code Playgroud)

我的终端模拟器窗口立即关闭,而不是带我回到交互式鱼提示。

hug*_*omg 1

对于使用 POSIX 兼容的 shell 语言设置环境变量的脚本并希望在 Fish 中使用它们的特定问题,一种现有的解决方案是Bass。该脚本的工作原理与 terdon 的答案类似,但可以处理更多的极端情况。