我需要在.bashrc中创建一个别名,以每1000秒打印日志的最后十行,并在输出中替换一些字符(每个"\s"用一个空格(。
我正在组合两个不同的别名:
alias watch10='watch '
alias dcr='-n 1000 'tail -10 some.log | sed "s/\s/ /g"''
在将别名添加到.bashrc之后,我运行"source.bashrc",并且没有得到任何错误。
日志行如下所示:
somestuff /B/R/JoesPauls-sMikes-sSteve
我希望输出线路是:
somestuff /B/R/Joe Paul - Mike - Steve
我通过组合两个别名来调用ssh中的命令:
watch10 dcr
这会产生一个错误:
sh: 1: dcr: not found
解决方案是什么?
请注意,当我使用这个别名(而不是dcr(时,它是有效的,它不会试图用单个空格替换恼人的"\s":
alias dc="-n 1000 'tail -10 some.log'"
谢谢。
即使用反斜杠转义,也不能嵌套单引号。
解决方法是:
- 用单引号关闭子字符串一次
- 放入代表文字单引号的
'
- 然后用单引号重新启动剩余的子字符串
例如,您可以使用打印"就这样">
echo 'That'''s it.'
不用说,用双引号(如适用(。
回到您的问题,请尝试:
alias dcr='-n 1000 '''tail -10 some.log | sed "s/\s/ /g"''
请注意,您需要另一个反斜杠来转义s
。
但是你为什么不把这两个别名合并为一个呢:
alias dcr='watch -n 1000 '''tail -10 some.log | sed "s/\s/ /g"''
(可能有一些具体原因…(
希望这能有所帮助。
不可能连接别名。别名替换仅在简单命令的第一个令牌上执行。当您键入"alias1-alias2"时,假定alias1=cmd1-alias2=cmd,代码将执行"cmd1-alias2'"(alias2假定为文字参数(。
这个问题几乎没有假设,我无法在Mint19 上验证
- 将两个别名(watch10,dcr(放入.bashrc中有效:Mint19产生"未终止的带引号字符串"(
- 同样,将dc设置为"-n 1000"tail-10 some.log"并将其与"watch10 dc"一起使用也可以。我相信这将导致运行"dc"(/usr/bin/dc(程序(基本计算器(,而不是使用dc选项
少数选项:
如果您希望从其他程序中使用"dcr"命令(在本例中为watch
(,请编写一个小脚本,并将其放在PATH中引用的个人文件夹中(例如~/bin(。请注意,使用脚本将简化设置"%s"替换项的过程。
另一种选择是创建组合"wdcr"别名,组合为"watch-n 1000\"tail-10 some.log…`.
- 通过ssh运行
当您使用命令运行远程主机".ssh"时,它被视为登录会话,而不是交互式会话,。它将来源于'~/.bash_profile'。除非配置文件脚本为~/.bahrc,否则您将无法在远程会话中获得别名。
还要注意,bash强烈反对使用除交互式会话之外的任何别名,而支持函数。