我读了这问题和答案,但它并不完全适合我的问题,即使它很相似。
我正在编写一个脚本(称为 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
现在为了更方便:
将“cdto”脚本复制到您帐户的“bin”目录(例如/home/johnsmith/bin - 如果不存在则创建它)。检查您的 PATH 变量以确保包含“bin”目录:
回显$PATH
如果没有,请编辑您的 .profile 文件并添加:
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
将别名添加到 .bashrc 或 .bash_aliases 文件:
别名 cdto='. cdto'
一切都完成了。下次登录后或打开新终端时,您可以使用 in.ex:
cdto project1
享受 :-)
塞巴斯蒂安·皮耶希
答案3
一个简单的技巧可以做到这一点:
pushd $PROJDIR && bash
现在工作目录是 $PROJECT 。