创建更改目录的别名,并使该目录成为新终端选项卡中的当前工作目录

创建更改目录的别名,并使该目录成为新终端选项卡中的当前工作目录

我正在尝试创建一个方便的别名,它将更改目录,然后在该目录中启动节点服务器。我已经让它大部分工作了,只有一个小问题我无法解决。

当我设置别名以仅更改文件中的目录时,~/.bashrc我得到了预期的行为:

alias ta='cd /Users/scotty/Develop/Meteor/task-assist' 

我所说的预期行为是指,当我$ ta在终端中运行时,它不仅会更改目录,而且我还可以在终端中打开新选项卡,并且该目录会继承到新选项卡。

但由于某种原因,当我在该别名上添加额外的命令来启动节点服务器时,$ ta再次运行后,当前目录不会转移到新的终端选项卡(新选项卡仅在根目录下打开)。目录发生变化并且服务器启动,但就像更改后的目录实际上并未在终端中设置一样。当我终止服务器时ctrl +c,目录才会在终端中更新。我尝试了别名和函数来使其正常工作,但没有成功:

### meteor is the command that starts the server
alias ta='cd /Users/scotty/Develop/Meteor/task-assist && meteor'

### Also tried a function
ta(){
  cd /Users/scotty/Develop/Meteor/task-assist
  meteor
}

这几乎就像更改目录和运行meteor需要是两个单独的命令才能使用当前工作目录打开新的终端选项卡。只是为了重申并进一步澄清,当我在终端中运行$ta然后按cmd + t打开新选项卡时,我希望新选项卡当前目录为:/Users/scotty/Develop/Meteor/task-assist

关于如何使用别名实现这一点有什么想法吗?

答案1

你必须走另一条路。.bashrc在 bash 实例的最后一个目录CWD(当前工作目录)中更改目录的末尾添加一行。

像这样的一行对我有用:

cd $(readlink  "/proc/$(echo -n $(ps -u $(whoami) -eo stat,pid,cmd | awk '$3 == "'$(which bash)'" && $1 ~ /\+/{print $2}' | sort | head -1))/cwd")

解释:

  • cd $(...):将目录更改为下面确定的目录
  • readlink /proc/$(...)/cwd/proc/pid/cwd:读取指向(当前工作目录)的链接
  • echo -n $(...): 删除尾随换行符
  • ps -u $(whoami) -eo stat,pid,cmd:以简单的格式展示我的流程
  • awk '$3 == "'$(which bash)'" && $1 ~ /\+/{print $2}'如果它是 abash并且bash位于前台进程组中(由字段+中的 指示stat),则打印 pid
  • sort | head -1我们只想要最低的 pid

编辑:

对于您的情况,这可能是更好的解决方案:

cd $(readlink /proc/$(pgrep -n meteor)/cwd)

它确定最新实例的 pidmeteor以及当前工作目录的更改。

答案2

我刚刚创建了这些别名(我正在使用 bash)

christian@fujiu1404:~$ alias ta='cd tmp ; date'
christian@fujiu1404:~$ ta
Wed Sep 17 14:47:16 BST 2014
christian@fujiu1404:~/tmp$ alias ta='cd tmp && date'
christian@fujiu1404:~/tmp$ cd ..
christian@fujiu1404:~$ ta
Wed Sep 17 14:48:28 BST 2014
christian@fujiu1404:~/tmp$ 

他们工作了!

相关内容