Shell 脚本编写第 4 部分 – 输入、输出和重定向

2023-10-18

在上一篇文章中,我们讨论了参数和选项详细。今天,我们将讨论 shell 脚本中的一些基本内容,即输入、输出和重定向。

您可以通过两种方式显示 shell 脚本的输出:

  • 在屏幕上显示输出。
  • 将输出发送到文件。

 

 

标准文件描述符

Linux 中的一切都是文件,包括输入和输出。

每个进程可以同时打开九个文件描述符。文件描述符 0、1、2 保留供 bash shell 使用。

0              STDIN。

1              标准输出。

2              STDERR。

您可以使用上面的文件描述符来控制输入和输出。

您需要完全理解这三者,因为它们就像 shell 脚本的支柱。因此,我们将详细描述它们中的每一个。

 

STDIN

STDIN代表标准输入,默认就是键盘。

您可以使用输入重定向符号 (

当您不加任何内容地键入 cat 命令时,它会接受来自 STDIN 的输入。您键入的任何行,cat 命令都会将该行打印到屏幕上。

 

STDOUT

STDOUT代表标准输出,即默认的屏幕。

您可以使用 >> 符号将输出重定向到文件。

如果我们有一个包含数据的文件,您可以使用此符号将数据附加到其中,如下所示:


pwd >> myfile  

pwd 生成的输出将附加到文件中,而不删除现有内容。

以下命令尝试使用 > 符号将输出重定向到文件。


ls –l xfile > myfile  

我的 PC 上没有名为 xfile 的文件,这会生成发送到 STDERR 的错误。

 

STDERR

默认情况下,shell 将错误发送到屏幕。

如果您需要将错误重定向到日志文件而不是将其发送到屏幕,则可以使用重定向符号重定向错误。

 

重定向错误

我们可以通过将文件描述符(2)放在重定向符号之前来重定向错误,如下所示:


ls -l xfile 2>myfile  

cat ./myfile  

如您所见,现在错误出现在文件中,屏幕上没有任何内容。

 

重定向错误和正常输出

要重定向错误和正常输出,您必须在每个错误和正常输出之前添加正确的文件描述符,如下所示:


ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent  

ls 命令结果使用以下命令发送到正确的内容文件1>象征。错误消息已使用以下命令发送到 errorcontent 文件2> symbol.

您可以使用以下命令将正常输出和错误重定向到同一文件&>像这样的符号:


ls –l myfile xfile anotherfile &> content  

在这里,我们将错误和正常输出重定向到名为 content.txt 的文件。

 

输出重定向

输出重定向有两种方法:

  • 暂时重定向。
  • 永久重定向。

临时重定向

对于临时重定向,您可以使用 >&2 符号,如下所示:


#!/bin/bash
echo "Error message" >&2
echo "Normal message"  

因此,如果我们运行它,我们将看到两行都正常打印,因为众所周知,默认情况下错误会显示在屏幕上。

您可以将错误重定向到如下文件:


./myscript 2> myfile  

Shell 脚本太棒了!正常输出被发送到屏幕,而带有 >&2 符号的回显消息将错误发送到文件。

永久重定向

如果您有大量数据需要重定向,可以使用 exec 命令进行永久重定向,如下所示:


#!/bin/bash
exec 1>outfile
echo "Permanent redirection"
echo "from a shell to a file."
echo "without redirecting every line"  

如果我们查看名为 outfile 的文件,我们将看到 echo 行的输出。

我们在开头重定向 STDOUT,那么在这样的脚本中间呢:


#!/bin/bash
exec 2>myerror
echo "Script Begining ..."
echo "Redirecting Output"
exec 1>myfile
echo "Output goes to the myfile"
echo "Output goes to myerror file" >&2  

exec 命令将所有错误重定向到文件 myerror,并将标准输出发送到屏幕。

我们使用语句 exec 1>myfile 将输出重定向到 myfile 文件,最后,错误使用 >&2 符号转到 myerror 文件。

 

重定向输入

您可以使用 exec 命令将输入​​重定向到文件而不是 STDIN,如下所示:


exec 0< myfile  

此命令告诉 shell 从名为 myfile 而不是 STDIN 的文件中获取输入,下面是一个示例:


#!/bin/bash
exec 0<testfile
total=1
while read line; do
	echo "#$total: $line"
	total=$(($total + 1))
done  

Shell 脚本编写很简单。

你知道如何使用读命令获取用户输入。如果将 STDIN 重定向到文件,则读取命令将尝试从指向该文件的 STDIN 读取。

一些 Linux 系统管理员使用这种技术来读取日志文件进行处理,我们将讨论更多以专业的方式阅读即将发布的日志的方法。

 

创建自定义重定向

您知道有九个文件描述符,您只使用其中的 3 个用于输入、输出和错误。

其余六个文件描述符可用于输入和输出重定向。

我们可以使用 exec 命令为输出分配文件描述符,如下所示:


#!/bin/bash
exec 3>myfile
echo "This line appears on the screen"
echo "This line stored on myfile" >&3
echo "This line appears on the screen"  

 

创建输入文件描述符

要重定向输入文件描述符,请执行以下操作:

1- 将 STDIN 保存到另一个文件描述符。

2- 将其重定向到文件。

3- 将 STDIN 恢复到其原始位置。

查看以下代码以了解这些步骤:


#!/bin/bash
exec 7<&0
exec 0<myfile
total=1
while read line; do
	echo "#$total: $line"
	total=$(($total + 1))
done
exec 0<&7
read -p "Finished? " res
case $res in
y) echo "Goodbye" ;;
n) echo "Sorry, this is the end." ;;
esac  

