我正在从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相同的脚本?
答案 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
。通常,它可以与鱼很好地交互,例如可以很好地与背景进行交互
在调用命令之前将工作目录更改为dir。这与shell内置cd的不同之处在于,它作为子进程启动命令,而不是更改shell自己的工作目录。这样可以将它与在不同上下文中运行命令的其他命令链接起来。