Ukazi za Linux

Bash Xargs na primer ukažejo na trdo pot

Bash Xargs na primer ukažejo na trdo pot
Ko se šele na težek način začnete učiti programiranja bash, vam nihče ne pove za ukaz xargs. Od takrat vam je uspelo pobrati dovolj xarg, da ste se prebili, ne da bi se preveč zlomili. Zdaj se vprašate - Kaj pa vse te druge možnosti? Lahko to storim? Kaj če hočem .. ?

Zdaj verjetno že dovolj dobro razumete, kako izvršiti ukaz v bash. Kaj pa, če želite tokove ukazov izvajati zaporedoma ali včasih vzporedno? Tam se znajdemo s pomočjo xargov.

Tu upamo, da bomo na vsa ta vprašanja in še več o bashu in ukazu xargs odgovorili z zgledom.

Kaj je xargs v bash?

xargs je zunanji ukaz, ki se uporablja za pretvori standardni vhod v argumente ukazne vrstice to naj bi pomenilo »razširjeni argumenti."Ustvarjen je bil predvsem za uporabo z ukazi, ki niso zgrajeni za obdelavo cevnega vhoda ali standardnega vhoda, kot so rm, cp, echo 1 in drugi zunanji ukazi, ki samo sprejemajo argumente kot parametre.

1 Čeprav ima večina sistemov ukaz echo, je echo vgrajen bash; To je, razen če se uporablja ukaz echo, vgrajeni odmev. Podobno tudi bash vgrajeni ne poznajo vnosa po ceveh.

Možnosti Xargs s primeri bash

Poglejmo si xargs in njegove možnosti s primeri v bash. Skupaj s konvencionalno obravnavo možnosti ukazne vrstice, pričakovane z xargs, so možnosti razvrščene po predmetih, kot so pridobivanje informacij ali spreminjanje vedenja.

Informacije o Xargs

Tu so možnosti za informacije o xargih.

Xargs pomaga

xargs --pomoč
Uporaba: xargs [NEOBVEZNO]… UKAZ [ZAČETNI ARG]…
Zaženite COMMAND z argumenti INITIAL-ARGS in več argumentov, prebranih iz vnosa.
Obvezni in neobvezni argumenti dolgih možnosti so tudi
obvezno ali neobvezno za ustrezno kratko možnost.
-0, --null predmeti so ločeni z nulo, ne s presledki;
onemogoči obdelavo ponudb in poševnic in
logična obdelava EOF
-a, --arg-file = FILE branje argumentov iz FILE, ne standardni vnos
-d, --delimiter = CHARACTER elementi v vhodnem toku so ločeni s CHARACTER,
ne s presledki; onemogoči narekovaj in poševnico nazaj
obdelava in logična obdelava EOF
-E END nastavi logični niz EOF; če se END pojavlja kot črta
vnosa, preostali del vnosa se prezre
(prezrto, če je bilo določeno -0 ali -d)
-e, --eof [= END], enakovredno -E END, če je določen END;
v nasprotnem primeru ni konca datoteke
-I R enako kot --replace = R
-i, --replace [= R] zamenjajte R v INICIAL-ARGS z prebranimi imeni
iz standardnega vhoda; če R ni določen,
predpostavimo
-L, --max-lines = MAX-LINES uporabi največ MAX-LINES nepraznih vnosnih vrstic na
ukazna vrstica
-l [MAX-LINES] je podoben -L, vendar je privzeto največ en ne-
prazna vnosna vrstica, če ni določeno MAX-LINES
-n, --max-args = MAX-ARGS uporabi največ MAX-ARGS argumentov na ukazno vrstico
-P, --max-procs = MAX-PROCS zažene največ največ procesov MAX-PROCS hkrati
-p, - interaktivni poziv pred izvajanjem ukazov
--process-slot-var = VAR nastavi spremenljivko okolja VAR v podrejenih procesih
-r, --no-run-if-empty, če ni argumentov, potem ne zaženite COMMAND;
če ta možnost ni dana, bo COMMAND
teči vsaj enkrat
-s, --max-chars = MAX-CHARS omeji dolžino ukazne vrstice na MAX-CHARS
--show-limit prikaži omejitve dolžine ukazne vrstice
-t, --verbose ukaze za tiskanje pred njihovim izvajanjem
-x, --exit izhod, če je velikost (glej -s) presežena
--pomoč pri prikazu te pomoči in izhodu
--različica izhod informacije o različici in izhod

