sed命令执行不正确

时间:2018-09-04 09:40:11

标签: bash sed

我是Bash的新手,正在尝试使用sed修改文件。考虑这个简单的例子:

#!/bin/bash

shopt -s extglob
file="/root/test.txt"

# Modify the file.
sed "s/apple/orange/g" $file -> $file.tmp && mv $file.tmp $file

我运行脚本,并且挂起。查看目录:

ls
test.sh test.txt test.txt.tmp

显示test.txt.tmp已创建,但mv无法正常工作。

脚本有什么问题?

1 个答案:

答案 0 :(得分:1)

问题在以下几行:

sed "s/apple/orange/g" $file -> $file.tmp && mv $file.tmp $file

Bash将此行解释为:

sed "s/apple/orange/g" $file - > $file.tmp && mv $file.tmp $file

请注意细微的差别(->之间的空格)。

现在,这是怎么回事? - <连字符>被解释为文件。更具体地说,/dev/stdin。这意味着sed正在等待来自/dev/stdin的输入。这也是它挂起的原因。它实际上不是挂起的,而是在等待输入。已创建文件$file.tmp,但是由于sed命令仍在执行,因此mv并未发生。

  

如果未指定文件操作数,则应使用标准输入;如果文件操作数为-,并且实现将-视为标准输入,则应使用标准输入。否则,不得使用标准输入。请参阅“输入文件”部分。

     

来源:POSIX sed standard

也相关:Usage of a dash in place of a filename