Bash中如何将管道内容传入含SSH的变量并正确执行?
在Bash中用变量存储命令并在管道中使用的问题解决
你的代码出错是因为字符串变量存储带引号的命令时,展开后引号会被当作普通字符处理,导致远程执行时tee -a Log/my.log被拆成了'tee、-a、Log/my.log'三个部分,系统找不到名为'tee的命令。
下面是几种可行的解决办法:
方法1:使用函数(推荐)
用函数封装命令,能完美保留参数结构,避免引号解析问题:
mycommand() { ssh user@host 'tee -a Log/my.log' } echo "Hello" | mycommand
方法2:使用数组存储命令
如果需要动态构建命令参数,用数组存储每个部分,展开时用"${数组名[@]}"保证参数正确传递:
MYCOMMAND=(ssh user@host 'tee -a Log/my.log') echo "Hello" | "${MYCOMMAND[@]}"
方法3:使用eval(不推荐,注意安全)
如果一定要用字符串变量,可通过eval强制解析引号,但eval会执行任意传入的代码,存在安全风险,仅在明确无风险场景下使用:
MYCOMMAND="ssh user@host 'tee -a Log/my.log'" echo "Hello" | eval "$MYCOMMAND"
内容的提问来源于stack exchange,提问作者Blazzter
相关产品推荐
相关产品推荐