Glejte pomoč xargs kot hiter napotek za uporabo xargs in možnosti.

Različica Xargs

xargs --verzija
xargs (GNU findutils) 4.6.0

Omejitve Xargs

Tudi xargs ima svoje meje. Možnost -show-limit za xargs prikazuje omejitve, ki jih uporabljajo xargs pred izvajanjem ukazov. Dejanske omejitve so odvisne od vašega okolja. Vendar je za večino uporabnikov to dovolj. Omejitve lahko prilagodite v ukazni vrstici, glejte primere.

Primer) Vaše okolje xargs meje
xargs --show-limit
Spremenljivke vašega okolja zavzamejo 6234 bajtov
Zgornja meja POSIX-a za dolžino argumenta (ta sistem): 23718
POSIX najmanjša dovoljena zgornja meja dolžine argumenta (vsi sistemi): 4096
Največja dolžina ukaza, ki bi ga dejansko lahko uporabili: 17484
Velikost vmesnega pomnilnika, ki ga dejansko uporabljamo: 23718
Največja vzporednost (--max-procs ne sme biti večji): 2147483647

Izvajanje xargov se bo nadaljevalo zdaj in poskusilo bo prebrati svoje vhodne in zagnati ukaze; če se to ni zgodilo, prosimo, vnesite pritisk tipke ob koncu datoteke.

Opozorilo: odmev se bo zagnal vsaj enkrat.  Če ne želite, da se to zgodi, pritisnite tipko za prekinitev.

Upoštevajte, da je ukaz, ki bi se zagnal kot posledica xargs, echo, privzeti ukaz xargs.

Primer) Omejitve Xargs s prilagojeno omejitvijo vmesnega pomnilnika
xargs --show-limit -s 1
Spremenljivke vašega okolja zavzamejo 9479 bajtov
Zgornja omejitev POSIX-a na dolžino argumenta (ta sistem): 20473
POSIX najmanjša dovoljena zgornja meja dolžine argumenta (vsi sistemi): 4096
Največja dolžina ukaza, ki bi ga dejansko lahko uporabili: 10994
Velikost medpomnilnika, ki ga dejansko uporabljamo: 1
Največja vzporednost (--max-procs ne sme biti večji): 2147483647
..
Opozorilo: odmev se bo zagnal vsaj enkrat.  Če ne želite, da se to zgodi,
nato pritisnite tipko za prekinitev.
xargs: ni mogoče umestiti enega samega argumenta znotraj omejitve velikosti seznama argumentov

Upoštevajte, da se bodo napake pojavile na dnu naslednjih opozoril, če sploh. Imamo napako "xargs: ne more umestiti enega samega argumenta znotraj omejitve velikosti seznama argumentov", kar samo pomeni, da poskušamo delovati zunaj dovoljene velikosti medpomnilnika ukaza, ki je nastavljena na znak.

Ukazni vmesnik vsebuje ukaz, ki mu sledijo vsi argumenti, vključno s presledki.
V primeru ukaza v tem primeru možnosti xargs je medpomnilnik ukazov

"odmev"

ki vsebuje 4 znake.
Torej moramo nastaviti velikost medpomnilnika ukaza na vrednost, večjo ali enako 5, kot sledi. Upoštevajte, da bo poraba medpomnilnika ukazov enaka length_of_command + length_args_including_spaces_plus_one + 1.

xargs --show-limit -s 5

# Nič več "xargs: ni mogoče umestiti enega samega argumenta znotraj omejitve velikosti seznama argumentov" napaka

Kaj pa, če ima naš ukaz argumente?

da | xargs -t --show-limit -t -s 6 # se bo zagnal z naslednjim izhodom
odmev y
..

Xargs glasen

lhs | xargs -t other_xargs_options_if_any | rhs

Možnost -t lahko uporabite za prikaz ukazov, ki jih izvaja xargs, kot izhod v standardno napako fd2. To je xargs -t je mogoče izničiti s preusmeritvijo standardne napake v / dev / null, kot sledi.

xargs -t 2> / dev / null
Primer) Da enkrat
da | glava -n 5 | xargs -res res
res y y y y y y
Primer) Da 5-krat
da | glava -n 5 | xargs -t -I res
res y
res y
res y
res y
res y

