用脚本更改当前工作目录


8

我已经阅读了这个问题和答案,但是即使是类似的问题也无法解决。

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

$ cpj blah

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

我引用的问题是,您不能直接更改运行脚本的shell的环境,但是可以提供脚本的源代码,并且可以这样做。

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

cd $1

如果从命令行执行:

$ . chcwd $PROJDIR

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

. chcwd $PROJECT

它不会更改外壳程序的当前工作目录。我意识到我正在运行2个脚本(cpj,然后是chcwd),因此创建了2个shell,但是我看不到要完成所需的任何方法。谁能告诉我如何实现我的目标?

Answers:


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
}

Caleb,谢谢您的输入。我喜欢你的双关语。您的第一段很好地重申了我在问题中所说的话。您的第二段重申了我很好地提到的问题中所说的内容。您的第三段正是我想要的!多谢,伙计。
2011年

2

我有类似的脚本供个人使用。在脚本中实现更改工作目录有一个非常简单的技巧。首先,只需在in.ex中编写脚本:

#!/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

请享用 :-)

塞巴斯蒂安·皮赫(Sebastian Piech)


0

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

pushd $PROJDIR && bash

现在,工作目录为$ PROJECT。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.