tcsh中autojump参数传递失败,求实现目录跳转解决方案
在tcsh中正确使用autojump的解决方案
你的问题核心在于命令执行时机不对——不管是用setenv还是双引号定义alias,你里面的反引号命令都是在定义的时候就直接执行了,而不是在你调用j的时候才动态传递参数并计算目标路径。
举个例子,你用alias j "cd echo '. ~/.bashrc; j !:1' | bash"的时候,反引号里的bash命令在你敲完这个alias定义语句的瞬间就跑了,此时\!:1还没被替换成实际的参数(比如public_html),bash里的$1是空的,所以j命令返回的是autojump的默认路径(也就是你看到的/home/username/.linuxbrew/share/autojump)。等你调用j public_html时,别名展开后就变成了cd /home/username/.linuxbrew/share/autojump public_html,cd收到两个参数,自然就报Too many arguments了。
正确的实现方式
用单引号定义tcsh别名,这样里面的内容不会被立即展开,而是在每次调用j的时候才执行:
alias j 'cd `bash -c ". ~/.bashrc; j \!:1"`'
原理是:
- 当你输入
j public_html时,tcsh会把\!:1替换成第一个参数public_html; - 然后执行
bash -c ". ~/.bashrc; j public_html",这个命令会在bash环境中加载autojump并执行j public_html,输出目标路径/home/username/public_html; - 最后
cd命令会切换到这个输出的路径,完美实现需求。
优化:处理路径不存在的情况
如果autojump找不到匹配的路径,上面的命令会让cd切换到当前目录(因为空路径),可以加个判断避免这种情况:
alias j 'set target=`bash -c ". ~/.bashrc; j \!:1"`; if ( "$target" != "" ) cd "$target"'
这样当autojump没有返回有效路径时,就不会执行cd,避免不必要的报错。
内容的提问来源于stack exchange,提问作者digitalguy99
相关产品推荐
相关产品推荐