我们将 STDIN 保存到文件描述符 7,并将 STDIN 重定向到文件。

在迭代文件行后,STDIN 恢复到其原始位置。

最后读取命令只是为了确保 STDIN 已恢复,并且可以正常使用键盘。

 

关闭文件描述符

当脚本退出时,文件描述符将自动关闭。如果您想自己关闭文件描述符,请将文件描述符重定向到该符号&- 它将被关闭。


#!/bin/bash
exec 3> myfile
echo "Testing ..." >&3
exec 3>&-
echo "Nothing works" >&3  

正如您所看到的,它给出了错误文件描述符的错误,因为它不再存在。

 

lsof 命令

The lsof命令用于列出系统上所有打开的文件和后台进程。

在许多 Linux 系统(例如 Fedora)上,lsof 命令位于 /usr/sbin 下。

这是 lsof 命令的一些重要选项:

-p:进程ID。

-d:文件描述符。

您可以使用 $$ 变量获取进程 PID。

我们可以使用 -a 来组合 -p 选项和 -d 选项的结果。

现在,从脚本测试命令:


#!/bin/bash
exec 4> myfile1
exec 5> myfile2
exec 6< myfile3
lsof -a -p $$ -d 0,1,2,4,5,6  

shell 脚本创建文件描述符 4 和 5 用于写入,文件描述符 6 用于读取。

 

抑制命令输出

有时您不想看到任何输出。我们将输出重定向到黑洞,这是/dev/空.

例如,我们可以抑制这样的错误:


ls -al badfile anotherfile 2> /dev/null  

您可以使用相同的命令截断文件而不完全删除它。


cat /dev/null > myfile  

现在您了解了输入和输出、如何重定向它们、如何创建文件描述符并重定向到它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell 脚本编写第 4 部分 – 输入、输出和重定向 的相关文章

