首页 > 系统相关 >Shell 输入/输出重定向

Shell 输入/输出重定向

时间:2023-04-02 22:14:33浏览次数:36  
标签:输出 Shell 重定向 文件 command file 输入

Shell 输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。

一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。

同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符

  • 0 通常是标准输入(STDIN),
  • 1 是标准输出(STDOUT),
  • 2 是标准错误输出(STDERR)。

输出重定向

重定向一般通过在命令间插入特定的符号来实现。

特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。

注意任何file1内的已经存在的内容将被新内容替代。

如果要将新内容添加在文件末尾,请使用>>操作符。

实例

执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):

root@jdit:/home/wht# who>users

执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

你可以使用 cat 命令查看文件内容:

root@jdit:/home/wht# cat users
root     pts/0        2023-04-02 21:11 (163.125.113.166)

输出重定向会覆盖文件内容,请看下面的例子:

root@jdit:/home/wht# echo java >users
root@jdit:/home/wht# cat users
java

如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:

root@jdit:/home/wht# echo python >> users
root@jdit:/home/wht# cat users
java
python

输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

注意:输出重定向是大于号(>),输入重定向是小于号(<)。

实例

接着以上实例,我们需要统计 users 文件的行数,执行以下命令:

$ wc -l users
       2 users

也可以将输入重定向到 users 文件:

$  wc -l < users
       2 

注意:上面两个例子的结果不同:

第一个例子,会输出文件名;

第二个不会,因为它仅仅知道从标准输入读取内容。

command1 < infile > outfile

同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

重定向深入讲解

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

如果希望 stderr 重定向到 file,可以这样写:

$ command 2>file

如果希望 stderr 追加到 file 文件末尾,可以这样写:

$ command 2>>file

2 表示标准错误文件(stderr)。

如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

$ command > file 2>&1

或者

$ command >> file 2>&1

如果希望对 stdin 和 stdout 都重定向,可以这样写:

$ command < file1 >file2

command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。


Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。

它的基本的形式如下:

command << delimiter
    document
delimiter

它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。

注意:

  • 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
  • 开始的delimiter前后的空格会被忽略掉。

实例

在命令行中通过 wc -l 命令计算 Here Document 的行数:

$ wc -l << EOF
    欢迎来到
    菜鸟教程
    www.runoob.com
EOF
3          # 输出结果为 3 行
$

我们也可以将 Here Document 用在脚本中,例如:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

cat << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF

执行以上脚本,输出结果:

欢迎来到
菜鸟教程
www.runoob.com

/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1

注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
这里的 2> 之间不可以有空格,2> 是一体的时候才表示错误输出。

标签:输出,Shell,重定向,文件,command,file,输入
From: https://www.cnblogs.com/hcgk/p/17281529.html

相关文章

  • Shell 文件包含
    Shell文件包含和其他语言一样,Shell也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。这就是可以解决怎么引入公共函数了注意source未必有效,因为有些OS默认的是sh而非bashShell文件包含的语法格式如下:.filename#注意点号(.)和文件名中......
  • Shell 函数
    Shell函数各种语言都有函数或者别的称呼,说白了就是封装一个可重复使用的代码快,起一个名称带一些参数,给一个返回值。linuxshell可以用户定义函数,然后在shell脚本中可以随便调用。shell中函数的定义格式如下:[function]funname[()]{action;[returnint;]}......
  • Shell echo命令
    Shellecho命令Shell的echo指令用于字符串的输出。命令格式:shellstring的字面量有点特殊,核心注意单引号和双引号的区别echostring您可以使用echo实现更复杂的输出格式控制。1.显示普通字符串:echo"Itisatest"这里的双引号完全可以省略,以下命令与上面实例效果一......
  • Shell printf 命令
    Shellprintf命令printf命令模仿C程序库(library)里的printf()程序。printf由POSIX标准所定义,因此使用printf的脚本比使用echo移植性好。printf使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认......
  • Shell test 命令
    Shelltest命令Shell中的test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。有点像mybatis中的iftest数值测试参数说明-eq等于则为真-ne不等于则为真-gt大于则为真-ge大于等于则为真-lt小于则为真-le小于等于......
  • Shell 数组
    Shell数组数组中可以存放多个值。BashShell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。与大部分编程语言类似,数组元素的下标由0开始。Shell数组用括号来表示,元素用"空格"符号分割开,语法格式如下:array_name=(value1value2...valuen)实例root@jdit:......
  • Shell 基本运算符
    Shell基本运算符Shell和其他编程语言一样,支持多种运算符,包括:算数运算符关系运算符布尔运算符字符串运算符文件测试运算符原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用。这就很神奇了,和其他语言不同基本的原算法都要给第三方......
  • CMD、Powershell、Bash
    总体来说,CMD、Powershell和Bash都是命令行工具,用于执行各种命令和脚本,但它们的功能和用法都有所不同,根据不同的需求选择不同的命令行工具。CMDCMD(CommandPrompt)是Windows操作系统中的命令行工具,提供了基本的命令行交互功能,如文件管理、进程管理、网络管理等。CMD是Windows系统......
  • Shell数组练习
    1、将/etc/shadow文件的每一行作为元素赋值给数组#!/bin/bash#统计行数,作为循环次数num=`wc-l</etc/shadow`for((i=0;i<=num;i++))do#根据i的变化取前i行内容再然后截取最后一行加入数组中array[$i]=$(head-$i/etc/shadow|tail-1)done#依次输出数组中......
  • 在input输入框光标位置插入内容
    letinput=document.getElementById('input')lettextToInsert='我是插入的内容';letstartPosition=input.selectionStart;letendPosition=input.selectionEnd;input.value=input.value.substring(0,startPosition)+textToInsert+input.val......