你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux 系统中重定向的常见用法

[复制链接]
gaosmile 发布时间:2020-7-27 19:48

相信大家平时都会有需要复制粘贴数据的时候,如果是打开文件进行复制粘贴,就不可避免的需要较多的鼠标与键盘的操作,就会比较繁琐。那么有没有可以省掉这些繁琐操作的复制粘贴的方法呢?

答案是肯定的,那就是重定向。重定向是一种高效的方法,无需大量的鼠标与键盘操作就可以完成数据的转移。重定向可以分为输入重定向以及输出重定向这两种类型。由于所有程序都有输入或者输出,因此输入和输出的重定向是任何编程语言或脚本语言都自带的功能。

每当你与计算机交互时,重定向就必然会发生。学会使用重定向,不仅可以让你与计算机更好地交互,还可以提高你的工作效率,因此,请让我为你讲解 Linux 系统中重定向的常见用法:

* ]- I- L2 G3 x; j  O! t4 A) Y

Linux 中的数据流


; G" S1 R9 \2 J; K" R8 g

/ A+ E8 x6 N1 w; e

谈到 Linux 的重定向,就不得不提以下这3种数据流:

  • 输入信息会从 stdin 中读取(标准输入,通常是键盘或鼠标)。
  • 输出信息会被输出到 stdout (标准输出,一个文本文件或者数据流)。
  • 错误信息会被输出到 stderr。& Z) W1 G% Z5 l8 A" B. n

了解了这些数据流的存在,在你使用 Shell 时,你就可以更好地控制数据的流向了。

在 Linux 系统中,标准输入,标准输出以及标准错误都作为文件存在。你可以在 /dev目录下看到它们:


  1. 2 [  ]- d5 k- }) v' q. g; x
  2. $ ls /dev/std*1 ?2 ?% J, R$ q
  3. /dev/stderr  /dev/stdin  /dev/stdout1 X% [  J$ G9 |9 ]4 _. O
复制代码
* R% R' q/ o& _5 O3 P- F( V0 p& A. }

重定向输出


6 O/ o3 Q  r- b8 H. Q1 m
& I" X7 ?* ?0 l) O  F# x

在 Linux 系统中,使用 > 字符表示重定向输出。例如,将 ls 命令的输出重定向到一个文件中:

  1. ' i: V1 Z* H9 r# @8 B
  2. $ ls > list.txt
复制代码


- Y; u5 }/ E$ F

执行以上命令后,屏幕上并不会显示 ls 命令的输出信息,因为输出信息已经被重定向至 list.txt 文件中了。