Obnašanje Xargov

Noben ukaz ni popoln brez možnosti spreminjanja vedenja med izvajanjem. Xargs ni nič drugačen. Tu so možnosti, ki vam omogočajo, da spremenite njegovo vedenje.

Xargs ničelna

lhs | xargs -0 other_xargs_options_if_any | rhs

Z možnostjo -0 lahko xargov naročite, da namesto presledka uporabi null. Prav tako onemogoči narekovaje in ubežne sekvence.

da | glava -n 5 | sed "s /.* / cul- "de" - 'sac' / "| xargs -I echo -en" \ n \ x00 "
slepa ulica
slepa ulica
slepa ulica
slepa ulica
slepa ulica
da | glava -n 5 | sed "s /.* / cul- "de" - 'sac' / "| xargs -0 -I echo -en" \ n \ x00 "
cul- "de" - "vrečka"
cul- "de" - "vrečka"
cul- "de" - "vrečka"
cul- "de" - "vrečka"
cul- "de" - "vrečka"
Nič uporabe Xargs

Predvidena uporaba za xargs null je namenjena obravnavi primerov, na primer kadar predmeti vsebujejo presledke, kot so datoteke, ki vsebujejo presledke ali znake nove vrstice.

Recimo, da imate imenik "a b c", ki vsebuje presledke v imenu imenika.

je "a b c"
de / fg / h / 'i j k l' /

Zaženite ukaz v vsakem imeniku v “a b c” z uporabo ukaza find.

Lahko poskusite naslednje:

poiščite "a b c" -tip d | xargs du -d 0 -h
du: ne more dostopati do 'a': Takšne datoteke ali imenika ni
du: ne more dostopati do 'b': Takšne datoteke ali imenika ni
du: ne more dostopati do 'c': Takšne datoteke ali imenika ni
du: ne more dostopati do 'a': Takšne datoteke ali imenika ni
du: ne more dostopati do 'b': Takšne datoteke ali imenika ni
du: ne more dostopati do 'c / de': Takšne datoteke ali imenika ni
du: ne more dostopati do 'a': Takšne datoteke ali imenika ni
du: ne more dostopati do 'b': Takšne datoteke ali imenika ni
du: ne more dostopati do 'c / fg': Takšne datoteke ali imenika ni
du: ne more dostopati do 'a': Takšne datoteke ali imenika ni
du: ne more dostopati do 'b': Takšne datoteke ali imenika ni
du: ne more dostopati do 'c / h': Takšne datoteke ali imenika ni
du: ne more dostopati do 'a': Takšne datoteke ali imenika ni
du: ne more dostopati do 'b': Takšne datoteke ali imenika ni
du: ne more dostopati do 'c / i': Takšne datoteke ali imenika ni
du: ne more dostopati do 'j': Takšne datoteke ali imenika ni
du: ne more dostopati do 'k': Takšne datoteke ali imenika ni
du: ne more dostopati do 'l': Takšne datoteke ali imenika ni

Deluje nepravilno, ker so imena imenikov prežeta s presledki. To ni bil tvoj namen.

To lahko popravite z dodajanjem zamenjave xargs, tj.e -I , kot sledi.

poiščite "a b c" -tip d | xargs -i du -d 0 -h
0 a b c
0 a b c / de
0 a b c / fg
0 a b c / h
0 a b c / i j k l

Deluje pravilno, če uporabljate zamenjavo xargs. Upoštevajte, da smo uporabili -i, kar je okrajšava za -I .

Drug način, kako lahko dosežemo enak rezultat, je uporaba xargs null, -null v kombinaciji z možnostjo find -print0, kot sledi.

poiščite "a b c" -tip d -print0 | xargs --null -i du -d 0 -h
0 a b c
0 a b c / de
0 a b c / fg
0 a b c / h
0 a b c / i j k l

Super! Zdaj imamo več kot en način, da se potisnemo globoko v vesolje datotečnega sistema, ne da bi morali skrbeti za trčenje v vesoljsko smeti. Kar tako naprej.

Xargs interaktivni

Mogoče ne zaupate xargsu, da bo vse ukaze zagnal brez potrditve. V tem primeru je interaktivna xargs ali -p možnost, ki jo morate nadzorovati, katere ukaze izvaja xargs, kot sledi.

