10

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

在 bash 中,这很简单:

function omake {(
  cd $SOURCE_ROOT;
  make $@;
)}

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

function omake
    pushd
    cd $SOURCE_ROOT
    make $argv
    popd
end

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

有没有办法编写一个与鱼中的 bash 相同的脚本?

4

3 回答 3

5

这是尽可能接近子shell:

function omake
    echo "cd $SOURCE_ROOT; and make \$argv" | fish /dev/stdin $argv
end

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

echo (cd /tmp; and sleep 15)

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

function omake
    pushd dir1
    make $argv &
    popd
end

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

于 2014-03-20T19:18:33.340 回答
3

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

env -C foo pwd

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

文档说:

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

于 2018-12-06T11:47:43.960 回答
1

具体来说make,您可以使用它的-C选项:

function omake
    make -C $SOURCE_ROOT $argv
end

许多其他程序采用该-C选项。在我的头顶上:忍者,git

否则,如果您对 subshel​​l 感到满意,那么独立脚本可以满足您的需要,其好处是您可以用任何语言编写它,从 Python 到 C,并且在您想要更改时不必重写它你的壳。

这可以用任何语言编写:

#!/usr/bin/env fish
cd $SOURCE_ROOT
and exec make $argv

然而,真正困扰我的是-Cenv! env可以设置环境变量和运行程序;显然,能够设置工作目录也很好这是一个基本的cdrun脚本来弥补这一点:

#!/usr/bin/env fish
cd $argv[1]
and exec env $argv[2..-1]

或者

#!/bin/sh
set cd="$1"
shift
cd "$cd" &&
exec env "$@"

使用该cdrun命令,您的 omake 函数将非常简单:

function omake
    cdrun $SOURCE_ROOT make $argv
end

或者

omake() {
    cdrun "$SOURCE_ROOT" make "$@"
}
于 2016-04-15T21:48:23.150 回答