关于shell命令的定向输出 2>&1

mycommand >mylog.txt 2>&1 应该是最经典的用法了。

命令的结果可以通过“%>”的形式来定向输出,%表示文件描述符:1为标准输出stdout、2为标准错误stderr。系统默认%值是1,也就是“1>”,而1>可以简写为>,也就是默认为>。stdout的默认目标是终端,stderr的默认目标为也是终端。我们在批处理中执行: echo text >result.txt ,我们就可以在屏幕上会看到 echo text 1>result.txt ,即是这个道理。

其中&需要直接与重定向符号结合使用。

参考:
1、http://www.google.cn/search?q="2>%261"
2、http://www.microsoft.com/technet/prodtechnol/windowsserver2003/zh-chs/library/ServerHelp/04969a04-a424-4776-bdc7-dc5066ce79b2.mspx?mfr=true

应用实例:

1、将结果输出到result.txt
net stop myservices >>result 2>&1

2、隐藏程序输出结果
net stop myservices >nul 2>nul


 微软关于重定向的文章:

使用命令重定向操作符

更新日期: 01/21/2005

使用命令重定向操作符

可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到其他位置。输入或输出数据流的位置称为句柄。

下表将列出可用的句柄。

 
句柄句柄的数字代号描述

STDIN

0

键盘输入

STDOUT

1

输出到命令提示符窗口

STDERR

2

错误输出到命令提示符窗口

UNDEFINED

3-9

句柄由应用程序单独定义,它们是各个工具特有的

 

数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序,并对该程序前 10 个句柄中的任何一个句柄进行重定向。要指定要用的句柄,请在重定向操作符之前键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置。可以指定文件名或其他现有的句柄。

要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(即 &句柄号)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):

2>&1

下表列出了可用于重定向输入和输出数据流的操作符。

 
重定向操作符描述

>

将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。

<

从文件而不是从键盘或句柄读入命令输入。

>>

将命令输出添加到文件末尾而不删除文件中已有的信息。

>&

将一个句柄的输出写入到另一个句柄的输入中。

<&

从一个句柄读取输入并将其写入到另一个句柄输出中。

|

从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

 

默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。

重定向输入 (<)

要通过键盘将输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入:

sort<file.txt

File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。

< 操作符可以打开具有只读访问权限的指定文件名。因此,不能在使用该操作符时向文件中写入信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只写访问方式打开的。

注意

0 是 < 重定向输入操作符的默认句柄。

重定向输出 (>)

几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。

要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入:

dir>dirlist.txt

如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。

要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入:

netsh routing dump>c:/route.cfg

> 操作符可以打开具有只写访问权限的指定文件。因此,不能使用该操作符读取文件。例如,如果使用重定向操作符 >&0 启动程序,则写入句柄 1 的所有尝试操作都将失败,因为句柄 0 最初是以只读访问方式打开的。

注意

1 是 > 重定向输出操作符的默认句柄。

复制句柄

重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:

dir>c:/file.txt 2>&1

复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只读访问的属性,则该句柄的所有副本都具有只读访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。

使用 & 操作符重定向输入和副本

要将重定向输入操作符 (<) 与复制操作符 (&) 结合使用,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件包含的字符作为输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。

例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:

<file.txt

要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:

sort<file.txt

要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入:

findfile file.txt>search.txt 2<&1

要以句柄 0 输入读取(即 STDIN)的方式复制用户定义的句柄 3,请键入:

<&3

使用 & 操作符重定向输出和复制

如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。

要将用户定义的句柄 3 复制到句柄 1,请键入:

>&3

要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:

ipconfig.exe>>output.log 2>&1

使用 >> 重定向操作符附加输出

要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。例如,使用下列命令可以将 dir 命令生成的目录列表附加到 Dirlist.txt 文件:

dir>>dirlist.txt

要将 netstat 命令的输出附加到 Tcpinfo.txt 的末尾,请键入:

netstat>>tcpinfo.txt

使用管道操作符 (|)

管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其定向到另一个命令的输入(默认情况下是 STDIN)中。例如,使用下面的命令可以对目录进行分类:

dir | sort

在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。

合并带重定向操作符的命令

通过合并带有其他命令和文件名的筛选器命令,可以创建自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名:

dir /b | find "log" loglist.txt

dir 命令的输出是通过 find 筛选器命令进行发送的。包含字符串“LOG”的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。

要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将搜索 C 盘上的每个目录以查找包含“LOG”字符串的文件名,并且在命令提示符窗口中每次显示一屏:

dir c:/ /s /b | find "log" | more

利用管道 (|) 可以对 Cmd.exe 进行定向,使其通过 find 筛选器命令发送 dir 命令输出。find 命令只选择包含字符串“LOG”的文件名。more 命令可以显示 find 命令选择的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅使用筛选器

