在shell里面>&2是啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在shell里面>&2是啥意思?相关的知识,希望对你有一定的参考价值。

这里面有三个字符,我都给你解释一下.

>:箭头代表重定向

&:代表引用

2:代表标准错误输出

同类的是

    0 表示stdin标准输入

    1 表示stdout标准输出

    2 表示stderr标准错误

那你这个>&2的含义呢,就是说,把前面的打印消息重定向到标准错误里面.

一般我们会这样写:"某个命令" 1>/dev/null 2>&1

含义呢,就是说,我要执行这个命令,然后这个命令执行过程中的所有标准输出都重定向到/dev/null空设备的意思(就是标准输出不打印),然后2>&1 就是标准错误重定向到标准输出中.而标准输出前面已经说了不打印.那么整体就是标准输出,标准错误都不打印.

而你写的>&2比较少,我们很少把其他信息重定向到标准错误中.

追问

怎么操作echo a>&2 让它在命令行消失呢?我在后面加2>还是输出了呢

我这个是在编程里操作的,运行它是,在后面加个2>file就看不到了。谢谢你

参考技术A 也就是把结果输出到和标准错误一样;之前如果有定义标准错误重定向到某file文件,那么标准输出也重定向到这个file文件。
其中&的意思,可以看成是“The same as”、“与...一样”的意思
参考技术B 你好,你所问的这是一个简单的C语言的句子,如果你想知道准确的回答的话,建议你直接询问你的言老师 参考技术C 在学的课业找一下就明白歌

$-#*i 在 shell 脚本中是啥意思?

【中文标题】$-#*i 在 shell 脚本中是啥意思?【英文标题】:What does the $-#*i mean in shell script?$-#*i 在 shell 脚本中是什么意思? 【发布时间】:2017-06-22 20:22:37 【问题描述】:

在 CentOS 6 上的文件 /etc/profile 中有一个 for 循环:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "$-#*i" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

上述 for 循环中的$-#*i 是什么意思? 感谢您的帮助。

【问题讨论】:

当我读到标题时,我以为你在那儿删掉了一个 $-#*ing 坏词...... 【参考方案1】:

tl;博士:

如果当前 shell 是 交互式,则条件 [ "$-#*i" != "$-" ] 评估为逻辑 true,在这种情况下,退出代码设置为 @987654328 @,表示 true,这会导致执行封闭的 if 语句的 then 分支。

问题中的条件和代码作为一个整体故意仅使用 POSIX-compliant shell-language syntax and commands 以便可移植(与所有可能起作用的 POSIX-兼容 shell 一起使用如/bin/sh)。

请注意,如果bash 可以假定为外壳,例如,相同的条件可以更易读地表示为[[ $- == *i* ]]


说明

$-#*i 是一个 parameter expansion,它从命名参数 $- 的值中删除与 pattern *i 匹配的最短前缀 (#)(命名参数通常称为变量)。

$- 是special parameter,其中(添加了链接和重点):

扩展为 当前option 标志单字母选项名称连接成一个字符串),如调用时指定的,由 set 特殊内置命令, 或由 shell 隐含。

一个交互式 shell隐式将选项标志i添加到$-的值;换句话说:$- 的值中存在字母 i 意味着手头的 shell 是交互式的,相反,@987654343 的 不存在 @ 表示 shell 非交互式

1234563 /em> *i 匹配的内容,返回$-子字符串(在本例中为后缀)。 换句话说:只有在 interactive shell 中,$-#*i not 才等于 $-,因为在 noninteractive shell 中 - 由于不存在i - 参数展开作用,两个操作数相等。

问题中的代码的作用作为一个整体

简而言之:代码使用在/etc/profile.d 中找到的shell 脚本来初始化当前shell;更具体地说:

当前用户 (-r) 可以读取的目录 /etc/profile.d 中的脚本(名为 *.sh 的文件)按字母顺序一一传递给 . (dot) utility。 dot 实用程序从 current shell 中的每个文件执行命令,通常用于定义别名、函数和环境变量。这通常称为采购文件。

输出每个源脚本产生的处理方式不同,具体取决于当前 shell 是否是交互式的:

交互式 shell:输出通过(将在交互式 shell 中可见)。

noninteractive shell:输出被抑制>/dev/null 2>&1 是符合 POSIX 标准的方式来使 stdout 和 stderr 都静音)。

李>

【讨论】:

【参考方案2】:

请参阅Unix & Linux 上的top answer 至What does “$-#*i” != “$-” mean? cuonglm:

$- 是 shell 本身在调用时设置的当前选项标志, 或使用set 内置命令:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"$-#*i" 是删除字符串的语法:(来自POSIX documentation)

$参数#[单词]

删除最小前缀模式。该词应扩展为产生 一种模式。然后参数扩展将导致参数, 前缀的最小部分与模式匹配 已删除。

如果存在,单词不应以未引用的“#”开头。

$参数##[单词]

删除最大前缀模式。该词应扩展为产生一个 图案。然后参数扩展将导致参数,与 与删除的模式匹配的前缀的最大部分。

所以$-#*i 删除最短的字符串直到第一个i 字符:

enter code here
$ echo "$-#*i"
mBH

在您的情况下,if [ "$-#*i" != "$-" ] 检查您的外壳是否是 互动与否。

【讨论】:

我已经编辑了您的答案,以正确引用和归属原作者。在帮助中心查看Referencing;建议是“仅引用相关部分”,而不是完整答案。【参考方案3】:

$- 表示 shell 标志。

$-#*i 表示 shell 标志减去 *i 的第一个匹配项。

如果这两个不相等,则认为 shell 是交互式的(存在标志 i)。

【讨论】:

以上是关于在shell里面>&2是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Linux:shell script,这里的两个EOF分别是啥意思呢

bash shell export是啥意思

linux里面bash是啥?

shell指令码中的$*,$@和$#是啥意思?

c++里面的2维向量是啥意思????

$做啥? $0 $1 $2 在 shell 脚本中是啥意思? [复制]