我正在尝试写一个简单的脚本来获取以前(意外地)以非英语布局编写的命令,将所有内容转换为正确的符号并运行它。我在用着重击 4.3.11。
我当前的代码如下所示(我不是程序员,只是想学习这个以实现一般可用性):
echo !! | sed -e "y/first-set-of-symbols/second-set-of-symbols/" | bash
问题是,当我从文件运行脚本时,我得到这个:“bash: 第 1 行:!!: 未找到命令”,但是当我复制粘贴整个命令时,它会执行预期的操作;如果我将脚本文件中的 echo 部分更改为“echo test-command”之类的内容,那么当我运行脚本时,它也会起作用。
有人可以帮我理解为什么吗?这里的脚本不起作用吗?是应该的吗?
我也愿意接受任何关于如何以更好/更高效/更优雅的方式做我想做的事情的建议。
(我没有使用 tr,因为显然它不适用于 Unicode,或者他们是这么说的——至少它对我根本不起作用。)
答案1
该!!
快捷方式仅对交互式会话有效。在所有其他情况下,它被视为一对文字字符。
复制并粘贴此内容以查看发生了什么:
cat >/tmp/pling.sh <<x
#!/bin/bash
echo hello, world
echo you said !!
x
# Now make the file executable
chmod a+x /tmp/pling.sh
# Now run it
/tmp/pling.sh
答案2
脚本中未启用命令历史记录。即使启用它,脚本也无法访问调用它的交互式 shell 的历史记录。
不用编写脚本,而是将 ti 制作为一个函数并将其放入您的.bashrc
.
另外,您应该使用eval
内置命令在相同的上下文(特别是相同的 shell 变量)中执行它,而不是在单独的 bash 实例中执行该命令。
您的历史扩展方法仅适用于简单的命令;包含特殊字符的命令将导致语法错误或其他意外行为。使用fc
内置函数以编程方式访问历史记录。
reexecute () {
eval "$(fc -l -1 | sed …)"
}