为什么这个 bash 命令不能正常工作?

为什么这个 bash 命令不能正常工作?

我正在输入这个命令:

sh -c "echo '!a'"

它给出了一个错误

bash !a': event not found

这在某种程度上是因为!是一个特殊字符,但由于我用单引号括起来,所以我不应该得到这个。

答案1

感叹号用于检索你的 bash 历史记录

在您的情况下,错误消息来自您当前的 shell,而不是您想要启动的 shell(*)。发生的情况是单引号不计算在内,因为对于您当前的 shell,它们位于双引号内,因此失去了其特殊状态并成为纯字符。但在双引号内,历史扩展仍然!有效...

如果您以其他方式执行此操作:sh -c 'echo "!a"'那么它就会起作用,因为外部单引号“隐藏”了!

sh(*)如果替换为echo:,则会遇到同样的错误:echo -c "echo '!a'"

答案2

!是保留字;这里是 sh 手册的一部分:

保留字

保留字是对于 shell 具有特殊含义的字,它们位于行首和控制运算符之后。以下是保留字:

       !       elif    fi      while   case
       else    for     then    {       }
       do      done    until   if      esac

如果要将保留关键字打印为字符:

sh -c "echo '"\!"a'"

看一下 sh/bash 手册!

相关内容