poiščite "a b c" -tip d -print0 | xargs --null -i -p du -d 0 -h
du -d 0 -h a b c ?..
du -d 0 -h a b c / de ?..
du -d 0 -h a b c / fg ?... y
0 a b c / fg
du -d 0 -h a b c / h ?... ja
0 a b c / h
du -d 0 -h a b c / i j k l ?... ne

Tu se zažene kateri koli ukaz, ki se začne z 'y' ali 'Y'. V nasprotnem primeru se ukazi prezrejo.

Datoteka Xargs

Že imate datoteko arg-datoteko, ki je pripravljena za branje v xargs. Vaš program morda nekje čaka okoli imenika, da nekdo drug ali drug primer vas spusti v arg-datoteko. V tem primeru lahko datoteko določite kot možnost xargs z uporabo -a arg-datoteke, namesto da bi morali uporabljati mačjo datoteko | xargs ... Sledijo primeri datotek Xargs.

Za zabavo spremenimo vaše postopke čiščenja namizja v arg-datoteko, ki jo lahko uporabimo.

ls cleanup-desktop | tee arg-datoteka
190605_cleanup_desktop_files_sh.txt
190605_cleanup_desktop_lnk_files_sh.txt
190605_cleanup_desktop_un_files_sh.txt

Vsaka datoteka vsebuje rutino, ki jo lahko zaženete z uporabo basha. To pomeni, da je ukaz, ki ga bomo uporabili, bash.

Zaženimo čiščenje s pomočjo xargs.

xargs -a arg-datoteka -i -P 99 bash -c 'echo ; . cleanup-desktop / ; '
190605_cleanup_desktop_files_sh.txt
190605_cleanup_desktop_lnk_files_sh.txt
190605_cleanup_desktop_un_files_sh.txt

In deluje!
V primeru, da moramo namesto vnosa po ceveh določiti arg-datoteko, je možnost datoteke xargs priročna.

Xargs zamenjajte

lhs_if_any | xargs -i other_args_etc | rhs_if_any

Nenazadnje vam xargs replace -i omogoča popoln nadzor nad obliko ukaza, preden se zažene. Uporabi se lahko kateri koli znak. Vendar po konvenciji večina programerjev bash uporablja ta ali ta%. Privzeta vrednost je . -i pove xargs, da boste uporabljali privzeto. In velja za stenografijo. -Sledil mi je nadomestni znak po vaši izbiri, ki xargs pove, kakšen znak boste uporabljali. Izogibajte se uporabi običajnih znakov, kot je črka a. To bo vašo kodo zlomilo bolj kot kateri koli presledek ali nova vrstica kdaj koli prej.

Xargs vzporedno

lhs_if_any | xargs -P n_ge_1 other_args_etc | rhs_if_any

Xargs vzporedno -P omogoča, da se ukazi izvajajo hkrati, namesto v zaporedju. Glejte xargs limit -show-limit za veljavne argumente za n_ge_1 ali sočasnost. Na primer, če

Največja vzporednost (--max-procs ne sme biti večji): 2147483647

-P 2147483647 lahko nastavite brez napak. V praksi boste morda našli lepšo nastavitev, kot je -P 99, ki izboljša splošno zmogljivost, ne da bi se povečali režijski stroški za upravljanje sočasnih procesov.

Sledijo primeri, ki kažejo, kako lahko vzporedna uporaba xargs izboljša zmogljivost.

Primer) Štetje v zaporedju v primerjavi z vzporednim z uporabo xargs

Poglejmo, kaj se zgodi, ko zaporedno štejemo čas z uporabo xargs.

časovni odmev 1… 1000 | xargs '-d' -i bash -c 'echo '
..
998
999
1000
pravi 1m13.927-ih
uporabnik 0m6.994s
sys 0m15.184-ih

Zdaj pa poglejte, kaj se zgodi, če vzporedno štejemo čas z uporabo xargs.

časovni odmev 1… 1000 | xargs -P 200 '-d' -i bash -c 'echo '
..
998
999
1000
realna 0m13.554s
uporabnik 0m6.446s
sys 0m14.293s

Z uporabo vzporednih xargov za izvajanje preprostih ukazov brez skupnih virov opazimo znatno izboljšanje zmogljivosti.

Primer) Primerjava vrstnega reda in časa vzporednih xargov

