是否可以以编程方式更改父 shell 的工作目录?

Jav*_*ran 9 shell bash cd-command

我想写一些代码来让我切换到一些我经常去的目录。说这个程序是mycd,/a/very/long/path/name是我要去的目录。

所以我可以简单地输入mycd 2而不是cd /a/very/long/path/name. 这里我假设mycd知道2是指那个/a/very/long/path/name。也可能有mycd 1, mycd 3, ... 等。

问题是我必须编写mycd一个 shell 脚本并输入. mycd 2来做所需的事情,否则脚本只会在子脚本中执行,这不会改变我真正关心的父 shell 的任何内容。

我的问题是:

  • 我可以不使用它source吗?因为. mycd假设mycd必须是一个 shell 脚本,这也可能会引入一些我不想要的功能。

  • 我可以用其他一些编程语言实现它吗?

gle*_*man 24

创建mycd一个函数,以便cd命令在您当前的 shell 中执行。将其保存在您的 ~/.bashrc 文件中。

function mycd {
    if (( $# == 0 )); then
        echo "usage: $FUNCNAME [1|2|3|...]"
        return
    fi
    case $1 in
        1) cd /tmp ;;
        2) cd /a/very/long/path/name ;;
        3) cd /some/where/else ;;
        *) echo "unknown parameter" ;;
    esac
}
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 9

您不能从另一个进程更改 shell 的当前目录。只有进程本身可以更改自己的当前目录。这也适用于其他一些特征,例如环境变量和文件描述符。

实际上有可能chdir通过ptrace系统调用执行系统调用来影响另一个进程的当前目录,这就是调试器工作的原因。但是,如果进程维护了一些内部数据结构,必须与实际的当前目录保持一致,则程序很可能会崩溃。对于shell,这种方法没有机会奏效。

您需要安排您的代码由 shell 本身执行。正常的处理方式是将其设置为 shell 函数并将其存储在您的~/.bashrc. 如果这是不可能的,例如因为它是您想要分发的代码,请编写一个包含函数定义的 shell 源文件,并告诉人们让他们的交互式 shell 使用.命令读取您的文件。


n.s*_*.st 5

正如您自己指出的那样,shell 脚本始终在子 shell 中执行,它不会影响其父 shell。

不过你可以...

  • 使用别名:
    alias mycd2='cd /a/very/long/path/name'
  • 让你的脚本1输出一个有效的 shell 命令......

    #!/bin/bash
    if [ "x$1" = "x2" ]
    then
        echo "cd /a/very/long/path/name"
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    ...并执行其输出: $(mycd 2)

1:您可能想要使用case语句而不是if示例中的条件。

  • 别名是可以通过的。脚本与他已经遇到的问题相同。这个问题*尖叫* shell 函数。 (5认同)