Linux 在创建命令历史记录管道时,如何消除ack传递的换行符?

Linux 在创建命令历史记录管道时,如何消除ack传递的换行符?,linux,bash,Linux,Bash,出于超出此问题范围的原因,我正在手动重新创建bash的历史扩展。也就是说,我知道这个功能存在于另一个bash方法中,但是按照我构建bash历史的方式,每个会话都有自己的会话历史文件,即 HISTFILE="${HOME}/.history/$(date -u +%Y/%m/%d.%H.%M.%S)_${HOSTNAME_SHORT}_$$" 要求我构建自己的历史记录搜索功能 我编写了以下函数: function historysearch { ack "$1" ~/.history }

出于超出此问题范围的原因,我正在手动重新创建bash的历史扩展。也就是说,我知道这个功能存在于另一个bash方法中,但是按照我构建bash历史的方式,每个会话都有自己的会话历史文件,即

HISTFILE="${HOME}/.history/$(date -u +%Y/%m/%d.%H.%M.%S)_${HOSTNAME_SHORT}_$$"
要求我构建自己的历史记录搜索功能

我编写了以下函数:

function historysearch {
  ack "$1" ~/.history
}

function historycopy {
  mycopy=$(historysearch $1 | ack $2 | rev | cut -d: -f1 | rev)
  echo ${mycopy%\\n} | pbcopy
}
用法如下:

$ historysearch foo


...
~/.history/2015/10/10.14.53.34_user-5_16778
6:hexedit assets/wav/foo_mu.wav
13:hexedit assets/wav/foo_mu.wav
...
确定了我想要的命令后,我

$ historycopy foo 778:13
其中,第二个参数是会话历史记录名称的最后三位数字,后跟
,然后是与所需命令关联的数字。上面的命令将复制到我的系统剪贴板。不幸的是,即使我在函数中运行string replace命令
${mycopy%\\n}
,它也会使用一个回车符来实现。这是摩擦

如果我将命令粘贴到终端中,它将立即执行。我更希望将命令复制到剪贴板,这样我就可以粘贴它,必要时修改它,然后手动执行

如何去掉传递给
pbcopy
的字符串末尾的换行符


更新:似乎我的字符串替换命令正在从
ack
删除换行符,但
echo
正在添加另一个换行符。使用
-n
标志解析

echo
在末尾添加换行符。为了避免这种情况,请使用echo-n

不要将回车和换行混淆。回车符通常用于
\r
,换行符通常用于
\n
。您要删除的是换行符,而不是回车符,这通常在Windows中使用。谢谢在问题标题中修复。为什么您需要自己的历史记录搜索?您不能在shell启动时使用
history-r
读取
HISTFILE
的新值吗?它就在这里。非常感谢。或者使用通常性能更好的
printf