我是 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
无法正常工作。
脚本有什么问题?
问题出在以下行中:
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 标准
还相关:使用破折号代替文件名
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句