CMD challenge - teszteld parancssori képességeidet!

Címkék

Hozzászólások

Jópofa. :)
--
"Sose a gép a hülye."

jó móka volt :)
-------------------------------------------------------------------------------
Az életben csak egy dolog a szép, de az épp nem jut eszembe.

Slackware Linux 14.2 | 4.4.37-janos

Egy darabig csináltam, s arra jöttem rá, ideje volna megtanulnom a find parancs használatát. Meg lehet kerülni a shell eszközeivel, de jó volna érteni hozzá, mert lényegesen egyszerűsíti az életet.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

A xargs-ot legalább minimálisan, a legalapabb esetben tudom használni, de a find-ot még úgy sem. Mindig azon kapom magam, inkább írok ciklust, process helyettesítéssel vagy pipe-ból átadok neki egy listát, meg effélék. Holott az egész egyetlen parancsból megoldható lenne.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Jaj. Nincs benne openssl, akkor vajon hogy döntsem el, hogy egy szám <törölt szövegrész>-e?

Szerk: na, kész, mára kellemesen elfáradtam, ahogy a TV-tornában mondták;)

Én írtam rá egy rövid scriptet (megkeresi a szám gyökét, 2-től egy ciklus elmegy a gyökig, ha a szám modolo cikl. vált == 0, akkor nem prím), de nem fogadta el, pedig ua volt az eredmény, mint a factor használatával. Amúgy több esetben is volt olyan, hogy az eredmény ua lett, mint a megoldásoknál, de valamiért nem fogadta el.

Azt hittem, tényleg CMD challenge, de ez shell scripting... :(
Időm lenne, megcsinálnám CMD.EXE-re. Ott aztán vannak vicces megoldások és szintaktikák... :)

Üdv,
Marci

Két tipikus példa a fentiekre, amiért ütném a szerzőt, amíg mozog:
#1: listázd ki a _fájlokat_ (soronként 1-et) szerepelt a feladatban. Nosza, reflexből find -type f
Nem jó!
de bezzeg az ls -1-et megette.
Saját magának önellentmond! Az ls -1, nem csak a fájlokat listázza ki.
#2: listáz ki az összes fájlt, amiben előfordul az "500" string.
Első megoldás:
grep -rl 500 .
Nem eszi meg.
Bezzeg a grep -l 500 *-ot igen.
Aki a shell expansion-t használja ilyen feladatra, az nagyobb aljasságokat is képes elkövetni!

No igen, de kiadhatsz bármilyen parancsot. Egy ls -a után nem volt nehéz dolgom. :) Nyilván meg tudom számolni a file-okat, de kíváncsiságból beírtam bedrótozotta, s innen jöttem rá, hogy nem csak az eredményt nézi.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Attol meg nem jo practice-t ls-t hasznalni olyan muveletre, ami igazibol egy sima echo is lehetne.
Masreszt open()-el pl. nem tudsz dir-t megnyitni, ha jol remlik. Szoval a dir megse annyira file. (socke-t, pipe-ot, device nodeokat meg tudsz :P A symlinket meg szandekosan nem emlitem)

Marpedig a * -ban azok is benne lesznek.

Szoval a legnagyobb bajom: shell-ben a *-ot, pl. for ciklusan erdemes hasznalni, ahol iteralni akarsz a listan.
De egy listazo programnak odaadni elore a listat, amit kerek vissza. Ertelmetlen szerintem. Foleg ugy, hogy a listazo program (ls) nincs is igazibol listazasra hasznalva, mert nem -l vagy mas parameterekkel van hivva, hogy extra infot adjon vissza a fajlokrol.
Visszaadja ugyanazt, amit beadtunk neki.
Max meggyozodik rola, hogy azok tenylegesen letezo direntry-k. Ami meg megint ertelmetlen, hiszen a glob is ezt csinalja: visszaadja a ra matchelo direntry-ket.

Az ilyen for i in `ls *`; do whatever ; done megoldasokert szemely szerint.
Lehet, hogy nincs igazam. De szemely szerint en kerulom meg az olyat is, akinek a kodjaban ilyet latok.
Hacsak nincs ra valami extra remek magyarazata, mint pl. hogy fiatal volt, masnapos es kellett a penz...

Azzal egyetértek, hogy nem jó gyakorlat.

Ja, man 2 open (nyilván FreeBSD-n) részletek a hibakódok környékéről:
[EOPNOTSUPP] An attempt was made to open a socket (not currently implemented).
[ENOTDIR] O_DIRECTORY is specified and the file is not a directory.

Szóval socketet nem lehet open-nel nyitni, dir-t meg igen :-) - de ettől még a local-domain (lánykori nevén: UNIX-domain) socketet a jobbak (mármint én ;-) ) fel szokták sorolni a 7-féle fájltipus felsorolásakor (mármint UNIX/Linux alaptanfolyamon). Úgyismint:

közönséges fájl (ordinary file)
könyvtár / mappa (directory)
szimbolikus link (symlink)
pipe
socket
chardev
blockdev

Szóval csak hogy magyarázzam a bizonyítványomat: amit írtál, az gyakorlati szempontból helytálló, csak volt benne egy tárgyilagosan nézve hiba.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Masreszt open()-el pl. nem tudsz dir-t megnyitni, ha jol remlik.
Rosszul remlik. Meg tudsz nyitni, csak ismerni kell a szukseges kapcsolokat ...

Szoval a legnagyobb bajom: shell-ben a *-ot, pl. for ciklusan erdemes hasznalni, ahol iteralni akarsz a listan.
De egy listazo programnak odaadni elore a listat, amit kerek vissza. Ertelmetlen szerintem. Foleg ugy, hogy a listazo program (ls) nincs is igazibol listazasra hasznalva, mert nem -l vagy mas parameterekkel van hivva, hogy extra infot adjon vissza a fajlokrol.
Visszaadja ugyanazt, amit beadtunk neki.

Nem. Visszaadja azt, amit talalt abbol, amit mi beadtunk neki.

Max meggyozodik rola, hogy azok tenylegesen letezo direntry-k.
Es itt az extra info, amit fentebb hianyoltal.

Ami meg megint ertelmetlen, hiszen a glob is ezt csinalja: visszaadja a ra matchelo direntry-ket.
Nem, nem ezt csinalja. Visszaadja, amit talalt, ill. szepen visszatolja az arcodba azt, amit beadtal neki, ha nem talalt semmit. Tehat, ha azt szeretned itt mondani, hogy az 'ls *' es az 'echo *', vagy legyen inkabb 'for f in *; do echo $f; done' ugyanazt az eredmenyt szallitja, hat akkor megint tevedsz sajnos. Az elso esetben ugyanis kapsz egy uzenetet es egy definialt hibakodot, ha nincs talalat, a masodik esetben viszont csak egy csillagot a szemeid koze ;)
Tegyuk itt persze rogton hozza, hogy mindket megoldas ebben a formaban erosen kerdojeles, ha az ember megbizhato szkriptet akar irni, pusztan a mondandodat kivantam kommentalni ;) Szinten meg kell jegyezni, hogy a glob hasznalata pl. a compgen-nel parositva hibakezelesre alkalmasabba teheto, tehat azt altalam irtakban meg veletlenul sem kell az 'egyetlen igaz megoldas' utan kutatni, nem lesz meg, es nincs is ilyen ;) De azert egy tipp: 'man find'.