以下在 Fedora 和 CentOS 中的行为相同。
cd mydirectory
作品。
cd notadirectory
有效(从 Bash 获取错误)。
然而,
cd `
给我一些提示:
>
我输入的任何内容都没有得到任何响应,它只是转到下一行再次提示。我只需使用CTRL+C退出回到我的root@localhost
。
这样做的目的是什么以及可以用它做什么?
谢谢!
答案1
您输入的是反引号- 这是指示 bash 评估您输入的命令的指令的开始。显示>
表示您仍在下一行输入命令。
如果你关闭反引号,你会发现整个命令都会运行。例如
~$ cd `
> echo /var`
/var$
答案2
JohnC 的回答已经解释了反引号。但你还想知道的是>
提示。这是一个连续提示,它不仅由反引号触发,而且总是当你的 shell 清楚地知道你还没有输入完命令时。最简单的例子是\
在输入行的末尾放置一个显式的行延续符(这有助于拆分长输入):
$ echo \
> hallo
PS1
请注意,就像控制命令提示符的外观一样,您也可以设置PS2
更改继续提示,例如
$ export PS2="(cont.) "
$ echo \
(cont.) hallo
导致继续执行的原因有很多。单个反引号是不完整的,但您也可以输入类似
ls -l `which cp`
在一行中(旁注:建议使用$(
and)
代替,因为括号可以清楚地显示扩展的开始和结束位置,而单个反引号会使人更难看出遗漏的位置。以及嵌套......)。出现延续提示的其他可能原因:
- 或
done
之后缺失while
for
- 失踪
fi
后if
- 失踪
esac
后case
- 缺少右括号,例如在子 shell 中
(cd $HOME; cat .bashrc)
- 管道传输后缺少命令
|
以及条件执行||
(&&
但不是&
,因为这只是使命令在后台运行) - 缺少结束引文(
'
或"
)
}
奇怪的是,变量扩展后缺少括号${
也会导致继续提示,但会因插入的空格而失败:
$ echo ${
> PS2}
bash: ${
PS2}: bad substitution
答案3
这意味着你的命令尚未完成。事实上,字符反引号`
是用来分隔内联命令的。
例子:
cd /tmp # Go to /tmp
pwd # Prints the current working directory
ls `pwd` # Lists the content of the current working directory
答案4
反引号开始/结束命令替换。shell 读取反引号内的命令,解释结果,并将这些结果放入命令中。例如:lswhich cp
导致执行“which cp”,并且该命令的结果(即 /bin/cp)将用作 ls 命令的参数。但是,这种行为已被弃用,取而代之的是更明确、更易读的 $(cmd) 命令替换。
当输入 cd ` 时,shell 期望执行一个命令,并以反引号结尾。
在使用大括号进行变量扩展的情况下,shell 会显示继续提示,因为这些大括号在扩展完成之前会进行词汇评估。