在fish函数中更改目录并在中止后返回到原始目录

Tik*_*iki 7 shell fish

我正在从bash转换为fish,但是在移植我经常使用的便利功能时遇到了麻烦。此功能的重点是从源代码树的根目录运行make,而不管shell当前位于哪个目录中。

在bash中,这很简单:

function omake {(
  cd $SOURCE_ROOT;
  make $@;
)}
Run Code Online (Sandbox Code Playgroud)

由于鱼没有子壳,所以我能做的最好的事情是:

function omake
    pushd
    cd $SOURCE_ROOT
    make $argv
    popd
end
Run Code Online (Sandbox Code Playgroud)

这是可行的,但需要注意的是,使用^ C中断fish版本后,shell仍位于$ SOURCE_ROOT中,但是中断bash版本会使我回到原始目录中。

有没有一种方法可以编写与鱼中的bash相同的脚本?

gle*_*man 5

这是尽可能接近子shell:

function omake
    echo "cd $SOURCE_ROOT; and make \$argv" | fish /dev/stdin $argv
end
Run Code Online (Sandbox Code Playgroud)

进程替换似乎不可中断:Ctrl-C 不会停止此睡眠 cmd

echo (cd /tmp; and sleep 15)
Run Code Online (Sandbox Code Playgroud)

但是,fish 有一种非常好的方法来查找后台进程的 pid:

function omake
    pushd dir1
    make $argv &
    popd
end
Run Code Online (Sandbox Code Playgroud)

然后,要停止 make,而不是 Ctrl-C,请执行 kill %make


Sam*_*son 5

如果您正在使用 GNU coreutils,则可以使用它env来执行此操作(如 user2394284 所建议的那样会很好)。

\n\n
env -C foo pwd\n
Run Code Online (Sandbox Code Playgroud)\n\n

pwd这将在一个名为nicely的子目录中运行foo。这通常与鱼互动得很好,例如它可以很好地作为背景

\n\n

文档说

\n\n
\n

在调用命令之前将工作目录更改为 dir。这与 shell 内置 cd 的不同之处在于,它作为子进程启动命令,而不是更改 shell\xe2\x80\x99s 自己的工作目录;这允许它与在不同上下文中运行命令的其他命令链接。

\n
\n