【问题标题】:Script that affects the interactive shell that launched it [duplicate]影响启动它的交互式shell的脚本[重复]
【发布时间】:2018-07-11 04:15:39
【问题描述】:

我编写这个脚本是为了能够快速转到 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

因为只有子shell的目录受到影响。

您将如何做才能摆脱编写额外的点并仍然获得所需的行为?

我会为此使用别名而不是脚本,但我不知道如何将参数传递给别名。

【问题讨论】:

  • “因为只有子shell的目录受到影响”您能否在答案中添加更多详细信息?
  • 添加了一个关于子外壳与交互式外壳的句子(或者在这种情况下将其称为“父外壳”或其他名称更好?)。那是你想要的,还是有别的?

标签: linux bash function alias subshell


【解决方案1】:

使用函数而不是脚本或别名!

函数比别名更灵活,并且不会像执行脚本那样创建子shell。因此,目录的更改将影响您的交互式(“当前”)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)中,你不必在每个会话中手动定义它。

它会给你想要的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 2015-06-29
    • 1970-01-01
    • 2016-05-29
    • 2012-09-19
    • 1970-01-01
    • 2022-07-29
    • 2017-06-04
    相关资源
    最近更新 更多