linux中Bash重定向输出使用示例

重定向标准输出

> 重定向当前命令的标准输出(STDOUT)到一个文件或者一个描述符。
下面的例子把ls命令的输出存到file.txt文件

ls >file.txt
> file.txt ls
目标文件如果不存在就会被创建,或者文件被截断。
如果不指定,默认重定向描述符是标准输出或1。下面的命令等同于上面的例子:

ls 1>file.txt
追加 vs 截断

截断 >
1.如果文件不存在则创建
2.截断(删除文件内容)
3.写入文件

$ echo "first line" > /tmp/lines
$ echo "second line" > /tmp/lines
 
$ cat /tmp/lines
second line
追加 >>
1.如果文件不存在则创建
2.追加文件(在文件底部写)

# Overwrite existing file
$ echo "first line" > /tmp/lines
 
# Append a second line
$ echo "second line" >> /tmp/lines
 
$ cat /tmp/lines
first line
second line
重定向标准输出和标准错误

文件描述符像0和1都是指针。我们更改的是文件描述符的指向。
>/dev/null意思是1指向/dev/null。
首先我们把1(STDOUT)指向/dev/null,然后2指向1(不管1指向什么)。

echo_to_stdout_and_stderr >/dev/null 2>&1
可以更短点:
echo_to_stdout_and_stderr &> /dev/null

使用命名管道

有时候你想把一个程序的标准输出作为其它多个程序的标准输入,这时候就不能用标准管道了,不过你可以写入一个临时文件,如:

touch tempFile.txt
ls -l > tempFile.txt &
grep ".log" < tempFile.txt
这个方法可以在大多数情况下有效,但谁都不知道tempFile.txt会被哪个程序删除或者修改里面的内容。这时候命名管道就可以用上场了。

mkfifo myPipe
ls -l > myPipe
grep ".log" < myPipe
myPipe在技术上是一个文件,所以我们来用ls -l看下当前创建管道的目录

mkdir pipeFolder
cd pipeFolder
mkfifo myPipe
ls -l
输出为:
prw-r–r– 1 root root 0 Jul 25 11:20 myPipe
注意权限的第一个字符,显示是pipe,不是文件。
现在我们做了有意思的。
打开一个终端,在一个空目录创建管道:

mkfifo myPipe
现在我们输入点东西到管道:

echo "Hello from the other side" > myPipe
你会注意到这个命令被挂起了,让我们打开一个新的终端,输入:

cat < myPipe
你会发现当”hello from the other side”输出后,终端1就完成了,终端2也一样。
现在我们反向运行程序,先执行cat < myPipe,然后再输入点东西到myPipe,它仍然按预期工作,因为一个程序会一起等待直到管道中被输入一些东西。 命名管道在终端间或程序间传递信息时会非常有用。

输出错误信息到标准错误

错误信息通常为了调度会包含在脚本里。简单的输出错误信息如下:

cmd || echo 'cmd failed'
可能会在简单的场景工作,但不是通常的做法。在这个例子中,错误信息会会污染脚本实际的输出。简单来说,错误信息应该输出到标准错误而不是标准输出,如:

cmd || echo 'cmd failed' >/dev/stderr
其它例子:

if cmd; then
    echo 'success'
else
    echo 'cmd failed' >/dev/stderr
fi
可以封装成一个函数:

err(){
    echo "E: $*" >>/dev/stderr
}
err "My error message"

时间: 2024-10-01 12:37:26

linux中Bash重定向输出使用示例的相关文章

linux中Bash内部变量使用示例

$@ "$@"把所有的命令行参数作为一个数组返回.与"$*"不一样,它是作为一个字符串来返回. "$@"可以通过循环来遍历所有元素,如下脚本: #!/bin/bash for var in "$*"; do     echo $var done 因为$*只把参数作为一个字符串返回,echo就只被调用一次: ~> $ ./testscript.sh firstarg secondarg thirdarg firstarg

linux中Bash数组使用示例

数组赋值 列表赋值 用新元素创建数组 array=('first element' 'second element' 'third element') 下标赋值 显式指定元素索引创建数组: array=([3]='fourth element' [4]='fifth element') 按索引赋值 array[0]='first element' array[1]='second element' 按名称赋值(关联数组) declare -A array array[first]='First

linux中Bash shell学习笔记

BASH 的基本语法 •最简单的例子 -- Hello World www.111cn.net ! •关于输入.输出和错误输出 •BASH 中对变量的规定(与 C 语言的异同) •BASH 中的基本流程控制语法 •函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash # T

linux中使用 awk 输出文本中的字段和列

在 Awk 系列的这一节中,我们将看到 awk 最重要的特性之一,字段编辑. 首先我们要知道,Awk 能够自动将输入的行,分隔为若干字段.每一个字段就是一组字符,它们和其他的字段由一个内部字段分隔符分隔开来. 如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你应该知道什么是内部字段分隔符(IFS)变量.awk 中默认的 IFS 是制表符和空格. awk 中的字段分隔符的工作原理如下:当读到一行输入时,将它按照指定的 IFS 分割为不同字段,第一组字符就是字段一,可以通

linux中bash: service: command not found 错误

  今天在进行linux操作的时候,要对vsftpd服务进行重启,使用service vsftpd restart,此时报了一个难以让人相信的错误: bash: service: command not found 于是我到网上去一搜了一下,解决方法其实挺简单的,使用su切换到root账号的时候前加一个"-"即: su - root 进入root账号后再使用 service vsftpd restart 问题解决了! 后来我去网上找了些出现这个错误的原因: service命令是要用RO

linux中bash: wget: command not found问题解决方法

一般linux最小化安装时,wget不会默认被安装. 提示bash: xx command not found. 那么,首先就要考虑root 的$PATH里是否已经包含了这些环境变量(可能是我安装的时候选择了"最小安装",导致一些功能没开启). 如果新装的系统,运行一些很正常的诸如:shutdown,fdisk的命令时,悍然提示:bash:command not found.那么 首先就要考虑root 的$PATH里是否已经包含了这些环境变量. 主要是这四个:/bin ,/usr/bi

linux中Bash数组操作教程

一.定义数组 1. 使用[]操作符 names[0]='zrong' names[1]='jacky' 2. 使用()直接赋值 names=('zrong' 'jacky') # 或 names=([0]='zrong' [1]='jacky') 3. 使用declare -a定义数组.这种方法可以将一个空的变量定义成数组类型. declare -a names 4. 从文件中读取数组 cat>names.txt zrong jacky sweet Ctrl+C # 将每一行读取为数组的一个元素

linux中&quot;-bash: make: command not found&quot;安装提示错误解决办法

今天老左有在尝试一个教程的时候编译make的过程中有看到centos环境出现"-bash: make: command not found"的错误提示,之前好像也没有遇到过这样的问题.应该是系统中缺少某个组件造成的,于是搜索解决方案且记录下来,以便于日后在出现这样的问题可以直接复制解决.   出现当前的问题,应该是系统中没有安装make等常用命令造成的,那就一并安装掉.  代码如下 复制代码  yum -y install gcc automake autoconf libtool m

linux中bash读写文件的例子

#!/bin/bash   #读取文件内容到变量中 filecontent=`cat ~/file.txt`    `是TAB键上那个 echo $filecontent   #取得文件内容的每一行 for fileline in $filecontent   do     echo $fileline   done   #写内容到文件中 echo $filecontent >> test.txt bash内置Unix命令 .:执行当前进程环境中的程序.同source. . file:dotU