[ Megoldva ] Bináris echo Makefile-ból

Egy make folyamat közben a fájlom elejére kellene illesztenem 4 bináris bájtot. Ezt az

echo -n -e '\x00\xFF\x00\xFF' > binfilename

paranccsal meg is tudom tenni. Azonban ez a Makefile-on belülről már nem működik. Ha kiadom a make parancsot, a binfilename tartalma

-e \x00\xFF\x00\xFFlesz.

Van ötletetek, hogyan tudnám ezt mégis megcsinálni?

Hozzászólások

printf '\x00\xFF\x00\xFF' > file

4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.

Sajnos nem nyert. :( Sem szimpla sem dupla idézőjellel, sem egy sem két \ jellel. Az eredmény a fájlban:

\x00\xFF\x00\xFF

Közben utánaolvastam a printf-nek, és teljes útvonallal kiadva már működik, köszönöm! :)

A helyes megoldás tehát:

/usr/bin/printf '\x00\xff\x00\xff' > binfilename

Lehet, hogy benéztem valamit, de honnan tudod, hogy dash-t használ? Egyébként nekem pont ez a bajom a dash-sel, ksh-val (BSD-k alatt), hogy nagyon szigorúan POSIX és minimalista. Az ember meg hozzászokott a modern GNU, bash, zsh által nyújtott kényelemhez, újításokhoz, amik nélkül elég pain in the ass meglenni. Lassan már elérjük azt a pontot, ahol nem ártana egy POSIXv2-t szabványosítani.

Ennek ellenére használok dash-t, és próbálok arra #!/bin/sh kezdetű scipteket írni, amik portolhatóbbak, de sokszor nagyon nehéz. Pl. vagy egy monitorozó scriptem, ami a watch/gnuwatch-hoz hasonló funkcionalitást nyújt, és read -n 1 -t 3 -s input részt használ. Ez figyeli, hogy lenyomtak-e billentyűt (akkor azonnal újra frissíti az infókat, amit kiír), de 3 mp. után timeout-tól és frissíti a kimenetet a loopban. Ennek az az előnye, hogy nem csak Ctrl+C-vel lehet belőle kilépni, mint a watch-ból, és billentyűt nyomva tartva lehet gyorsítani alkalmanként a frissítésen. Gyönyörűen megy zsh és bash alatt, de ugyanez szigorúan POSIX shellscript-ben megcsinálni oltári nagy kín, mivel ott a read-nek nincs ilyen kapcsolója, és mindenféle dd-vel, subshellel, sleep + wait-tel kell vergődni, oltári bonyás, és még bloatabb megoldáshoz is vezet. Ez is egy olyan dolog, hogy a minimalistább megoldás sokszor nem éri meg, pont erről írtam két napja a shellscript gyorsítása című topikomban a lemonbar vs. polybar, dwm vs. bspwm kapcsán.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Igen, pont ezért kérdem, mert nem biztos. Továbbá pont erről beszélek, hogy nem ismer egy csomó kényelmi kapcsolót, nem csak echo-nál, meg read-nél, de grep, awk, sed is korlátozottabb a vanilla POSIX/BSDland formájában, és a különbségeket lehetne sorolni napestig.

Pont ma kínlódtam én is printf-fel, ami pl. %s formázótag nélkül nem kezeli a \uxxxx és \Uxxxxxxxx karaktereket sem, pedig ez Bash alatt volt.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

Szerkesztve: 2022. 06. 01., sze – 21:18
printf '\0\377\0\377'

vagy

echo 'AP8A/w==' | base64 -d

A makefile-ban lehet választani, hogy milyen shell-t használjon. Alapértelmezetten ez a /bin/sh, ami azzal jár, hogy nem mindent használhatsz, amit pl. bash-ban. Ha a bash-t akarod, akkor a SHELL=/usr/bin/env bash sorral tudod rábírni a make-t, hogy bash-t használjon.

/bin/echo -n -e '\x00\xFF\x00\xFF' > binfilename