我是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
无法正常工作。
脚本有什么问题?
答案 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
并未发生。
如果未指定文件操作数,则应使用标准输入;如果文件操作数为
-
,并且实现将-
视为标准输入,则应使用标准输入。否则,不得使用标准输入。请参阅“输入文件”部分。