如何在分号/管道后的命令中调用并保存前序命令字符串?
解决Bash中获取前序命令字符串的问题
分号分隔命令场景(如command1; command2)
你之前用!:p无效的核心原因是:同一行内的命令在执行完成前不会被写入bash历史列表,!系列扩展只能调用已写入历史的命令,而非当前行内的前序命令。
最可靠的解决方式是先把目标命令存入变量,执行后直接调用变量输出或保存:
# 分步写法 WGET_CMD='wget http://localhost.com/something.zip -O /tmp/out.zip' $WGET_CMD echo "$WGET_CMD" >> log.txt
如果要写成单行:
WGET_CMD='wget http://localhost.com/something.zip -O /tmp/out.zip'; $WGET_CMD; echo "$WGET_CMD" >> log.txt
管道左侧命令场景(如command1 | command2)
同理,管道左侧的命令也无法通过历史扩展获取,同样用变量保存的方式解决:
# 分步写法 WC_CMD='wc -l somefile.txt' $WC_CMD | echo "$WC_CMD"
单行写法:
WC_CMD='wc -l somefile.txt'; $WC_CMD | echo "$WC_CMD"
备选方案:利用bash即时历史写入
如果不想用变量,可以临时配置bash让命令执行后立即写入历史,再调用最后一条历史记录:
- 先开启即时历史写入:
shopt -s histappend PROMPT_COMMAND='history -a'
- 执行命令并提取前序命令:
wget http://localhost.com/something.zip -O /tmp/out.zip; history 1 | awk '{print substr($0, index($0,$2))}' >> log.txt
注:此方式在脚本中执行可能出现历史记录混乱,不如变量方式稳定。
内容的提问来源于stack exchange,提问作者TuanHaxor
相关产品推荐
相关产品推荐

