shell启动脚本中的0、1、2、>和&解析

目录

一、0 1 2 文件描述符

二、>是重定向符,就是把前面输出的内容重定向到后面指定的位置

三、& 是一个描述符,如果1或2前不加&,会被当成一个普通文件


nohup sh gmv.sh >ls.txt 2>&1 &  后台运行脚本的一般格式,并且把日志(正常日志和错误日志)输出到ls.txt中

tail -f ls.txt可以动态查看日志

一、0 1 2 文件描述符

在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:
0 是一个文件描述符,表示标准输入(stdin)
1 是一个文件描述符,表示标准输出(stdout)
2 是一个文件描述符,表示标准错误(stderr)

在标准情况下, 这些FD分别跟如下设备关联: 
stdin(0): keyboard 键盘输入,并返回在前端 
stdout(1): monitor 正确返回值 输出到前端 
stderr(2): monitor 错误返回值 输出到前端

举例说明吧:假如当前目录只有一个文件 a.txt
[root@redhat box]# ls 
a.txt 
[root@redhat box]# ls a.txt b.txt 
ls: b.txt: No such file or directory 由于没有b.txt这个文件, 于是返回错误值, 这就是所谓的2输出 
a.txt 而这个就是所谓的1输出

二、>是重定向符,就是把前面输出的内容重定向到后面指定的位置

再接着看:
[root@redhat box]# ls a.txt b.txt 1>file.out 2>file.err 
执行后,没有任何返回值. 原因是, 返回值都重定向到相应的文件中了,而不再前端显示 
[root@redhat box]# cat file.out 
a.txt 
[root@redhat box]# cat file.err 
ls: b.txt: No such file or directory 
一般来说, "1>" 通常可以省略成 ">". 
即可以把如上命令写成: ls a.txt b.txt >file.out 2>file.err 
有了这些认识才能理解 "1>&2" 和 "2>&1". 
1>&2 正确返回值传递给2输出通道 &2表示2输出通道 
如果此处错写成 1>2, 就表示把1输出重定向到文件2中. 
2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道. 
举个例子. 
[root@redhat box]# ls a.txt b.txt 1>file.out 2>&1 
[root@redhat box]# cat file.out 
ls: b.txt: No such file or directory 
a.txt 
现在, 正确的输出和错误的输出都定向到了file.out这个文件中, 而不显示在前端. 
补充下, 输出不只1和2, 还有其他的类型, 这两种只是最常用和最基本的.

>是重定向符,就是把前面输出的内容重定向到后面指定的位置,比如(例1):
echo "一些内容" > filename.txt
上面例子会把 "一些内容" 写入到 filename.txt 文件中。

>前是可以加数字来说明把什么内容重定向到文件中,默认是把标准输出重定向到文件中,所以下面这个例子和上面那个是一样的(例2):
echo "一些内容" 1> filename.txt
如果是错误信息就不会输出到filename.txt(例3):

$ ls nodir 1> filename.txt
$ ls: nodir: No such file or directory
上面这个例子中nodir不存在,所以通过ls命令查询时错误信息会输出到 2(stderr),但我们指定的是把1重定向到filename.txt,所以上面命令执行完后,filename.txt中是没有内容的。但是执行下面命令就会把错误信息写入到filename.txt中(例4):

$ ls nodir 2> filename.txt
$ cat filename.txt
$ ls: nodir: No such file or directory

三、& 是一个描述符,如果1或2前不加&,会被当成一个普通文件

1>&2 意思是把标准输出重定向到标准错误.
2>&1 意思是把标准错误输出重定向到标准输出。
&>filename 意思是把标准输出和标准错误输出都重定向到文件filename中

我们再看一个例子(列5):
$ ls nodir 1> filename.txt 2>&1
$ cat filename.txt
$ ls: nodir: No such file or directory
上面例子把 标准输出 重定向到文件 filename.txt,然后把 标准错误 重定向到 标准输出,所以最后的错误信息也通过标准输出写入到了文件中,比较例3,4,5,就能明白其作用。

问:Linux重定向中 >&2 怎么理解?
问题补充:echo "aaaaaaaaaaaaaaaa" >&2 怎么理解?
答:>&2 即 1>&2 也就是把结果输出到和标准错误一样;之前如果有定义标准错误重定向到某log文件,那么标准输出也重定向到这个log文件
如:ls 2>a1 >&2 (等同 ls >a1 2>&1)
把标准输出和标准错误都重定向到a1,终端上看不到任何信息。

参考:

https://www.jb51.net/article/64183.htm

 

 

