什么将这个命令吗?
exec 2>&1
什么将这个命令吗?
exec 2>&1
从技术上讲它复制,或副本,标准错误到标准输出。
通常你不需要exec来执行此。 EXEC的文件描述符更典型的用法是表示要分配文件到一个未使用的文件描述符,如
EXEC 35 <my_input
顺便说一句,不要忘了申报的管道连接到文件时的顺序是非常重要的,所以
ls > mydirlist 2>&1
就会起作用,因为它指导标准输出和标准错误输出到文件mydirlist,而命令
ls 2>&1 > mydirlist
只定向标准输出,而不是标准错误,提交mydirlist,因为标准错误作出标准输出的一个副本之前标准输出重定向到mydirlist。
编辑:这是shell工作扫描由左到右的方式。 因此,阅读第二个是说“拷贝标准错误到标准输出”它说之前“送标准输出到mydirlist”。 然后读取第一个的话说,“送标准输出到文件mydirlist”之前,它说:“标准错误复制到该标准输出我已经设置了”。 我知道。 这是完全不直观!
一个更好的文章中,我已经看到了什么是“2>&1”确实是猛砸单行解释,第三部分:所有关于重定向 。
但是,在这个问题上目前的答案不能提供就是为什么你会想要一个简单的“执行”来做到这一点。 至于exec命令bash的手册页解释说:“如果没有指定命令,任何重定向采取在当前shell效应”。
我写了一个叫做简单的脚本out-and-err.py
写入一个线路输出到标准输出,而另一条线路标准错误:
#!/usr/bin/python
import sys
sys.stdout.write('this is stdout.\n')
sys.stderr.write('this is stderr.\n')
然后我裹在一个外壳脚本调用out-and-err.sh与“EXEC 2>&1”:
#!/bin/bash
exec 2>&1
./out-and-err.py
如果我只运行python脚本,输出和错误是分开的:
$ ./out-and-err.py 1> out 2> err
$ cat out
this is stdout.
$ cat err
the is stderr.
但是,如果我运行shell脚本,你可以看到EXEC照顾标准错误的一切后:
$ ./out-and-err.sh 1> out 2> err
$ cat out
this is stdout.
this is stderr.
$ cat err
$
如果您的包裹shell脚本并不仅仅是一个Python的命令多了很多,你需要所有输出合并为标准输出,做“EXEC 2>&1”将使该您轻松。
它关系标准错误到标准输出
该2
是stderr和1
是标准输出。 当你运行一个程序,你会得到在标准输出正常的输出,但是任何错误或警告通常去到stderr。 如果你要管所有的输出到例如一个文件,它是有用的先用标准输出与标准错误结合2>&1
。
就像@cma说,它把标准错误在标准输出上。 你可能想这种现象的原因是使用grep或其他工具来捕获仅在stderr上显示输出。 或者你可能只是想保存所有的输出,包括标准错误,为以后处理的文件。
中的一个非常有用的应用程序exec 2>&1
,我所遇到的是当你要合并stderr
和stdout
为用分号分隔的命令。 我的具体的例子发生在我将派遣一个以上的命令popen
在PHP和我想看看错误交织就像你会看到,如果你输入在shell提示符下输入命令:
$ echo hi ; yikes ; echo there
hi
-bash: yikes: command not found
there
$
以下不会合并stderr
和stdout
除了最后echo
(这是毫无意义的,因为yikes
导致错误):
echo hi ; yikes ; echo there 2>&1
我可以得到合并输出的“硬办法”,如下所示:
echo hi 2>&1; yikes 2>&1; echo there 2>&1
它看起来很干净,如果你容易使用更少的错误exec
:
exec 2>&1 ; echo hi; echo yikes; echo there
你得到的stdout
和stderr
输出很好地交织完全按照自己的终端上看到,如果你执行用分号隔开的三个命令。
这些天我在这个问题太闹心,但我现在从中跳出。 所以,请允许我解释后,你怎样就怎样输入exec 1>&2
的CLI。
我想破坏问题一块一块的,所以如果你知道的知识alread只是走马观花,以节省您的时间。
exec
代表: exec
是在Linux中内置的命令。 从传统的命令,它只是一个派生子shell进程不同, exec
可能会改变当前的shell进程。
什么是I / O重定向:重定向是在Linux中的功能。 有了这个,你可以更改标准输入/输出设备。 在Linux中,有三个默认的文件描述符。 Handle Name Description 0 stdin Standard input 1 stdout Standard output 2 stderr Standard error
让我看一个例子:
$ pstree -p | grep 'term' | tr -d ' '
$ pstree -p | grep 'term' | tr -d ' '
$ sudo ls -l /proc/{pid}/fd
bash $ pstree -p | grep -i 'terminal' | tr -d ' ' ||||-gnome-terminal-(6008)-+-bash(7641)-+-grep(8355) $ sudo ls -l /proc/7641/fd total 0 lrwx------ 1 alopex alopex 64 Oct 27 19:39 0 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 1 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 2 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 255 -> /dev/pts/3
bash $ pstree -p | grep -i 'terminal' | tr -d ' ' ||||-gnome-terminal-(6008)-+-bash(7641)-+-grep(8355) $ sudo ls -l /proc/7641/fd total 0 lrwx------ 1 alopex alopex 64 Oct 27 19:39 0 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 1 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 2 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 255 -> /dev/pts/3
bash $ pstree -p | grep -i 'terminal' | tr -d ' ' ||||-gnome-terminal-(6008)-+-bash(7641)-+-grep(8355) $ sudo ls -l /proc/7641/fd total 0 lrwx------ 1 alopex alopex 64 Oct 27 19:39 0 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 1 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 2 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 255 -> /dev/pts/3
正如可以看到,在ls
列出PID(6860)的过程的文件。 首先,他们所有的名称由数(0,1,2),第二它们都链接文件链接到/ dev / PTS / 3,这意味着任何标准输入/输出/错误都将在PTS3显示。 bash $ ls /tmp/stdout ls: cannot access '/tmp/stdout': No such file or directory $ exec 1>/tmp/stdout $ ls $ pwd $ echo "Are you ok" $
命令输出是消失在那个时候。 bash $ sudo ls -l /proc/7641/fd total 0 lrwx------ 1 alopex alopex 64 Oct 27 19:39 0 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 1 -> /tmp/stdout lrwx------ 1 alopex alopex 64 Oct 27 19:39 2 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 255 -> /dev/pts/3
很明显,我们可以注意到,1(文件描述符)已经改变链接到/ tmp /标准输出。 正如我们除了,标准输出传递到/ tmp /标准输出 bash $ exec 1>&2 $ cat /tmp/stdout a.sh /home/alopex Are you ok $ sudo ls -l /proc/7641/fd total 0 lrwx------ 1 alopex alopex 64 Oct 27 19:39 0 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 1 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 2 -> /dev/pts/3 lrwx------ 1 alopex alopex 64 Oct 27 19:39 255 -> /dev/pts/3
同样,1(文件描述符)链接到的/ dev / PTS / 3,我们可以再次看到输出。 摘要:
exec 1>&2
使标准输出--->标准误差