Saya mencoba menulis fungsi bash sederhana yang mengambil, sebagai argumennya, sejumlah file dan / atau direktori. Itu harus:
- Sepenuhnya memenuhi syarat nama file.
- Sortir mereka.
- 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 kembalinya skrip sebagaimana mestinya benar, tetapi hasilnya tidak (tidak disortir dan digandakan). Jika saya batalkan komentar | sort -u
seperti yang ditunjukkan, output sudah benar tetapi nilai kembali selalu 0
.
NB solusi yang lebih sederhana untuk menyelesaikan masalah ini disambut baik tetapi pertanyaannya adalah tentang mengapa ini terjadi pada kode yang saya miliki. Artinya, mengapa menambahkan pipa sepertinya menghentikan skrip yang menambah variabel r
?
Ini skripnya:
function uniqfile
{
local r=0
for arg in "$@"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
for arg in "$@"
menjadifor arg
. "Jika 'dalam KATA ...;' tidak ada, maka 'dalam "$ @"' diasumsikan. " - help forJawaban:
Ini adalah perangkap bash yang terkenal, karena fitur ini :
sehingga variabel yang dimodifikasi adalah lokal ke subkulit, dan tidak terlihat sekali kembali di induk.
Untuk menghindari itu, ulangi kode Anda untuk menghindari pipa, dengan substitusi proses:
sumber
>(..command..)
konstruknya. Saya rasa saya tahu cara kerjanya tetapi saya merasa harus melakukan bacaan lebih lanjut.The
| sort -u
pasukan bit sebelumnya (sehingga seluruh untuk loop) untuk menjalankan dalam sub-proses (bash membutuhkan 'STDOUT' untuk mengarahkan kesort
'STDIN'. (Internet tampaknya berpikirksh
danbash
menangani kasus ini sedikit berbeda .. pertama atau terakhir perintah dalam urutan pipa akan dimasukkan ke dalam subkulit?)Utas ini membahas masalah serupa, dan memiliki solusi rapi di bagian akhir: http://ubuntuforums.org/showthread.php?t=312017
kutipansumber