Zsh中配置本地端口转发的语法是否存在错误?
问题解决说明
错误原因
报错是zsh参数扩展的语法规则导致的解析异常:
zsh支持在变量后接:+修饰符实现字符串处理,例如${var:l}表示将变量值转为小写。你代码中$1:localhost的写法会被zsh错误识别为$1:l(将第一个参数转小写)+ocalhost,因此原本的:和localhost的首字母l会被吞掉作为修饰符处理,最终生成8888ocalhost:8888的错误转发规则,和你收到的报错完全吻合。
修复方法
给变量加上花括号明确变量边界,避免zsh误识别后续字符为参数修饰符即可,修改后的函数代码如下:
function jptt(){ # 转发本地$1端口到远程服务器的$2端口 ssh -N -f -L ${1}:localhost:${2} rgr6291@klc0201.ci.northwestern.edu }
修改后保存.zshrc,执行source ~/.zshrc生效后,再调用jptt 8888 8888就可以正常执行端口转发。
可选优化(推荐)
可以增加参数校验逻辑,避免漏输参数时产生异常:
function jptt(){ if (( $# != 2 )); then echo "用法: jptt <本地端口> <远程端口>" return 1 fi ssh -N -f -L ${1}:localhost:${2} rgr6291@klc0201.ci.northwestern.edu }
内容的提问来源于stack exchange,提问作者Raul Guarini Riva
相关产品推荐
相关产品推荐

