我正在尝试创建一个方便的别名,它将更改目录,然后在该目录中启动节点服务器。我已经让它大部分工作了,只有一个小问题我无法解决。
当我设置别名以仅更改文件中的目录时,~/.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
),则打印 pidsort | 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$
他们工作了!