Saya mencoba menulis fungsi bash sederhana yang menggunakan, sebagai argumennya, sejumlah file dan/atau direktori. Seharusnya:
- Sepenuhnya memenuhi syarat nama file.
- Urutkan.
- Hapus duplikat.
- Cetak semua yang benar-benar ada.
- Kembalikan jumlah file yang tidak ada.
Saya memiliki skrip yang hampir melakukan apa yang saya inginkan, tetapi jatuh pada penyortiran. Nilai kembalian skrip sebagaimana adanya sudah benar, tetapi outputnya tidak (tidak disortir dan digandakan). Jika saya membatalkan komentar pada | sort -u
pernyataan seperti yang ditunjukkan, outputnya benar tetapi nilai baliknya selalu .
N.B. Solusi yang lebih sederhana untuk memecahkan masalah dipersilakan tetapi pertanyaannya adalah mengapa ini terjadi dalam kode yang saya miliki. Yaitu, mengapa menambahkan pipa tampaknya menghentikan skrip yang menambah variabel r
?
Berikut scriptnya:
function uniqfile
{
local r=0
for arg in "[email protected]"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
Jawaban yang Diterima:
Ini adalah perangkap bash yang terkenal, karena fitur ini :
Setiap perintah dalam pipeline dieksekusi sebagai proses terpisah (yaitu, dalam subkulit).
sehingga variabel yang dimodifikasi bersifat lokal ke subkulit, dan tidak terlihat sekali lagi di induknya.
Untuk menghindarinya, ulangi kode Anda untuk menghindari pipeline, dengan substitusi proses:
for arg in "[email protected]"
do
readlink -e "$arg" || (( ++r ))
done > >(sort -u)