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'?您的示例數據沒有任何數字內容。 –