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

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

我读了问题和答案,但它并不完全适合我的问题,即使它很相似。

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

$ cpj blah

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

我引用的问题说您不能直接更改运行脚本的 shell 的环境,但您可以获取脚本并且它会这样做。

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

cd $1

如果我从命令行执行以下操作:

$ . chcwd $PROJDIR

我当前的工作目录将根据我的意愿进行更改。另一方面,如果从我的 cpj 脚本中得到相同的行:

. chcwd $PROJECT

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

答案1

你不能鱼与熊掌兼得。这里发生的两件事是在新 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
}

答案2

我有类似的脚本供我个人使用。有一个非常简单的技巧可以实现在脚本内更改工作目录。首先编写你的脚本,例如:

#!/bin/bash

case $1 in
     project1) cd /home/me/work/customer1/project1
     ;;
     project2) cd /home/me/work/customer2/project1
     ;;
     project3) cd /home/me/work/customer3/project2
     ;;
     project4) cd /home/me/work/customer4/project5
     ;;
     *) echo "Usage: cdto cd_profile_name"
     ;;
esac

现在假设该脚本名为“cdto”。要使其正常工作,您必须在当前 shell 中获取它,这可以通过“source”或“.”来实现。命令(两者相同)。例如:

. cdto project1

现在为了更方便:

  1. 将“cdto”脚本复制到您帐户的“bin”目录(例如/home/johnsmith/bin - 如果不存在则创建它)。检查您的 PATH 变量以确保包含“bin”目录:

    回显$PATH

如果没有,请编辑您的 .profile 文件并添加:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. 将别名添加到 .bashrc 或 .bash_aliases 文件:

    别名 cdto='. cdto'

一切都完成了。下次登录后或打开新终端时,您可以使用 in.ex:

cdto project1

享受 :-)

塞巴斯蒂安·皮耶希

答案3

一个简单的技巧可以做到这一点:

pushd $PROJDIR && bash

现在工作目录是 $PROJECT 。

相关内容