Poglejmo, kaj se zgodi, ko ukaz porabi čas procesorja.

časovni odmev 1… 10 | xargs '-d' -i bash -c 'sleep $ (($ RANDOM% 2)); odmev '
1
2
3
4
5
6
7
8
9
10
realna 0m5.601-ih
uporabnik 0m0.180-ih
sys 0m0.334 s

Upoštevajte, da so vsi ukazi v redu.

Zdaj pa poglejte, kaj se zgodi, če se isti ukaz izvaja vzporedno.

časovni odmev 1… 10 | xargs -P 10 '-d' -i bash -c 'spanje $ (($ RANDOM% 2)); odmev '
3
4
6
7
8
1
2
5
9
10
realna 0m1.257s
uporabnik 0m0.060-ih
sys 0m0.225s
Ukazi 1, 2, 5 in 9 so šli spat. Vendar smo lahko zmanjšali
čas za dokončanje za kar 78 odstotkov.
Vzporedni zaključek Xargs

Preprosto dodajanje xargs vzporedno kot možnost ukazne vrstice lahko desetkrat izboljša zmogljivost. Vendar bodite previdni pri uporabi postopkov, ki so odvisni od naročila, ali kadar si ukazi delijo vire.

Ločilo Xargs

lhs_if_any | xargs '-dc' other_args_etc | rhs_if_any

Ločilnik Xargs -d vam omogoča, da ločilo elementov nastavite na kateri koli znak c, na enak način kot ločila v ukazu cut.

Privzeto je -dc nastavljen na presledek, ustvarjen z znakom nove vrstice -d \ x0a.
Ko uporabljate xargs null -0, je -dc nastavljen na ničelni znak -d \ x00.

Ločilo lahko na primer nastavite na presledek, tj.e. -dc je v ukazni vrstici ali vašem bash skriptu '-d'.

Ločilo lahko nastavite na znak vejice, tj.e. -dc je '-d'.

Možnost ločila v xargs -d vam omogoča, da ločilo postavite na poljuben znak.

Primeri Bash xargs

Tukaj opisujemo primere uporabe ukaza xargs v bash, vključno s primeri uporabe v ukazni vrstici in skripti.

Primeri ukazov Bash xargs

Tu pokrivamo primere uporabe ukaza xargs v bash, vključno s primeri uporabe z vhodom in brez njega.

Primer) Naredite svoj vnos: zabava z xargi brez vnosa

Kaj xargs počne sam doma?

xargs
Pozdravljeni, je kdo doma?
..
(Ctrl-D)
Pozdravljeni, je kdo doma?..

Zdi se, da smo svoje vprašanje dobili nazaj kot odgovor, a zdi se, da je to le odmev.

Zakaj?

Kot ste morda že prebrali, kaj sploh gre za xargs, pretvori standardni vhod v argumente ukazne vrstice. Če možnosti in argumenti niso na voljo, se obnaša kot cevni ukaz echo. To je:

xargs
Pozdravljeni, je kdo doma?
..
(Control-D) 2

Implicitno izdela enakovreden izraz ukazne vrstice echo

echo Pozdravljeni, je kdo doma?..
2 V scenariju se heredoc lahko uporablja na naslednji način.
xargs << EOF
Pozdravljeni, je kdo doma?
..
EOF
echo Pozdravljeni, je kdo doma?..

Primer) Uporabite xargs kot ograda za interaktivne cevi

Paradoksalno je uporabljati xarge na levi strani cevi4 torej zaženimo bash v super omejenem načinu5.

4 Ukazi, ki se zavedajo cevi, ne potrebujejo xargov. Ukazi za nepoznavanje cevi ne vedo za xargs

5 Omejeni način, ki ponastavi vsako vrstico. Druge omejitve je mogoče dodati pozneje.

xargs -I bash -cr ""
i = 1
echo $ i
echo Pozdravljeni!
zdravo!
!!
bash: !!: ukaza ni mogoče najti
i = 1; echo $ i
1
cd…
bash: vrstica 0: cd: omejeno

Primer) Uporabite xargs kot ograda za interaktivne argumente

Glede na poročilo o spretnostih za razvijalce HackerRank za leto 20193,  »Kalkulatorji so nove igre.”Več razvijalcev, mlajših od 38 let, kot prvi projekt kodiranja uporablja kalkulatorje. 3 Vpogledi na podlagi 71.281 razvijalcev

