交互式 bash shell:通过命令行选项设置工作目录

交互式 bash shell:通过命令行选项设置工作目录

简单的问题是:我需要在某个目录中启动交互式 bash,并且我可以编写启动 bash 的命令,但我无法修改系统。目前,最适合我需要的命令是

bash -c 'cd some-directory; bash'

也就是说,我调用 bash,cd在 bash 中使用,然后在其中创建 bash 的子实例来处理我的交互式 bash。

我知道这不是世界上最令人震惊的 bash 用法,但我觉得很奇怪。有没有更简单的方法来完成我正在寻找的事情?


只是为了不必要的上下文:

这是我的工具的一部分,用于通过 docker-compose 在 docker 实例(使用 docker exec)中启动 shell。我可以发现自己位于代表项目的大约 15 个 docker 容器中的任何一个中 - 其中一些有一个我想要进入的“默认”目录,而另一些则不想。该工具旨在弥合差距,并为我提供从一个项目切换到另一个项目的更顺畅的体验。

我尝试过一些我认为可能有效但不包括的事情:

  • PWD='~/some/directory' bash- 这只是被忽略
  • bash -i -c "cd ~/some/directory- 它创建一个标记为交互式的 shell,但不会像普通交互式 shell 那样等待任何输入。
  • echo "cd ~/some/directory" | bash --rcfile -"值得一试

我知道有些事情会起作用,但在我的情况下不起作用:

  • 更改工作目录,然后启动我的命令:我在 docker 中,所以主机的工作目录并不重要。我很好奇 bash 如何知道父 shell 的当前工作目录是什么。
  • docker-compose确实有一个-w将采用绝对路径,但不知道如何处理波浪号。
  • cd ~/some/directory ; bash- docker-compose 需要一个实际的可执行文件
  • 将其放入容器中的 rcfile 中,或创建一个“启动器”脚本:有点有效,但我希望能够从外部配置它,并且不想编辑每个容器

那么有没有办法设置我忽略的初始目录,或者这就是它的完成方式?我知道诸如 Gnome 的“在终端中打开文件夹”之类的 shell 集成必须做一些事情来告诉 bash 从哪个文件夹开始,但我无法弄清楚它使用了什么魔法。

答案1

使用“exec”替换当前的shell是一个微小的改进,即

    bash -c 'cd somedirectory && exec bash -i'

你可以把类似的东西

if [ -n "$STARTDIR" ] ; then
    cd "$STARTDIR"
    unset STARTDIR
fi

在你的 ~/.bashrc 中,然后使用

    STARTDIR="/some/directory" bash

您可以将其放在不同的文件中并使用bash --rcfile ~/changedir

在终端中打开文件夹的程序要么要求“终端”执行 cd,要么运行一系列系统调用,例如fork, chdir /some/directoryexec terminal而不是要求 shell 执行某些操作。

相关内容