Shell之重定向

本文详细介绍了C语言标准库中的stdin、stdout、stderr三种流,并解释了如何通过重定向实现不同输出目的。
        对于任何一个C程序,都对应有stdin, stdout, stderr这三种由C语言标准库定义的三个标准流。默认情况下,这三个流都指向终端,重定向(redirection)就是将这三种流重新指向其他位置。

        对stdin,stdout,stderr这三种流进行重定向的形式共有五种:

  • 将stdout重定向于stderr
  • 将stderr重定向于stdout
  • 将stdout重定向于文件
  • 将stderr重定向于文件
  • 将stdout和stderr重定向于同一个文件


       下面是一个简单的程序

        

#include<stdio.h>
int main(int argc,char *argv[])
{
        fprintf(stdout,"This is an useless info sent to stdout.\n");
        fflush(stdout);
        fprintf(stderr,"This is an useless info sent to stderr.\n");
        return 0;
}

       第一种情况的写法为:

       ./main 1>&2

        输出结果为:

bash-4.2@redirection$ ./main 1>&2
This is an useless info sent to stdout.
This is an useless info sent to stderr.
      

       第二种情况的写法为:
       ./main 2>&1

       输出结果为:

This is an useless info sent to stdout.
This is an useless info sent to stderr.
         

      第三种情况的写法为:

      ./main 1>outfile

      输出结果为:

bash-4.2@redirection$ ./main 1 > outfile
This is an useless info sent to stderr.
bash-4.2@redirection$ cat outfile
This is an useless info sent to stdout.
bash-4.2@redirection$ 
        

     第四中情况的写法为:

     ./main 2>errfile

     输出结果为:   

bash-4.2@redirection$ ./main 2>errfile
This is an useless info sent to stdout.
bash-4.2@redirection$ cat errfile
This is an useless info sent to stderr.
bash-4.2@redirection$ 

   

     第五种情况的写法为:

     ./main 2>errfile 1>&2

     或者是:

     ./main 1>outfile 2>&1

     输出结果为:

bash-4.2@redirection$ ./main 1>outfile 2>&1
bash-4.2@redirection$ ./main 2>errfile 1>&2
bash-4.2@redirection$ cat errfile
This is an useless info sent to stdout.
This is an useless info sent to stderr.
bash-4.2@redirection$ cat outfile
This is an useless info sent to stdout.
This is an useless info sent to stderr.

<think>我们正在讨论shell输入重定向。根据用户的问题,他/她想了解如何在shell中实现输入重定向,包括使用方法和示例。 根据引用[1]:默认情况下,command < file 将stdin重定向到file。 引用[3]提到:在使用标准输入重定向技术时,bash会自动处理结束输入(如Ctrl+D)。 引用[5]:输入重定向通常是指将命令所需的输入数据的来源,从标准输入(即当前终端)更改为从指定文件中获取。 因此,我们可以总结: 输入重定向的基本语法是:命令 < 文件名 这样,命令将从指定的文件中读取输入,而不是等待用户从终端输入。 示例: 1. 统计文件中的行数、单词数和字符数: $ wc < filename 这里,wc命令通常从标准输入读取数据,但通过输入重定向,它改为从文件filename中读取。 2. 排序文件内容: $ sort < filename sort命令将对文件filename的内容进行排序,并将结果输出到标准输出(即终端)。 3. 输入重定向也可以与管道结合使用,但用户目前只询问输入重定向,所以我们先专注于输入重定向。 另外,引用[3]还提到一个例子:使用grep命令从文件中搜索模式。例如: $ grep "hello" < filename 这等价于 grep "hello" filename,因为grep命令本身可以接受文件名参数。但有些命令不接受文件名参数,只能从标准输入读取,这时输入重定向就很有用。 例如,tr命令(转换或删除字符)通常从标准输入读取: $ tr 'a-z' 'A-Z' < filename 这个命令将文件filename中的所有小写字母转换为大写字母。 此外,输入重定向还可以与here document结合使用,但用户没有提到,我们可以先不展开。 因此,回答结构如下: 1. 解释输入重定向的概念 2. 基本语法 3. 示例 4. 注意事项(比如与命令参数的区别) 同时,根据系统指令,我们需要生成相关问题。 注意:引用标识要自然地添加在引用段落的末尾。</think>### Shell 输入重定向详解 在 Shell 中,输入重定向(`<` 操作符)允许将命令的标准输入(stdin)来源从默认的键盘输入改为从指定文件读取数据。这是处理文件输入的高效方式,尤其适用于需要批量处理数据的场景。 #### 基本语法 ```bash command < input_file ``` - `command`:需要执行的命令 - `<`:输入重定向操作符 - `input_file`:提供输入数据的文件 #### 核心特点 1. 命令不从键盘等待输入,而是直接读取文件内容 2. 重定向操作由 Shell 解释执行(非命令自身功能) 3. Bash 会自动处理文件结束符(EOF),无需手动输入 `Ctrl+D`[^3] #### 使用示例 1. **基础文件输入** ```bash # 统计文件行数(替代 cat file | wc -l) wc -l < data.txt ``` 输出示例: ```bash 42 # 表示data.txt有42行 ``` 2. **结合过滤器使用** ```bash # 将文件内容转换为大写 tr 'a-z' 'A-Z' < notes.txt # 对数值文件排序 sort -n < values.csv ``` 3. **多级重定向组合** ```bash # 先筛选再排序(避免临时文件) grep "ERROR" < server.log | sort > errors.txt ``` 4. **Here Document 变体** ```bash # 嵌入多行文本输入(EOF可替换为任意标记符) cat <<EOF 第一行文本 第二行文本 EOF ``` #### 注意事项 1. **命令差异**:某些命令(如 `grep`)可直接接受文件名参数(`grep pattern file`),此时输入重定向非必需[^3] 2. **错误处理**:输入重定向仅影响 stdin,错误输出(stderr)仍显示在终端 3. **文件权限**:需确保执行用户对输入文件有读权限 4. **效率优势**:相比管道和临时文件,直接重定向减少 I/O 开销[^5] #### 典型应用场景 - 自动化脚本处理日志文件 - 批量数据转换(如 CSV 处理) - 程序测试时提供预设输入 - 避免交互式命令的手动输入
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值