Torej, zgradimo kalkulator z uporabo xargs!

_ () ​​echo $ (("$ @")); # kalkulator
medtem :
naredi
_ $ (xargs)
Končano
1 + 2 + 3 + 4
(Ctrl-D)
10
1 - 2 + 3 - 4 + 5
(Ctrl-D)
3
1 ** 2 + 2 ** 2
(Ctrl-D)
3
1+
2+
3+
4+
5
(Ctrl-D)
15

Primer) Statični generator mesta

Recimo, da imate nekaj tisoč navadnih besedilnih datotek, za katere želite ustvariti statično mesto, in nobena od datotek ni imenovana indeks. Imena datotek vključujejo male črke ascii in vezaj, če obstajajo.

Tukaj je, kako bi izgledala vrstica ali dve v terminalu teoretičnega stroja, ki izvaja bash. Naprava bo imela druge zunanje ukaze, vključno s findutils in pandoc. Uporabite lahko kateri koli enakovreden ukaz po svoji izbiri.

# smo v imeniku
# glej veliko datotek

test -d "html" || mkdir -v $ _
najti . -mindepth 1 -maxdepth 1-type f \
| xargs -P 6000 -i bash -c "echo ; cat | sed -e 's / $ / /' |
pandoc -thtml -o .html "

# glej dvakrat toliko datotek, vključno z datotekami html
# Končano

Primeri skriptov Bash xargs

Primer) Uporabite xargs za ustvarjanje kvadratnih matric

Tukaj je skript, ki sem ga pripravil za ustvarjanje kvadratnih matric z uporabo xargs. Natančneje, izkorišča vedenje z možnostjo -n in ukaz seq uporablja za zaporedja števil, ki se uporabljajo v matricah.

#!/ bin / bash
## kvadratna matrica
## - generira kvadratne matrike
## različica 0.0.1 - začetnica
####################################################
kvadrat-matrična-pomoč ()

mačka << EOF
kvadratna matrica
1 - naročilo
PRIMERI
> kvadratna matrica 1
1
> kvadratna matrica 2
1 2
3 4
> kvadratna matrica 3
1 2 3
4 5 6
7 8 9
EOF


kvadratna matrica () lokalno -i vrstni red; naročilo = 1 $;
preizkus "$ order" || $ FUNCNAME -pomoč; vrnitev;
preizkus $ order -gt 0 || $ FUNCNAME -pomoč; vrnitev;
_ () ​​
seq $ (($ 1 ** 2)) | xargs -n $ 1

_ $ naročilo

####################################################
če [ ! ]
potem
prav
drugače
izhod 1 # napačne argumente
fi
####################################################
kvadratna matrika $ @
####################################################
## ustvari create-stub2.sh v0.1.2
## v sredo, 29. maja 2019 13:44:06 +0900
## glej
####################################################

Vir: kvadratna matrika.sh

Vključil sem tudi testni program za prikaz skripta v akciji, ki ustvarja vse kvadratne matrike do 10 x 10.

#!/ bin / bash
## test-kvadrat-matrica
## - generira kvadratne matrike do 10 x 10
## različica 0.0.1 - začetnica
####################################################
test-kvadrat-matrica ()
test -f "kvadratna matrika.sh "
. $ _ 1> / dev / null
lokalni i
za i čez 1… 10
naredi
echo "kvadratna matrica ($ i)"
kvadratna matrika $ i
Končano

####################################################
če [$ # -eq 0]
potem
prav
drugače
izhod 1 # napačne argumente
fi
####################################################
test-kvadrat-matrika
####################################################
## ustvari create-stub2.sh v0.1.2
## v sredo, 29. maja 2019 13:40:08 +0900
## glej
####################################################

Vir: test-kvadrat-matrika.sh

Tukaj lahko pričakujete:

bash test-kvadrat-matrika.sh | glavo
kvadratna matrica (1)
1
kvadratna matrica (2)
1 2
3 4
kvadratna matrica (3)
1 2 3
4 5 6
7 8 9
..
Vadba: Izboljšajte zaslon v terminalu z uporabo oblazinjenja številk

Ko poskušamo generirati kvadratno matrico reda 10 x 10, dobimo naslednji izhod:

bash kvadratna matrica.sh 10
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100

Kot vajo razširite kvadratno matriko.sh, da omogočimo izhod, kot sledi.

bash kvadratna matrica.sh 10
001 002 003 004 005 006 007 008 009 010
011 012 013 014 015 016 017 018 019 020
021 022 023 024 025 026 027 028 029 030
031 032 033 034 035 036 037 038 039 040
041 042 043 044 045 046 047 048 049 050
051 052 053 054 055 056 057 058 059 060
061 062 063 064 065 066 067 068 069 070
071 072 073 074 075 076 077 078 079 080
081 082 083 084 085 086 087 088 089 090
091 092 093 094 095 096 097 098 099 100

Primeri praktične uporabe Bash xargs

Primer) V datotekah poiščite vzorec z uporabo xargs grep

