在gnome-terminal中传递Bash数组至music-lib脚本的异常问题
问题分析与解决方案
问题根源
当你在bash -c的双引号命令串中直接展开${dirName[@]}时,带空格的目录会被拆分为多个独立参数,导致music-lib接收到错误的参数输入,执行失败后终端因命令串执行完毕直接退出。而用"${*}"会将所有参数拼接为单个字符串,虽然终端能打开,但music-lib无法获取正确的数组参数。
正确实现方式
方法一:直接传递位置参数(推荐)
这种方式无需转义,直接将数组参数传递给子Shell的位置参数,在子Shell内重新构建数组:
#!/usr/bin/env bash dirName=( "${@}" ) gnome-terminal -- bash -c 'dirName=("$@"); music-lib "${dirName[@]}"; exec bash' _ "${dirName[@]}"
- 单引号包裹
bash -c的命令串,避免父Shell提前展开变量 _是占位符,对应子Shell的$0(命令名位置)${dirName[@]}作为bash -c的后续参数,会成为子Shell的$1、$2...,在子Shell内用dirName=("$@")还原数组
方法二:转义参数为安全字符串
用printf %q将每个数组元素转义为Shell可解析的安全格式,再拼入命令串:
#!/usr/bin/env bash dirName=( "${@}" ) printf -v args_str '%q ' "${dirName[@]}" gnome-terminal -- bash -c "music-lib $args_str; exec bash"
%q会自动为含空格/特殊字符的参数添加转义或引号,确保子Shell解析时参数完整
内容的提问来源于stack exchange,提问作者One
相关产品推荐
相关产品推荐

