如何编写单行Unix命令一次性传入所有交互输入参数
可行实现方案
方案1:管道+printf(兼容性最高,所有Unix环境通用)
直接按交互顺序拼接所有输入内容,通过管道注入命令的标准输入,单行写法如下:
printf "xx.yy.zz.sa\nsourceFile.bin\ndest.bin\n" | copy ftp: flash:
printf会把\n解析为换行符,完全匹配你手动回车输入的响应顺序,无额外依赖,适合绝大多数场景。
方案2:Here-String(写法更简洁,Bash/Zsh等主流Shell兼容)
如果执行环境用的是常用的现代Shell,可以用更短的here-string写法:
copy ftp: flash: <<< $'xx.yy.zz.sa\nsourceFile.bin\ndest.bin'
$'...'是Shell的ANSI-C引号语法,内部的\n会被解析为实际换行符,效果和管道方案完全一致。
方案3:expect封装(适合复杂交互场景,容错性更高)
如果后续交互逻辑可能调整(比如需要输入密码、确认文件覆盖等),可以用expect做匹配输入,避免输入时序错位:
expect -c 'spawn copy ftp: flash:; expect "remote host"; send "xx.yy.zz.sa\r"; expect "Source filename"; send "sourceFile.bin\r"; expect "Destination filename"; send "dest.bin\r"; wait'
该方案会等待对应的提示文本出现后再发送响应,稳定性更强。
Java调用注意事项
- 建议使用
ProcessBuilder执行命令,如果用上面的Shell语法,需要指定通过Shell执行,比如将完整命令作为参数传入bash -c "你的完整命令" - 必须主动消费进程的标准输出、错误输出流,避免缓冲区满导致进程卡死
- 地址、文件名如果包含特殊字符,需要提前做好Shell转义。
内容的提问来源于stack exchange,提问作者Vaibhav Bhardwaj
相关产品推荐
相关产品推荐