<think>好的,我现在要处理用户的问题:“>> ./log 2>&1日志重定向失败”。用户遇到了日志重定向失败的情况,需要我帮忙分析可能的原因。首先,我得回忆一下Shell中重定向的相关知识,特别是关于文件描述符的处理。 用户使用的命令结构是“>> ./log 2>&1”,这应该是想把标准输出(stdout)和标准错误(stderr)都追加到./log文件中。通常,正确的写法应该是“command >> logfile 2>&1”或者“command &>> logfile”(在Bash中)。但用户可能在这里的顺序出了问题,或者有其他原因导致失败。 首先,我需要检查重定向的顺序是否正确。在Shell中,重定向的顺序很重要,因为文件描述符的指向是按顺序处理的。比如,如果用户写成“>> log 2>&1”,这表示先将stdout重定向到log文件,然后将stderr重定向到stdout当前指向的地方,也就是log文件。这样应该是正确的,但可能用户实际输入的命令有其他问题,比如命令部分是否正确,或者路径是否有权限问题。 接下来,可能的错误点有几个方面: 1. 文件路径问题:用户指定的./log文件所在的目录是否存在?用户是否有权限在该目录下创建或写入文件?如果当前目录不存在,或者用户没有写权限,重定向就会失败。 2. 语法顺序问题:虽然用户给出的例子中顺序是对的,但可能在实际使用时,命令的其他部分导致解析错误。例如,如果命令中包含特殊字符没有转义,可能会导致Shell解析错误,使得重定向没有按预期执行。 3. Shell的兼容性问题:不同的Shell可能对重定向的处理略有不同。比如,在较旧的Shell中,可能需要更严格的语法,而Bash可能支持更简洁的写法。用户是否使用了不兼容的Shell? 4. 文件描述符是否正确关闭:某些情况下,如果文件描述符被其他进程占用或未正确关闭,可能会导致重定向失败,但这比较少见。 另外,用户是否在命令中正确使用了重定向符号?比如,是否遗漏了命令部分,直接运行了“>> ./log 2>&1”而没有前置命令?这会导致Shell解析错误,因为没有命令可执行。 还需要考虑文件名的问题,例如,log是否是一个目录而非文件,或者文件名中包含特殊字符,比如空格,但没有用引号包裹,导致路径被拆分成多个参数。 总结下来,我需要分步骤引导用户检查这些可能性。首先确认命令结构是否正确,特别是重定向的顺序;检查文件路径的权限和有效性;确认Shell环境是否支持这种重定向写法;以及检查是否有其他语法错误,比如遗漏命令或特殊字符未处理。 另外,用户可能需要具体的示例来说明正确和错误的用法对比,以及如何验证每一步的问题。例如,建议用户使用简单的命令(如echo测试)来排除命令本身的问题,再检查文件系统权限等。</think>当使用`>> ./log 2>&1`进行日志重定向时,若遇到失败,可能由以下原因导致。请按以下步骤排查: --- ### **1. 检查重定向顺序是否正确** Shell中重定向的顺序很重要,需确保先指定输出目标,再绑定错误流: ```bash # 正确写法:标准输出和错误都追加到文件 命令 >> ./log 2>&1 # 错误写法(错误流可能不会重定向文件命令 2>&1 >> ./log ``` --- ### **2. 验证文件路径和权限** - **路径是否存在?** 若`./log`指向的目录不存在,重定向会失败。例如当前目录下无`log`文件或目录。 ```bash # 检查文件是否存在 ls -l ./log ``` - **是否有写入权限?** 若文件权限不足,尝试赋予写权限: ```bash chmod +w ./log ``` - **是否误操作目录?** 若`./log`是目录而非文件,重定向会失败。需删除目录或指定文件名。 --- ### **3. 检查特殊字符或空格** 若路径含空格或特殊字符(如`*`, `?`),需用引号包裹: ```bash # 含空格的文件命令 >> "my log.txt" 2>&1 ``` --- ### **4. Shell兼容性问题** 某些Shell(如`sh`)可能不支持简化写法,需明确分开: ```bash # Bash中可简化 命令 &>> ./log # 通用写法 命令 >> ./log 2>&1 ``` --- ### **5. 命令本身是否存在错误?** - 如果命令执行失败(如语法错误),可能导致重定向未生效。 先单独运行命令,确认其可执行: ```bash # 示例:用echo测试 echo "test" >> ./log 2>&1 ``` --- ### **6. 检查文件描述符是否被占用** 极少数情况下,文件描述符冲突可能导致问题。可尝试关闭无关句柄: ```bash 命令 2>&1 >> ./log < /dev/null ``` --- ### **总结解决方案** 1. **按正确顺序书写重定向** ```bash 命令 >> ./log 2>&1 ``` 2. **检查路径权限** 确保`./log`可写且是文件。 3. **用简单命令测试** 用`echo "test"`验证重定向是否生效。 4. **更换绝对路径** 尝试使用绝对路径(如`/tmp/log`)排除路径问题。 若问题仍存在,请提供具体命令和错误提示以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值