Linux CLI érték átadás

Fórumok

Sziasztok.

Kérnék egy kis segítséget.
Van egy xyz parancsom, pl:
smartctl -A -d marvell /dev/sda | grep Temperature_Celsius | awk '{print $10}'

Ennek a kimenete egy hex érték:
0x26

Hogyan lehet ezt átalakítani decimálisra?
2 féle lehetőséget találtam eddig, ami működik:

echo $((0x15a))
Ekkor a 0x15a értékét kiírja decimálisan

vagy

printf '%d\n' 0x15a

De hogyan lehet a 0x15a helyére az előző parancssori kimenetet irányítani?

Hozzászólások

A varázsszó a command substitution.

printf '%d\n' "$(smartctl stbstb)"

Ha kompatibilitásra törekszünk, akkor nem $(parancs), hanem `parancs` formában kellene írni. Máris jó lenne a tcsh-dban is :-) Mondjuk a triviálisnál kicsit is komolyabb scriptet nehéz megírni úgy, hogy sh és csh is ugyanúgy hajtsa végre (más az értékadás / a feltételes utasítás / a ciklusszervező műveletek szintaxisa, stb.) Szóval vl-nek azzal a vacak perl-lel igaza van. Bár most fejből meg nem mondom, hogy van-e olyan eléggé triviális módosítás a perl4 és a perl5 (netán perl6) között, mint amilyen a python2 vs python3-ban mondjuk a print vs print().

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

Mondjuk a triviálisnál kicsit is komolyabb scriptet nehéz megírni úgy, hogy sh és csh is ugyanúgy hajtsa végre (más az értékadás / a feltételes utasítás / a ciklusszervező műveletek szintaxisa, stb.)

Szerintem lehetetlen, az eltérő szintaxis miatt mindenféleképpen.
Persze esetleg valami nagyon csúnya gányolással megoldható (pl. a shelltől függően létrehozni egy alias-t a feltételes utasításra/ciklusokra/stb., és ezeket a feltételesen létrehozott alias-okat használni). Sőt, (t)csh-ban még függvények sincsenek, arra is nagyon trükkösen lehet rábírni (legalábbis valami függvényhez hasonlító valamire).

Szóval vl-nek azzal a vacak perl-lel igaza van.

Szerintem az awk-s megoldásom jó lesz, indoklás itt és itt.

Nekem 1995 óta a tcsh az interaktív shellem, szóval van némi tapasztalatom vele.
Ami egyszerű parancsok szimpla futtatásánál bonyolultabb script, azt nem lehet kompatibilisra megírni. Változó értékadásnál már bukta, if/for azonnal bukta, de már egy paraméter quote-olás is lehet bukta, mert nem pont ugyanazt a szabályt használják.

Bár most fejből meg nem mondom, hogy van-e olyan eléggé triviális módosítás a perl4 és a perl5 (netán perl6) között

Nade perl4-et már senki nem használ. Olyannyira, hogy én >20 éve kezdtem perlezni, és már én sem használtam, talán 2-3 archaikus scripttel találkoztam még a 90-es években, ami 4-esre íródott. Szóval a perl4 szerintem nem releváns. A 6-osat még nem néztem meg közelről, ahhoz nem tudok hozzászólni.

Ha már a parancsodban használod az awk-t, miért nem azzal oldod meg?

...| awk '{printf "%d",$10}'

Sőt, akár a grep funkcióját is kiválthatod:

smartctl -A -d marvell /dev/sda | awk '/Temperature_Celsius/ {printf "%d",$10}'