除此之外,重定向还有许多用途,它还可以用于复制文件的内容,而且不限于复制文本文件,二进制文件也可以复制:


  1. & y6 q, N. {. @7 r0 i
  2. $ cat image.png > picture.png
复制代码

( F* h5 B4 E" Y* g9 K% D

如果你想要将一个文件的内容复制到另一个文件的末尾,你只需将 > 字符换成 >>字符串即可,像这样:

  1. <font style="background-color:rgb(255, 255, 255)"><font face="Tahoma"><font color="black">
    % Y$ G. E; X  [0 F6 d* Y
  2. $ cat lxlinux >> alvi</font></font></font>! k. u7 S5 N: U  h2 O0 [8 a/ Y
复制代码
5 _9 Y+ S: P( B4 T3 Y- g, C

重定向输入


) k* B) o! _: w+ a% a- J
2 g, b6 k4 `8 `; ~7 V

与重定向输出相反,重定向输入使用的是 < 字符。

输入重定向可以将输入信息重定向至命令中作为参数使用。该功能可能比较少用,但是,当命令需要一个参数列表时,而这些参数都存在一个文件中,然后你想快速地将它们从文件中复制粘贴到终端,这时这个功能就能派上用场了。

例如,package.list 里记录了你需要安装的包的列表,而你想要快速地安装所有的包,只需执行以下这一条命令,就能一次性安装 package.list 里的所有包:


  1. 0 Z- M( a$ h. ?! w7 U/ E) e
  2. $ sudo dnf install $(<package.list)
复制代码


+ d8 T$ G# k% d3 f0 T, q1 j

输入重定向的常见用法是 Here-document (简称 Here-doc) 以及 Here-string 。

Here-doc 将输入的文本块重定向至标准输入流,直至遇到特殊的文件结束标记符为止(文件结束标记符可以是任意的唯一的字符串,但大部分人都默认使用 EOF)。

你可以尝试在终端输入以下命令(直到第二个 EOF 字符串结束):

  1. % E5 x( c/ Q$ v& g$ O' D% @
  2. $ cat << EOF8 b2 H9 y8 |$ v; t; _
  3. > alvin
    3 W6 E4 {4 \4 w* Q1 P6 e, @
  4. > lxlinux.net5 c3 o& v4 f; ~& c  N0 r
  5. > EOF
复制代码


; @8 S  t6 P5 t+ R5 d$ s

预期的输出应该是这样的:

  1. <font style="background-color:rgb(255, 255, 255)"><font face="Tahoma"><font color="black">4 K" w$ ]6 n0 U8 E' a* c7 _' |
  2. alvin
    9 J* m& t) v8 \( `0 t3 ]
  3. lxlinux.net</font></font></font>
    # [8 X2 N- d4 V! g, Z4 Q4 R
复制代码

Here-doc 是 Bash 脚本编写者们将多行文本转储到文件或屏幕上的常用技巧。

Here-string 与 Here-doc 相似,但是它只有一个字符串,或者几个被引号括起来的字符串:


  1. 7 ?) l! X% E) R& H# A; Y
  2. $ cat <<< alvin
    : d9 H& P1 N9 U, c+ W
  3. alvin
    . F1 l4 o- v% o3 F+ a$ v
  4. $ cat <<< "alvin lxlinux.net"
    5 }8 e. w; i2 Q  f& i
  5. alvin lxlinux.net
    8 _! r: ?; H' q
复制代码

7 N' I) s, ^3 Q+ {. b6 I

重定向错误信息

% M& V! m# y5 y+ v. W
$ @/ G: D! ~* E" V, L% i& O

错误信息默认会进入叫 stderr 的流,使用 2> 可以对其进行重定向。例如,将错误信息重定向到名为 output.log 的文件中:

  1. <font style="background-color:rgb(255, 255, 255)"><font face="Tahoma"><font color="black">" D6 u& r0 k% S+ O5 u8 ~
  2. $ ls /nope 2> output.log</font></font></font>9 S/ [8 ~7 e3 T* n5 m5 E
复制代码
! F$ R; }9 G# I! U6 n

重定向数据至 /dev/null

/ y* }' `5 e% f- J, p

2 z3 ~2 I; B- M7 c

就像标准输入、标准输出以及标准错误一样,在 Linux 文件系统中,空,也存在一个文件与之对应,它叫做 null ,放在 /dev 目录下。为了方便读,人们经常省略斜杠,直接把他读作 dev null 。

/dev/null 并不保存数据,被写入 /dev/null 的数据最终都会丢失,就像被丢进虚空中一样。因此,你可以使用重定向将不需要的数据输送到 /dev/null 。例如,find 命令的输出往往很冗长,而且在搜索文件时还经常会报告权限冲突的错误,像这样:

  1. 5 A2 O  n2 E2 N+ C
  2. $ find ~ -type f7 _' z+ s1 U1 M; v" M
  3. /home/seth/actual.file
    ( q( [, t( u% b/ {: J  d5 j
  4. find: `/home/seth/foggy': Permission denied
    - w% l1 N  x1 c/ r, i7 M7 G# D
  5. find: `/home/seth/groggy': Permission denied. x+ n' d4 X* L, W* l
  6. find: `/home/seth/soggy': Permission denied
    ' F3 d& t* y- U
  7. /home/seth/zzz.file
复制代码

- B8 ]  B% Z( n( O9 K. z

这时,你就可以将错误信息重定向到 /dev/null ,以过滤掉不必要的信息,像这样:

  1. & C& o3 v2 z9 U+ y7 z! R
  2. $ find ~ -type f 2> /dev/null2 X  E2 J  J' l# f# J6 h
  3. /home/seth/actual.file
    , P% A5 V3 D' q
  4. /home/seth/zzz.file
复制代码


  r# J" a' y3 K2 d. q: U- j$ p

善用重定向


  Z3 A5 Z5 y0 e/ |+ q1 N# B) v, E

$ I! Y' F* g. b6 ]+ R9 a

在 Bash 中,重定向是转移数据的一种高效方法。你可能并不会总是使用重定向,但是学会如何使用重定向,在你需要的时候可以让你省掉许多不必要的复制粘贴操作,因此也节省了许多操作鼠标与键盘的时间。请不要执着于复制粘贴了,使用重定向可以提高你的工作效率,难道,它不香吗?

最后,希望本文的内容对你的工作有所帮助,如果你还对 Linux 系统中的重定向有疑问,请留言告诉我呗!


1 j% o! Q5 x5 `# ~7 S4 s- Y: m
赞 收藏 评论0 发布时间:2020-7-27 19:48

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版