Pysyin oudossa käyttäytymisessä readarray -komennossa.
man bash -tila:
readarray Read lines from the standard input into the indexed array variable array
mutta nämä komentosarjat eivät toimi (taulukko on tyhjä):
unset arr; (echo a; echo b; echo c) | readarray arr; echo ${#arr[@]} unset arr; cat /etc/passwd | readarray arr; echo ${#arr[@]}
Ja nämä toimivat:
unset arr; readarray arr < /etc/passwd ; echo ${#arr[@]} unset arr; mkfifo /tmp/fifo; (echo a; echo b; echo c) > /tmp/fifo & mapfile arr < /tmp/fifo ; echo ${#arr[@]}
Mitä vikaa putkella on?
vastaus
Ehkä yritä:
unset arr printf %s\\n a b c | { readarray arr echo ${#arr[@]} }
Odotan, että se toimii , mutta tällä hetkellä kun astut ulos viimeisestä { -kuoren ; } kontekstista | pipeline siellä menetät muuttujasi arvon. Tämä johtuu siitä, että kukin | erillisestä | prosessista | -putkessa suoritetaan a ( alikuori ). Joten sinun juttusi ei toimi samasta syystä:
( arr=( a b c ) ) ; echo ${arr[@]}
… ei ”t – muuttujan arvo asetettiin eri shell-prosessi kuin se, johon sitä kutsutaan.
Vastaa
Varmistaaksesi, että readarray -komento suoritetaan nykyisessä kuoressa joko käyttämällä prosessikorvausta putkilinjan sijasta:
readarray -t arr < <( echo a; echo b; echo c )
tai (jos bash 4.2 tai uudempi) käytä lastpipe -vaihtoehtoa:
shopt -s lastpipe ( echo a; echo b; echo c ) | readarray -t arr
kommentit
Vastaus
readarray voi lukea myös stdinistä, joten:
readarray arr <<< "$(echo a; echo b; echo c)"; echo ${#arr[@]}
< <2 nuolta?bash-sivua. Lyhyesti sanottuna se ' n syntaksia putkilinjan käsittelemiseksi tiedostokuvaajana.< <(...)tarkoittaa tulon uudelleenohjaamista (ensimmäinen<) komennon lähdöstä<(...). Samoin> >(...)välittäisi vakiolähdön putkiston vakiotuloon>(...)sisällä. Sinun ' ei välttämättä tarvitse käyttää uudelleenohjausta prosessin korvaamisen kanssa.cat <( echo a b c )toimii myös.readarray -t arr. Alkaenman bash:-t Remove a trailing newline from each line read.bash5.0.17 ja tämä ei toimi '. Olen ' jopa tarkistanutBASHOPTSja se sisältäälastpipe, muttacat myfile.txt | readarray -t arrantaa tyhjänarr, muttareadarray -t arr < <(cat myfile.txt)toimii oikein.