Unix和Unix-like系统的Shell 中的 : > , >> , < , <<,<<< ,1>,2>,&>,|
在Unix和Unix-like系统的Shell中,常用的输出重定向操作包括:
>
或1>
- 标准输出重定向:用于将命令的标准输出(STDOUT)重定向到一个文件中,而不是显示在终端上。
例如:
ls > files.txt
会将ls
命令的输出保存到files.txt
文件中。
2>
- 标准错误重定向:用于将命令的标准错误(STDERR)重定向到一个文件中。
例如:
ls non_existent_directory 2> error.txt
会将错误消息保存到error.txt
文件中。
&>
- 标准输出和标准错误同时重定向:用于将命令的标准输出和标准错误都重定向到同一个文件中。
例如:
ls > all_output.txt 2>&1
或ls &> all_output.txt
会将所有输出都保存到all_output.txt
文件中。
>>
- 追加到文件:用于将输出追加到现有文件的末尾,而不是覆盖它。
例如:
echo "new line" >> existing_file.txt
会将new line
添加到existing_file.txt
文件的末尾。
<
- 标准输入重定向:用于将文件的内容作为命令的输入。
例如:
sort < unsorted.txt
会将unsorted.txt
文件的内容作为sort
命令的输入。
<<
- Here文档(Here Document):用于将接下来的输入直到一个定界符作为命令的标准输入。
例如:
cat <<EOF line 1 line 2 EOF
这将输出
line 1
和line 2
。
<<<
- Here字符串(Here String):用于将一个字符串作为命令的标准输入。
例如:
grep "word" <<< "search for word"
会在给定的字符串中搜索"word"。
|
- 管道:用于将一个命令的输出作为另一个命令的输入。
例如:
ls | grep "txt"
会列出所有文件,然后只显示包含"txt"的行。
这些重定向和管道的使用非常灵活,可以根据需要组合使用来实现复杂的数据流控制。
为了避免权限问题,您可以尝试只在您的用户目录下或其他非系统目录中运行搜索命令。例如:
find ~ -name "*yunshu*"
这将只在您的用户目录(由~
表示)和其子目录中搜索文件名包含"yunshu"的文件。
如果您想避免这些权限错误,可以将错误消息重定向到/dev/null
,这样就只会看到成功的搜索结果:
find / -name "*yunshu*" 2>/dev/null
这里2>/dev/null
是将标准错误(所有的错误消息)重定向到/dev/null
,这是一个特殊的文件,会丢弃所有写入它的数据。这样您的输出中就只包含成功找到的文件路径了。
command 2>&1 > output.log
这样会先将标准错误重定向到标准输出,然后再将标准输出重定向到文件,实际上你会得到只有标准错误的输出,而标准输出会被丢弃。在命令中,2>&1 的顺序非常重要,必须在 1 被重定向之后执行,否则你可能会遇到将标准输出重定向到错误输出的问题
在 2>&1 中,数字和符号的含义如下:
1. 2
• 2 代表 标准错误输出(stderr),它是一个文件描述符。在 Linux 系统中,所有的输入和输出都与文件描述符相关联。标准错误输出(stderr)是一个专门用来输出错误信息的流,它的文件描述符是 2。
• 标准输入(stdin):文件描述符为 0。
• 标准输出(stdout):文件描述符为 1。
• 标准错误输出(stderr):文件描述符为 2。
2. &
• & 在这里表示 文件描述符。它用来指示后面紧跟着的 数字是文件描述符 而不是文件名。它告诉 shell,&1 指的是 文件描述符 1,也就是标准输出(stdout)。
也就是说,& 表示 将标准错误输出重定向到标准输出,它告诉系统 “去看文件描述符 1”。
3. 1
• 1 代表 标准输出(stdout),它是一个文件描述符,指向的是正常的输出流。通常,命令的正常结果输出都会显示在屏幕上,或者重定向到其他文件。
整体理解:2>&1
• 2 是标准错误输出的文件描述符(stderr)。
• & 表示后面的是一个文件描述符,而不是文件名。
• 1 是标准输出的文件描述符(stdout)。
因此,2>&1 的意思是:将标准错误输出(stderr)重定向到标准输出(stdout)的位置,即将错误信息与正常输出合并到一起。