影响启动它的交互式外壳的脚本

时间:2018-07-11 04:15:39

标签: linux bash function alias subshell

我编写此脚本是为了能够快速进入ls输出中的n:th目录:

#!/usr/bin/env bash
# cd to the nth directory in a list as produced by ls
cd $( ls | head -n$1 | tail -n1 )

我将其命名为cde并使其可执行(在我的$ PATH中),因此现在我可以使用

. cde 3

例如,更改为3:rd目录(即,我找到它)。因为bash如何为脚本创建子shell,所以我不能像这样

执行它
cde 3

因为仅影响子外壳程序的目录。

您将如何摆脱必须写多余的点并仍然获得期望的行为?

我会为此使用别名而不是脚本,但是由于不知道如何将参数传递给别名,因此我无法弄清楚该怎么办。

1 个答案:

答案 0 :(得分:3)

使用函数代替脚本或别名!

函数比别名更灵活,并且不像执行脚本那样创建子shell。因此,目录的更改将影响您的交互式(“当前”)外壳。

您可以这样定义一个函数:

# cd to the nth directory in a list as produced by ls
function cde {
cd $( ls | head -n$1 | tail -n1 )
}

将功能定义放入〜/ .bash_aliases文件(或在终端启动时获取的其他文件,如〜/ .bashrc)中,而无需在每个会话中手动定义它。

它将为您提供所需的行为。