<think>好的,用户现在想了解Shell中重定向符号`2>&1 &`的作用含义。我之前已经回答过关于如何在find命令中过滤权限的问题,其中用到了`2>/dev/null`,用户可能是在那个回答中看到了重定向的用法,进而产生了疑问。 首先,我需要拆解`2>&1 &`这个组合符号。看起来这是由两个部分组成的:`2>&1`末尾的`&`。这两个部分在Shell中各自有不同的作用,但用户可能将它们混淆在一起了,所以需要分别解释。 先处理`2>&1`。根据之前的引用资料,用户提供的引用[2]、[3]、[4]都提到了,`2>&1`的作用是将标准错误(stderr)重定向到标准输出(stdout)。这意味着错误信息会普通输出一起显示或写入同一个文件。例如,在命令`command > file 2>&1`中,stdout被重定向到file,而stderr也被重定向到stdout,所以最终所有输出都进入file。 接下来是末尾的`&`符号。这个符号在Shell中用于将命令放到后台执行,这样用户可以在执行命令的同时继续使用终端。例如,`command &`会让command在后台运行。 用户的问题中把`2>&1``&`连在一起写成`2>&1 &`,这实际上是两个独立的操作符。正确的顺序应该是先进行重定向,然后放入后台。比如,`command > file 2>&1 &`,这里`>``2>&1`处理输出,最后的`&`让命令后台运行。 需要确认用户是否理解这两个符号是分开作用的,还是误以为它们是一个整体。可能需要用例子说明,比如: nohup /script.sh > output.log 2>&1 & 这里,`> output.log`将stdout重定向到文件,`2>&1`将stderr也重定向到stdout(即同一个文件),最后的`&`让整个命令在后台运行。用户提供的引用[5]中提到了类似的用法,应该引用这个例子。 另外,用户可能混淆了`2>&1``&>`的写法。在较新的Bash版本中,可以使用`&>`来同时重定向stdoutstderr,比如`command &> file`,但这`2>&1`的效果相同,只是更简洁。 需要强调符号的顺序很重要。比如,`command 2>&1 > file``command > file 2>&1`是不同的。前者先将stderr重定向到stdout的当前位置(屏幕),然后再将stdout重定向到file,此时stderr仍然输出到屏幕。后者先将stdout重定向到file,再将stderr重定向到stdout的位置(即file),所以两者都进入file。 最后,用户可能需要知道常见的使用场景,比如在后台运行脚本并记录日志,这时候组合使用`2>&1``&`就很常见。例如用户提到的引用[5]中的例子:`nohup /root/runoob.sh > runoob.log 2>&1 &`,这里用nohup防止命令因终端关闭而终止,重定向所有输出到日志文件,并在后台执行。 总结回答结构:先分解符号,分别解释`2>&1``&`的作用,再说明组合使用时的顺序实际例子,最后总结常见应用场景。</think>在Shell中,`2>&1 &` 是两种操作符的组合使用,需拆解为 **`2>&1`** **`&`** 两部分理解: --- ### 一、核心符号拆解 #### 1. `2>&1` 的作用 - **功能**:将 **标准错误流(stderr)** 重定向到 **标准输出流(stdout)** - **文件描述符**: - `0` = 标准输入(stdin) - `1` = 标准输出(stdout) - `2` = 标准错误(stderr) - **语法本质**:`2>` 表示重定向stderr,`&1` 表示目标为stdout的当前指向位置[^2][^3] #### 2. 末尾 `&` 的作用 - **功能**:将命令放入后台执行(不阻塞当前终端) - **典型场景**:长时间任务或守护进程启动时使用 --- ### 二、组合用法解析 #### 1. 完整语法示例 ```shell command > output.log 2>&1 & ``` - **分步解释**: 1. `> output.log`:将stdout重定向到文件 `output.log` 2. `2>&1`:将stderr重定向到stdout的当前指向位置(即 `output.log`) 3. `&`:命令在后台运行 - **最终效果**:命令的所有输出(stdout+stderr)写入 `output.log`,且进程在后台执行[^5] #### 2. 顺序重要性 - **错误写法**:`command 2>&1 > file` - 此时stderr会输出到终端,只有stdout写入文件 - 原因:`2>&1` 先绑定到原stdout(终端),后续 `> file` 仅改变stdout指向 --- ### 三、常见应用场景 1. **后台日志记录** ```shell nohup ./server.sh > server.log 2>&1 & ``` - 服务端程序后台运行,所有输出(含错误)记录到日志文件[^5] 2. **批量任务处理** ```shell for i in {1..10}; do process_data $i > result_$i.log 2>&1 & done ``` - 并行处理10个任务,每个任务独立记录日志 3. **忽略所有输出** ```shell command > /dev/null 2>&1 & ``` - 丢弃所有输出,常用于静默后台任务[^4] --- ### 四、扩展对比 | 语法形式 | 作用 | 输出流向 | |-------------------|------------------------------|-----------------------------| | `command > file` | 仅重定向stdout到文件 | stdout到文件,stderr到终端 | | `command 2> file` | 仅重定向stderr到文件 | stderr到文件,stdout到终端 | | `command &> file` | 同时重定向stdout+stderr到文件 | 所有输出到文件(Bash特有语法)| | `command > file 2>&1` | 等效于 `&> file` | 所有输出到文件(POSIX标准写法)| --- ### 五、注意事项 1. **符号顺序敏感**:`2>&1` 必须写在重定向目标之后(如 `> file` 之后)[^3] 2. **后台任务管理**:需配合 `nohup` 或 `disown` 防止终端退出时进程被终止 3. **日志文件维护**:长期运行的任务需定期清理日志或使用日志轮替工具 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值