随机推荐

  • 如何创建 Tar Gz 文件

    tar 存档是一个存储其他文件集合的文件 包括有关这些文件的信息 例如所有权 权限和时间戳 在 Linux 操作系统中 您可以使用tar创建 tar 档案的命令 该命令还可以使用各种压缩程序来压缩档案 其中 gzip 是最流行的算法 按照约
  • 如何在 Ubuntu 20.04 上安装 GCC (build-essential)

    GNU 编译器集合 GCC 是 C C Objective C Fortran Ada Go D 编程语言 很多开源项目 包括Linux内核和GNU工具 都是使用GCC编译的 本文介绍如何在 Ubuntu 20 04 上安装 GCC 在 U
  • 如何在 Debian 9 上安装和使用 FFmpeg

    FFmpeg 是一个免费的开源命令行工具 用于对多媒体文件进行转码 它包含一组共享的音频和视频库 例如libavcodec libavformat和libavutil 使用 FFmpeg 您可以在各种视频和音频格式之间进行转换 设置采样率以
  • 如何在 Ubuntu 18.04 上安装 Python 3.7

    Python 是世界上最流行的编程语言之一 凭借其简单易学的语法 Python 是初学者和经验丰富的开发人员的绝佳选择 Python 是一种非常通用的编程语言 它可以用作脚本语言来构建游戏 开发网站 创建机器学习算法和分析数据 Python
  • 如何在 CentOS 7 上安装 VLC 媒体播放器

    VLC 是一种流行的开源多媒体播放器和流媒体服务器 它是跨平台的 几乎可以播放所有多媒体文件以及 DVD 音频 CD 和不同的流媒体协议 本教程介绍如何在 CentOS 7 上安装 VLC 媒体播放器 先决条件 您需要以以下身份登录具有 s
  • 如何在 Ubuntu 20.04 上安装和使用 FFmpeg

    FFmpeg 是一个用于处理多媒体文件的免费开源工具集合 它包含一组共享的音频和视频库 例如libavcodec libavformat和libavutil 使用 FFmpeg 您可以在各种视频和音频格式之间进行转换 设置采样率 捕获流音频
  • Linux 睡眠命令(暂停 Bash 脚本)

    sleep是一个命令行实用程序 允许您将调用进程挂起指定的时间 换句话说 sleep命令将下一个命令的执行暂停给定的秒数 The sleep该命令在 bash shell 脚本中使用时非常有用 例如 在重试失败的操作或在循环内时 在本教程中
  • 如何在 Ubuntu 18.04 上安装 CouchDB

    CouchDB 是由 Apache 软件基金会维护的免费开源容错 NoSQL 数据库 CouchDB 服务器将其数据存储在命名数据库中 其中包含以下文档JSON结构 每个文档由许多字段和附件组成 字段可以包括文本 数字 列表 布尔值等 它包
  • 如何在 Debian 10 上安装 Xrdp 服务器(远程桌面)

    Xrdp 是 Microsoft 远程桌面协议 RDP 的开源实现 允许您以图形方式控制远程系统 使用 RDP 您可以登录到远程计算机并创建真实的桌面会话 就像登录到本地计算机一样 本教程介绍如何在 Debian 10 Linux 上安装和
  • 如何使用SFTP命令传输文件

    SFTP SSH 文件传输协议 是一种安全文件协议 用于通过加密的 SSH 传输访问 管理和传输文件 与传统的相比FTPSFTP 提供 FTP 的所有功能 但更安全且更易于配置 Unlike SCPSFTP 仅支持文件传输 但允许您对远程文
  • 15+ yum update 命令示例

    Yum 是 Red Hat CentOS 和其他操作系统上使用的包管理器Linux 发行版使用 RPM 包管理器 Yum 用于安装 更新 删除或以其他方式操作这些 Linux 系统上安装的软件包 在本教程中 我们将介绍 yum update
  • Seaborn barplot 教程(以条形图可视化您的数据)

    数据可视化已成为与分析数据进行交流的重要阶段 通过数据可视化 数据科学家和业务分析师可以轻松地从大量数据中提取见解 Seaborn 是一种 Python 中的统计图形绘图和可视化库 允许数据分析师和数据科学专业人员呈现可视化 在本文中 我们
  • 15 个 Linux 读取命令示例

    The readLinux 中的命令允许您从标准输入或文件中读取输入 它允许您接收数据并将其分配给变量 本教程将指导您完成不同的选项read命令 目录 hide 1 读取用户的输入 2 从文件中读取输入 3 指定分隔符
  • 创建和使用动态 Laravel 子域路由

    许多网站为用户的个人资料或页面提供了一个自定义子域 因此用户可以通过 http username website com 访问他的个人资料 这要好得多 在这篇文章中 我们将了解如何高效地进行动态 Laravel 子域路由 配置DNS 要做到
  • 使用 Pandas read_html 函数读取 HTML 表格

    您可以使用read html直接从网站抓取 HTML 表格并将其转换为数据框 它简化了从网页提取数据的过程 The read html函数接受一个包含 URL 或指向 HTML 文件的文件路径的字符串 提取该 HTML 页面中包含的所有表
  • Python SQLite3教程(数据库编程)

    在本教程中 我们将使用 Python 以编程方式使用 SQLite3 数据库 一般来说 SQLite 是一种无服务器数据库 您可以在包括 Python 在内的几乎所有编程语言中使用它 无服务器意味着无需安装单独的服务器即可使用 SQLite
  • Linux iptables 防火墙简化示例

    在上一篇文章中 我们讨论了如何使用强化最佳实践保护 Linux 服务器 有人问我防火墙部分 里面简单介绍了iptables防火墙 今天我们就来详细讨论一下Linux iptables 防火墙以及如何使用出色的防火墙来保护您的服务器流量 目录
  • Bash For 循环:Linux 中的迭代指南

    Bash 中的 for 循环是重要的控制结构 用于脚本编写重复任务 它们提供多次执行一系列命令 循环范围 变量 命令输出等的能力 这个综合教程将带您了解在 Bash 中使用 for 循环的各种方法 从基本语法到更高级的主题 例如嵌套循环和动
  • 使用 Pandas read_parquet 读取 Parquet 文件

    The read parquet函数于Pandas允许您将 Parquet 文件读入数据框 它提供了从本地文件路径或 URL 读取 Parquet 文件的功能 它的多功能性还不止于此 该函数提供了几个额外的选项来加载和处理文件中的数据 目录
  • Shell 脚本编写第 4 部分 – 输入、输出和重定向

    在上一篇文章中 我们讨论了参数和选项详细 今天 我们将讨论 shell 脚本中的一些基本内容 即输入 输出和重定向 您可以通过两种方式显示 shell 脚本的输出 在屏幕上显示输出 将输出发送到文件 目录 hide 1 标准文件描述符 2