0
我想对排序的数据进行排序并更新现有文件。排序文件
的country.csv
文件内容
India,Australia
,我现在用的就是
tr , '\n' < country.csv | sort -n | paste -sd, - > country.csv
但该命令,当我检查,country.csv
是空的。
我想对排序的数据进行排序并更新现有文件。排序文件
的country.csv
文件内容
India,Australia
,我现在用的就是
tr , '\n' < country.csv | sort -n | paste -sd, - > country.csv
但该命令,当我检查,country.csv
是空的。
这是预期:管道安装发生之前管线内部的计划已经执行(主要是 - 这是不同步的,所以在有些情况下的execve
呼吁管道的早期部分仍然可以发生,而后面部分的重定向不完整),因此您的>country.csv
在读取文件之前擦除文件内容。
写入不同的输出文件并重命名。
即:
#!/bin/bash
# ^^^^- to let us use the below safety feature:
set -o pipefail # bashism: fail the whole pipeline if any component fails
tempfile=$(mktemp country.csv.XXXXXX)
if tr , '\n' <country.csv | sort -n | paste -sd, - >"$tempfile"; then
mv "$tempfile" country.csv
else
rm -f "$tempfile"
fi
采用mktemp
确保这多个实例可以在同一时间运行,而且每次都会有自己的临时文件 - 因此,他们不会伤害,他人的工作 - 同时也表达了对一些安全漏洞(如符号链接攻击)的抵制。
它确实增加了一个警告,因为mktemp
设置了限制性文件权限 - 如果您打算输出文件是组或世界可访问的,则可能需要自行更新这些文件。
... btw,'sort -n'?您的示例数据没有任何数字内容。 –