GNU/Linux >> Belajar Linux >  >> Linux

Perpipaan Untuk Output Loop Mencegah Modifikasi Variabel Lokal?

Saya mencoba menulis fungsi bash sederhana yang menggunakan, sebagai argumennya, sejumlah file dan/atau direktori. Seharusnya:

  1. Sepenuhnya memenuhi syarat nama file.
  2. Urutkan.
  3. Hapus duplikat.
  4. Cetak semua yang benar-benar ada.
  5. 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)

Linux
  1. Kembalikan kode sed jika tidak cocok

  2. Warna berbeda untuk perintah dan output

  3. Bagaimana mengurutkan keluaran ini 1,10,11..2

  1. Panduan Bash For Loop dan Contohnya

  2. Menyimpan Output Perintah Dalam Variabel Shell?

  3. Bagaimana saya bisa mengurutkan output du -h berdasarkan ukuran

  1. Sejajarkan Bash Untuk Loop?

  2. Output Dari Perintah Yang Digunakan Untuk Input Ke Cd?

  3. Urutkan Output Berdasarkan Kolom?