我想对内容进行排序,并仅使用已排序的数据更新现有文件。
country.csv
文件内容为
India,Australia
我使用的命令是
tr , '\n' < country.csv | sort -n | paste -sd, - > country.csv
但是,当我检查时,country.csv
为空。
答案 0 :(得分:1)
这是预期的:管道设置在管道内的程序执行之前发生(大多数情况下 - 它不同步,因此有些情况下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
设置限制性文件权限 - 如果您打算将输出文件设置为组或可以访问世界,则可能需要自己更新这些文件。