$ gawk --posix 'BEGIN { printf "%d\n", 0x2a }'
0
$ gawk --traditional 'BEGIN { printf "%d\n", 0x2a }'
0
$ gawk --lint fatal 'BEGIN { printf "%d\n", 0x2a }'
gawk: cmd. line:1: fatal: numeric constant `0x2a' treated as hexadecimal

(és ugye amíg a One-True-AWK mást nem mond, addig az a "szabvány" ;-))

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

Linuxnál a sima awk parancs nem a gawk? Egyébként a FreeBSD-ben levő awk is "jól" működik*.

Nézegetem az awk szabványt, és valóban nem feltétlen kell bízni, hogy az awk úgy fog működni, ahogy akarjuk (legalábbis ha jól értem):

An integer constant cannot begin with 0x or include the hexadecimal digits 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', or 'F'.

* Szerk.: tévedtem, FreeBSD-n se megy úgy, ahogy írtad.
Úgy látszik, mazsi-nak van igaza, "bemeneten megeszi a hexát".

Ezzel az a vicc, hogy a One-True-AWK és a mawk magától jól konvertálja, ha sztringként van megadva, ellenben a gawk-nak kell ez a hülye opció (vagy legalább a --posix kapcsoló) :
$ mawk 'BEGIN { printf "%d\n", "0x2a" }'
42
$ nawk 'BEGIN { printf "%d\n", "0x2a" }'
42
$ gawk 'BEGIN { printf "%d\n", "0x2a" }'
0
$ gawk --non-decimal-data 'BEGIN { printf "%d\n", "0x2a" }'
42

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

$ gawk -L fatal 'BEGIN { printf "%d\n", '0x2a' }'
gawk: cmd. line:1: fatal: numeric constant `0x2a' treated as hexadecimal
$

Tud ez rosszabb is lenni ;-) (Speciel nekem -L=fatal esetén simán warningolt, de szóközzel az opciónál már azt teszi amit kellene. Amúgy a man gawk szerint is "-L invalid" vagy "--lint=invalid" a korrekt forma, a te verziód nem jó.)

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

Beleolvasva a cikkbe, érdekesnek látszik. Ellenben a második felével a mondandódnak nem értek egyet. Az nyilvánvaló, hogy valahogy másképp dolgozzák fel az általunk megírt AWK-programot az egyes implementációk (hisz különböző programozók írták, ezért nagy eséllyel lesznek - ha más nem is -, apró eltérések). De azért itt valami másról van szó, mint hogy másként dolgozzák fel a parancssort. Főleg, mert azt nem ők dolgozzák fel. Ha valamit egy shell-parancssorban aposztrófok közé 'zárok', akkor azt a shell dolgozza fel, és technikailag feldolgozás nélkül az egész francot odaadja egy db. sztringben N. paraméterként annak a programnak, amit éppen meghívtunk. Ha az aposztrófok között van(nak) "idézőjel(ek)", az(oka)t is. Azaz fenti példákban az összes AWK implementáció megkap mindent, onnan hogy BEGIN, egészen a záró kapcsos zárójelig, mindezt az argv tömb 1-es indexű (amúgy második) elemeként.

Innentől pedig az AWK nyelv szintaxisa számít, ami baromira leegyszerűsítve úgy hangzik, hogy ami "idézőjelek" között van, az szövegkonstans. Ami nincs idézőjelek között, az pedig lehet speciális nyelvi elem (mint maga a BEGIN kulcsszó bizonyos helyeken; vagy pl a print parancs, netán a printf függvény), lehet egy általunk definiált függvény neve (tehát annak a fv-nek a hívása), lehet egy változó neve, és í. t. És lehet pl. konstans számérték. Csak épp anno a nyelv fejlesztői azt mondták, hogy csak decimális formában lehet numerikus konstansokat megadni, nem pedig binárisan/oktálisan/hexában. Azaz amikor "0x2a" szerepel, az mindenképpen szöveglánc. Ezzel szemben az idézőjelek nélküli 0x2a - no azt a fene tudja. Triviális ötlet lenne, hogy az egy eddig nem használt változó neve, és mivel a változók az első hivatkozásukkor jönnek létre 0 (vagy "") értékkel, akár még logikus is lenne a dolog és összhangban van a működéssel. Ellenben pl. a MAWK doksija explicit módon tartalmazza a kitételt, hogy a változók(meg függvények, tömbök) neve nem kezdődhet számmal, szóval ez az ötlet ugrott. Én személy szerint nem tudom megmondani, hogy akkor az ott mi, de én nem vagyok egy igazán profi AWK tudor, én csak a magam szintjén szeretem használni belőle azt a keveset, amit tudok.

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

$ awk 'BEGIN {printf "%d\n",0x11}'
0
$ awk 'BEGIN {printf "%d\n","0x11"}'
17

Idézőjellel több a második.

Szerk.: és akkor már le is esett, hogy a példád miért nem jó (a 0x... idézőjel nélkül szám lenne, ami nem jó), és a bemenetről meg miért jó (stringként kezeli a $1-et).

Számomra tanulságos volt :)

Linux 2.6.31.8, AWK 4.0.0

Egyébként ez egy D-Link NSA325v2 NAS