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

时间:2014-03-20 17:31:32

标签: shell fish

我正在从bash切换到fish,但是我很难移植我经常使用的便利功能。这个函数的目的是从我的源代码树的根目录运行make,无论我的shell目前在哪个目录。

在bash中,这只是:

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

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

function omake
    pushd
    cd $SOURCE_ROOT
    make $argv
    popd
end

这有效,但有一点需要注意,在使用^ C中断鱼版本后,shell仍然在$ SOURCE_ROOT中,但是中断bash版本会让我回到原始目录中。

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

3 个答案:

答案 0 :(得分:3)

这就像我可以进入子shell一样接近:

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

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

echo (cd /tmp; and sleep 15)

然而,鱼有一个非常好的方法来找到背景过程的pid:

function omake
    pushd dir1
    make $argv &
    popd
end

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

答案 1 :(得分:0)

具体来说,对于.click('.discover-athletes .discover-card-load-more') ,您可以使用其make选项:

-C

许多其他程序采用function omake make -C $SOURCE_ROOT $argv end 选项。在我的头顶:忍者,git

否则,无论如何,如果你满足于子shell,那么独立的脚本就可以为你提供这样的好处,你可以用任何语言编写它,从Python到C,并且不需要重写它。想改变你的shell。

这可以用任何语言写成:

-C

然而,真正让我烦恼的是#!/usr/bin/env fish cd $SOURCE_ROOT and exec make $argv -C选项的公然遗漏! Env可以设置环境变量并运行程序;显然,能够设置工作目录也是 nice !这是一个基本的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 "$@" 命令,你的omake函数就像:

一样简单
cdrun

function omake
    cdrun $SOURCE_ROOT make $argv
end

答案 2 :(得分:0)

如果您使用的是GNU coreutils,则可以使用<B />进行此操作(因为建议使用user2394284会很好)。

const wrapper = shallow(<MyComponent foo={1} bar={2} />);
expect(wrapper.find('A').props().foo).toEqual(1);
expect(wrapper.find('B').props().bar).toEqual(2);

这将很好地在名为env的子目录中运行env -C foo pwd 。通常,它可以与鱼很好地交互,例如可以很好地与背景进行交互

Airbnb docs说:

  

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