seznam datotek1 | xargs grep -e vzorec

1 list-files je ukaz, ki vrne poti kandidatov do datoteke, ki jih je treba sprejeti kot vhodne podatke za grep skozi ukaz xargs

Kot primer praktične uporabe xargov v bashu sem izkopal xargs iz skrivne kode.

najdi -tip f -ime \ *.sh | wc -l
994

Obstaja 994 bash skriptov. Poglejmo, koliko ukaza xargs.

najdi -tip f -ime \ *.sh | xargs grep -e xargs navaja vse pojavitve
xargov v kodni bazi.
..
najdi -tip f -ime \ *.sh | xargs grep -e xargs | wc -l
18

V kodni bazi je 18 zadetkov za xargs. Zdaj bomo morda želeli ugotoviti, koliko skriptov uporablja xargs.

najdi -tip f -ime \ *.sh | xargs grep | cut '-d:' '-f1' | razvrsti |
uniq našteva skripte z uporabo xargs.
..
najdi -tip f -ime \ *.sh | xargs grep -e xargs | cut '-d:' '-f1' |
razvrsti | uniq | wc -l
10

Super! V kodni bazi je 10 skriptov z xargs. Poglejmo, kaj so.

najdi -tip f -ime \ *.sh | xargs grep -e xargs | cut '-d:' '-f1' | razvrsti | uniq
vim $ ( !! )

Povzetek ugotovitev

    • Poiščite in uničite datoteke, ki vsebujejo vzorec v imenu datoteke
poiščite $ path -type f -name \ * $ pattern \ * | xargs rm -vf
    • Seznam informacij o datotekah na lhs cevi
najdi datoteke | xargs ls -al
    • Naredite datoteke izvršljive
najdi datoteke | xargs chmod + x
    • Seznam imenikov datotek
najdi datoteke | xargs -I ime ""
    • Odstrani vse
poti za čiščenje | xargs rm -rvf
    • Zip datoteke
najdi datoteke v zip | xargs -I arhiv - $ (datum +% s)
    • Seznam osnovnih imen datotek
najdi datoteke | xargs -I osnovno ime

Primer) Namestite programsko opremo s seznama s pomočjo apt-get v Ubuntuju

Pri nadgradnji Ubuntuja boste po varnostnem kopiranju sistema morda morali namestiti novo programsko opremo. Recimo, da imate seznam programske opreme za namestitev s pomočjo apt-get v Ubuntuju.

sudo dpkg --get-selections | grep '[[: space:]] namestite $' |
\ awk 'print $ 1'> install_software
# ..
mačka install_software | xargs sudo apt-get install

Primer) Curl seige z uporabo xargs v bash

Recimo, da imate kup URL-jev, ki vodijo do enega vozlišča nekje na internetu in bi radi položili seige z uporabo curl v bash. Po možnosti je to eno od vaših vozlišč in seige ni v vašem proizvodnem okolju. Tukaj je, kako položimo seige z uporabo xargov v bash.

#declare -f filter
filter ()

grep -o -e 'loc [^<]*' | cut '-d>'' -f2 '

get-arg-file ()

curl https: // linuxhint.com / zemljevid spletnega mesta.xml --silent \
| filter \
| xargs -i curl - silent \
| filter \
| xargs -i echo > arg-datoteka

#declare -f curl
curl ()

echo (fake) $ FUNCNAME "$ @"

izjavi -xf curl
koristni tovor ()

test -f "arg-datoteka" || vrnitev
xargs -P 1000 -a arg-datoteka -i echo curl | bash 1> / dev / null

seige ()

test -f "arg-datoteka" || dobite - _
tovor

