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\xFF
lesz.
Van ötletetek, hogyan tudnám ezt mégis megcsinálni?
Hozzászólások
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:
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:
A `dash` tudatosan minimalista termék, semmit sem tud, ami a Posix-szabvány kifejezetten nem ír elő, például a beépített `printf` is csak oktálist szekvenciákat tud, hexásakat nem.
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.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
(Raynes-nek is)
Szerintem nem biztos, hogy dash, ui. sh (FreeBSD) is ezt adja (tehát az echo a -e paramétert nem ismeri).
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.
“The world runs on Excel spreadsheets.” (Dylan Beattie)
A BSD-make viszont lényegesen többet tud, mint a szabvány. A GNU-make-hez képest szerintem nincs elmaradva, csak kicsit máshogy tudja (szerintem jobb a megvalósítás).
vagy
A base64-es megoldásod kifejezetten ötletes. Tetszik. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
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.