问题背景
最近在Shell中使用ktctl打通本地和k8s集群网络时发现执行成功了但是没有正常写入服务IP映射到hosts中,猜想一定是最近为了方便修改并查看命名空间把原本的单行命令改成了换行导致的,于是将命令改成单行后再次执行发现可以正常写入,查阅资料才发现换行其实存在一定问题。
原因分析
根本原因:Shell 的换行符截断
当在命令行中使用 反斜杠 \
换行 时:
sudo ktctl connect \
--dnsMode hosts: \
agent, \
base
实际传递给 ktctl
的参数会被解析为:
--dnsMode "hosts: " "agent," "base"
而不是期望的:
--dnsMode "hosts:agent,base"
也就是说Shell 会将换行后的参数视为独立的新参数(即使加了 \
换行符),而如果参数要求是连续的字符串(如--dnsMode),这样就导致没办法解析为--dnsMode的参数,所以执行后没有正常写入hosts。
解决方案
因此尽量不要将一个option后的参数(这里指--dnsMode后的所有命名空间参数)拆分换行,一个参数作为一个整体写为一行,可以将各个option进行换行而不拆分参数。
规范写法:
sudo ktctl connect \
--dnsMode hosts:agent,base,default,manage,merch,message,mpos,openapi,posp,setting,test,trans,utils \
--shareShadow