seige

Razhroščevanje Bash xargs

Ko sedite pred terminalom, ste šef. Ko pa gre kaj narobe, pomaga, če veste, kako dejansko odpraviti napake bash skriptov kot šef.

Zelo priporočljivo je igrati varno, imeti metodo za potrditev uspeha pri uporabi xargov v bash, namesto da bi slepo pričakovali, da bo vse v redu. To pomeni, da morate zagotoviti, da vsi ukazi z uspehom in neuspehom ne ostanejo neizbrisani.

Metode

  • Velikost izpisa standardne napake
    Če standardna napaka vsebuje 1 ali več znakov, je šlo kaj narobe
  • Vsota ukaznih izhodnih kod
    Če je vsota izhodnih kod večja od 0, je šlo kaj narobe
  • Potrditev koristnega tovora
    Če manjka kos koristnega tovora, je šlo kaj narobe
  • Konec preverjanja veljavnosti skripta
  • Zagon ukazov xargs kot skripta, če konec skripta ni dosežen, je šlo kaj narobe. Upoštevajte, da je errexit nastavljen in se ukazi izvajajo znotraj funkcije.
  • Druga metoda
    Če se izid razlikuje od pričakovanega, potem je morda šlo kaj narobe

Primer) Odpravljanje napak xargs z uporabo velikosti standardnega izpisa napak

Tu je anonimna funkcija, s katero preizkusimo odpravljanje napak xargs z napako stardart.

# izjavi -f _, tj.e. Spodnje kode nisem napisal
# če ugotovite, da ste nekoliko zarjaveli pri izjavi, sem napisal še eno vadnico
#
kako deklarira ukaz v bash

_ ()

rm -vf napaka;
dotaknite se $ _;
odmev 1… 10 | xargs -x -P 10 '-d' -i bash -c "test $ (($ RANDOM% $ 1)) -eq 0 ||
echo 1> & 2; izhod; ; echo "2> napaka;
preskus ! $ (wc < errout -c ) -gt 0 || echo something went wrong…

## test
_ 1 # verjetnost okvare (= 1-1 / 1 = 0%)
_ 2 # verjetnost okvare (= 1-1 / 2 = 1/2 = 50%)
_ 3 # verjetnost okvare (= 1-1 / 3 = 2/3 = 60%)
..

Če za razhroščevanje napak xargs ne uporabljate standardne napake za kar koli drugega, je ena od načinov, ki vam lahko pomaga,.

Bash xargs funkcije

Včasih želite uporabiti funkcije, ki ste jih določili v xargs. Za to moramo dati funkcijo na voljo xargs. Evo kako.

#declare -f _
_ ()

echo $ @ ^^

odmev a… z 1… 9 | xargs '-d' -i bash -c "_ "
bash: _: ukaza ni mogoče najti
..
razglasi -xf _
odmev a… z 1… 9 | xargs '-d' -i bash -c "_ "
A1
A2
A3
..
# ali
odmev a… z 1… 9 | xargs '-d' -i echo "_ " | bash
..
Z7
Z8
Z9

Upoštevajte, da je zgornji primer interaktivne seje mogoče pospešiti z uporabo vzporednega bash xargs.

Zaključek

Xargs je eden izmed številnih zunanjih ukazov, ki jih v bash bolje poznate. Pri pisanju tega vodnika na ukaz xargs sem se sam naučil nekaj dodatnih možnosti. Priporočljivo je vsake toliko pregledati. Šele takrat boste lahko Xargs uporabili v resničnem potencialu. Do takrat kodirajte naprej.

Najboljše igre z ročnim sledenjem
Oculus Quest je pred kratkim predstavil odlično idejo ročnega sledenja brez krmilnikov. Z vedno večjim številom iger in dejavnosti, ki izvajajo podpor...
Kako prikazati prekrivanje zaslonskega menija v celozaslonskih aplikacijah in igrah za Linux
Igranje celozaslonskih iger ali uporaba aplikacij v celozaslonskem načinu brez motenj vam lahko odreže ustrezne sistemske informacije, ki so vidne na ...
Top 5 kartic za zajemanje iger
Vsi smo v YouTubu videli in oboževali pretakanje iger. PewDiePie, Jakesepticye in Markiplier so le nekateri izmed najboljših igralcev, ki so zaslužili...