如何修复Bash脚本中拆分exec命令时的参数截断问题?
解决Bash脚本中命令参数截断问题
你的问题出在双引号嵌套未正确转义,以及用普通字符串存储命令参数的方式容易触发Bash的解析错误。以下是两种修复方案:
方案1:用数组存储完整命令参数(推荐)
Bash中处理带空格、引号的复杂命令,最安全的方式是用数组存储每个参数元素:
# 定义包含所有参数的数组 CMD_ARGS=( "/home/user/.config/i3/myscript.sh" "todolist" "xfce4-terminal --command \"emacs -nw -Q -l ~/.emacs.d/script.el ~/Dropbox/mytodo.org\"" ) # 执行命令(数组展开必须用"${数组名[@]}"格式) exec "${CMD_ARGS[@]}"
方案2:单独拆分变量并正确转义引号
如果要分开存储主命令和后续参数,需要对内部双引号做转义,或者用单引号包裹外层字符串:
COMMAND="/home/user/.config/i3/myscript.sh" # 方式1:转义内部双引号 EMACS_ARGS=( "todolist" "xfce4-terminal --command \"emacs -nw -Q -l ~/.emacs.d/script.el ~/Dropbox/mytodo.org\"" ) # 方式2:用单引号包裹外层,内部直接用双引号(更简洁) # EMACS_ARGS=( # "todolist" # 'xfce4-terminal --command "emacs -nw -Q -l ~/.emacs.d/script.el ~/Dropbox/mytodo.org"' # ) # 执行命令 exec "$COMMAND" "${EMACS_ARGS[@]}"
为什么原写法会截断?
原EMACS变量中的双引号未转义:" 'todolist' 'xfce4-terminal --command "emacs..."' ",Bash解析时会把--command "emacs后的双引号当作字符串结束标记,导致-nw -Q -l及后续内容被当作无关文本截断。另外,直接用echo $COMMAND $EMACS展开变量时,Bash会自动拆分空格、忽略未转义的引号,无法正确还原命令结构。
内容的提问来源于stack exchange,提问作者mle0312
相关产品推荐
相关产品推荐

