为什么 bash 显示 `>` 而不是执行我的命令?

为什么 bash 显示 `>` 而不是执行我的命令?

为什么 bash 有时会拒绝接受我的命令,只需开始以大于号开头的新行而不是执行命令?每次按 Enter 键都会添加一个新行,而避免这种情况的唯一方法似乎是按Ctrl+ C

举个例子:我有时需要限制笔记本电脑风扇速度的小命令不再起作用:

RegenbogenBook:Resources Vincent$ smc -k F0Mx -w $(python -c 'print hex(2800 << 2)[2:]’)
>
>
>

我的印象是我只是错过了一些非常明显的东西,但这种基本的东西没有在任何常见问题解答中涵盖或通过搜索访问......

答案1

您可能是从文档中剪切并粘贴命令(或其部分),而不是手动输入。通常这没有任何区别,但在这种情况下,第二个引号字符作为“右单引号”( ) 而不是“撇号”( ') 插入。差异很微妙——请参阅此页面了解更多详细信息:

http://en.wikipedia.org/wiki/Quotation_mark_glyphs

发生这种情况的原因可能是,当您第一次在文档中键入命令以保存它以供将来参考时,您的文字处理器会自动将第二个撇号转换为右单引号。这样做是为了使该字符在屏幕上看起来更好,但 bash 无法将该字符识别为有效的结束引号,因此您遇到了问题。它打印“ >”以提示进一步输入,因为它仍然认为原始报价尚未关闭。

解决方法是将该字符更改为撇号——只需从键盘手动将其重新输入到 bash 中即可。您还可以在文档中更正它,以便将来的剪切+粘贴工作正常。

答案2

>看到的是因为 shell 仍在等待输入。正如弗雷坦蒂尼的回答所述,你没有正确地结束你的陈述。

有时您会看到辅助输入提示(在 Bash 中称为 PS2)。某些交互式命令(例如)mailx将使用它来填写电子邮件字段。您可以通过按+发送EOF到 shell 来关闭辅助输入提示。CtrlD

答案3

您的最后一个引用是一轮引用,因此您传递给 python 的字符串尚未完成。您可以看到句法着色的差异:

smc -k F0Mx -w $(python -c 'print hex(2800 << 2)[2:]’)

smc -k F0Mx -w $(python -c 'print hex(2800 << 2)[2:]')

答案4

问题

正如其他人所说,OP 在你的python语句中有一个未终止的字符串。您将四舍五入的引号与单引号混淆了。


预期用途

鉴于OP不知道二级提示,我想向OP展示一个取自的例子Linux From Scratch - 带有 SystemD 的版本 7.6书,并解释其工作原理。大多数情况下,提示符的使用方式如下:

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools

export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
echo "/bin/sh -> `readlink -f /bin/sh`"
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -e /usr/bin/yacc ];
  then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
  else echo "yacc not found"; fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -e /usr/bin/awk ];
  then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
  else echo "awk not found"; fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
xz --version | head -n1

echo 'main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy

EOF

推理

Linux from Scratch 广泛使用的唯一工具是终端。为了确保本书脱离主机构建版本,本书指导您使用 OP 认为有问题的行为来键入所有脚本和配置文件。第一行创建一个这里的文档version-check.sh完成后会有名称。下面是已完成脚本的 Cygwin 终端的屏幕截图:

没有文本编辑器的 Cygwin 脚本

请注意,该脚本包含 CR/LF,它们会在文档中创建空格并提高可读性。每个 CR/LF 创建 的一个新实例>,并且在 结束时EOF,所有 的>都会创建成为 的缓冲区version-check.sh

相关内容