You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:34:56