echo $ -1显示什么?


14

什么是输出echo $-1echo $-2echo $-3..是什么意思?

在我的一个Linux机器上,它显示了我:

echo $-1
imsBEl1
echo $-2
imsBEl2

在另一个Linux机器上,它显示:

echo $-1
himBH1
echo $-2
himBH2

它们是映射到某些内存位置还是其他东西?


1
标题在边栏中显示了以下问题:meta.stackexchange.com/q/229363/205964
IQAndreas 2014年

我添加了一个建议的编辑,试图对其进行修复,但是我很快意识到,只有侧边栏才可以显示MathJax,这意味着当标题位于此页面上时,它只会得到不必要的反斜杠。
IQAndreas 2014年

Answers:


19

POSIX将$-定义为:

--

(连字符)扩展为在调用时,通过set特殊内置命令或由shell隐式指定的当前选项标志(将单个字母的选项名称并置为字符串)。

因此,$-可以基于您的shell或如何调用它而有所不同。

12在这里是分开的令牌。当shell看到unquote时$,它将标识用于参数扩展,命令替换或算术扩展的所有候选对象的开始。它看到$-并扩大了它,其余的保持不变。

您可以查看令牌识别部分以了解更多详细信息。



11

加上米罗斯拉夫的答案:

echo $-打印当前shell的选项(不带-前缀)。1和2是其他不相关的令牌。

这意味着这些分别是每台机器的选项。

imsBEl
himBH

我研究了每个标志的含义,并以较小的措辞汇编了以下含义。

-一世

如果存在-i选项,则该外壳是交互式的。

-米

监控模式。作业控制已启用。

-B

外壳执行大括号扩展(请参阅Brace Expansion)。默认情况下启用。

-s

如果存在-s选项,或者在选项处理之后没有剩余参数,那么将从标准输入中读取命令。此选项允许在调用交互式外壳程序时设置位置参数。

-E

错误跟踪

-l

使bash就像被作为登录shell调用一样

-H

哈萨尔

-H历史扩展

交互式外壳默认情况下启用此功能。


3

为了扩大现有的答案,尝试echo "${-1}"echo "${-2}"-你会得到一个“坏替代”的错误,因为,而不是使用-1的连字符用于变量名称替换值如果变量名称是不确定的。例如:

$ unset foo
$ echo "${foo-bar}"
bar
$ foo=test
$ echo "${foo-bar}"
test
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.