听不到“回声!!”从保存的脚本在 bash 中工作

听不到“回声!!”从保存的脚本在 bash 中工作

我正在尝试写一个简单的脚本来获取以前(意外地)以非英语布局编写的命令,将所有内容转换为正确的符号并运行它。我在用着重击 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 …)"
}

相关内容