使用脚本更改当前工作目录

bev*_*bev 8 shell cd-command

我已经阅读了这个问题和答案,但它并不适合我的问题,即使它很相似。

我正在编写一个脚本(称为 cpj),它将启动我当前的项目之一。我有大约 5 个。当我打字

$ cpj blah

我希望当前工作目录更改为 blah 项目目录(我保存在 $PROJDIR 中),并且我希望 emacsclient 打开该项目的主文件(我保存在 $MAINFILE 中)。

我引用的问题说你不能直接改变运行脚本的 shell 的环境,但你可以获取一个脚本,它会这样做。

为了测试这一点,我编写了一个 shell 脚本(称为 chcwd),其中有一行:

cd $1

如果,从命令行我做:

$ . chcwd $PROJDIR

我当前的工作目录将根据需要更改。另一方面,如果从我的 cpj 脚本中,我有相同的行:

. chcwd $PROJECT

它不会改变 shell 的当前工作目录。我意识到我正在运行 2 个脚本(cpj,然后是 chcwd),因此创建了 2 个 shell,但我看不出有什么办法可以完成我想要的。谁能告诉我如何实现我的目标?

Cal*_*leb 11

你不能让你的蛋糕也吃它。这里发生的两件事是在新 shell 中执行脚本和导入要在当前 shell 中运行的脚本行。通过使用点运算符(它是source命令的别名),您实际上是在当前 shell 中运行代码。如果您的代码选择cd,完成后您将留在新目录中。

另一方面,如果您想执行一个程序(或脚本,没关系),该程序将作为子进程启动。在 shell 脚本的情况下,将打开一个新的 shell 并在其中运行代码。cd采取的任何操作都将更改该 shell 的当前工作目录,对要遵循的任何命令有效。作业完成后,shell 将退出,让您返回原始(且未修改)的 shell。

如果您经常使用它,并且希望将其效果保留在当前的 shell 中,也许您可​​以将“脚本”编写为 shell 函数,并将其保存在您的 ~/.profile 或其他 shell rc 文件中。

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}
Run Code Online (Sandbox Code Playgroud)