Bash中追加含双引号的命令到文件时保留引号的方法问询
解决方案
1. 用printf/history组合保存带双引号的命令
要解决双引号丢失的问题,核心是让shell正确转义命令中的特殊字符,以下两种方法都能实现:
方法1:用printf自动转义所有特殊字符
printf的%q格式符会自动转义命令中的双引号、管道符等特殊字符,确保保存的命令可直接重复执行:
# 先执行目标命令 echo '["a-a","b-a"]' | jq -rc '.[]|select(.=="a-a")' # 保存命令和输出到test文件 printf '%q\n' "!!" >> test && !! >> test
查看保存结果:
cat test # 输出: echo\ '["a-a","b-a"]'\ \|\ jq\ -rc\ '.[]|select(.=="a-a")' a-a
他人直接复制这条转义后的命令即可正常运行。
方法2:保留原始命令格式(更易读)
结合history -p获取原始命令字符串,再用sed转义双引号,保存后命令和原始输入完全一致:
# 保存命令和输出 echo "$(history -p !! | sed 's/"/\\"/g')" >> test && !! >> test
查看保存结果:
cat test # 输出: echo '["a-a","b-a"]' | jq -rc '.[]|select(.=="a-a")' a-a
此方法保留了原始命令的结构,可读性更强,且可直接执行。
2. 优化script工具的使用
加载Dotfiles
script默认启动非交互shell,不会加载~/.bashrc等配置文件,可通过显式source配置文件解决:
# 加载~/.bashrc并执行上一条命令,静默模式输出到临时文件 script -q -c "source ~/.bashrc && !!" temp.txt
-q参数关闭script的启动/结束提示,减少冗余内容。
提取仅命令和输出的内容
script会记录整个会话,用sed提取需要的部分并写入目标文件:
# 提取命令行和后续输出,写入test文件 sed -n '/^\$ /,$p' temp.txt >> test # 清理临时文件 rm temp.txt
如果想一步完成所有操作:
script -q -c "source ~/.bashrc && !!" temp.txt && sed -n '/^\$ /,$p' temp.txt >> test && rm temp.txt
最终test文件只会保留上一条命令及其输出,无冗余信息。
内容的提问来源于stack exchange,提问作者nestor
相关产品推荐
相关产品推荐

