at időzitő

Adott egy egyszerű szkript melyet megadtam az AT időzítőnek.
Ezt az egyszerű szkriptet is már egy másik szkript hozta létre.
Tehát változhatnak a mappa és fájlnevek, meg a szkriptben lévő dolgok is,

Az AT időzítőben minden helyesen meg is jelenik (sudo cat /var/spool/at/*feladat)

cd /home/user/my pathX/my dirX (MOST éppen ebben van a futtatandó szkript)
sh futtatandó szkript (szintén akad benne szóköz)
rm -f futtatandó szkript (törölje a szkriptet ha végzett)

Az AT parancs nem hajtódik végre a mappa szerkezet, és a fájlnevekben lévő szóközök miatt.

Már próbáltam az IFS=" "-t. Próbáltam az idézőjelekkel escapelni.
De míg a terminálban jó,

echo ""cd '"/home/user/my path/my dir"' ""

a szkriptben már nem, mivel az idézőjelek miatt szöveg lett a változó.
S ez az eredmény:

echo cd "${első}/${szkript}/${változója}" - Ez meg értelmetlen

Megakadtam. A létrehozó szkriptben kell finomítani a dolgokat, de még nem tudom mit.

Hozzászólások

Így próbáltad már?


cd /home/user/my\ path/my\ dir

Ismerem ezt a megoldást, de ha egy szkript készíti el az útvonalakat is, annak ezt hogy adom meg, hogy irkálja bele a visszaper jeleket a megtalált könyvtárak esetén?

Szerkesztve!
De kicsit később már rájöttem ahogy visszaolvastam. Hiába este van már...
Ez jó kiindulópont lehet:sed
echo "Valami Amerika" | sed 's/ /\\ /g'

Valami\ Amerika

Ne te szenvedj a szóközökkel, takard el az egész paramétert, pl. idézőjelekkel körbevéve. (Jelzem a jujniksz shell-ek esetén az "" egy nagy büdös *semmit* fog eredményezni. Ha át akarsz adni egy idézőjelet, akkor aposztrófokkal ( '"' ) vagy hanyatt-törtvonallal ( \" ) takard.

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

Hogy mi van?

az at-nek átadott scriptet (nevezzük script2-nek) generálod egy másikkal (script1). De mindenféle változók bekavarnak?
script1:
echo cd '"'"$ide"'"' > script2
echo echo \""$v1"\" >> script2

eredménye:
script2:
cd "script1-beli-ide-változó-tartalma-nevű-könyvtár"
echo "ez-itt-script1-beli-v1-változó-tartalma"

Szóval nem értem. Esetleg ha valami nagyon egyszerű példán elmagyaráznád, hogy mit írtál, mit vártál, mi az eredmény, stb ...

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

A több paraméteres echo miért baj? Definíció szerint ha az echo több paramétert kap, akkor azokat egy db szóközzel elválasztva írja ki. Mivel ez az adott feladatnál pont jó, én nem kezdek el azzal szenvedni, hogy idézőjelen belül lehet-e backslash-sel takarni másik idézőjelet (erre ugye "igen" a válasz, ellentétben az aposztrófon belüli aposztróffal), vagy hogy ha aposztrófok között írok idézőjelet (vagy idézőjelek közé aposztrófot), akkor pont mi lesz. Szerintem az a fő gond, hogy az emberek nem hajlandóak megtanulni a \ ' " hármas használatának szabályait, aztán persze szívnak ilyen egyszerű dolgokkal.

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

Mi nem működik?

$ mkdir " "
$ cd " "
$ echo ":$PWD:"
:/tmp/ :
$

Mindegy. A lényeg - szerintem -, hogy ha az ember tudja mire jó a szóköz, a \ , ' és az " - és a használatát is, akkor az esetek döntő többségében meg tudja oldani az ilyen problémákat. De általában nem tudja.

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

Te magad írtad:

A több paraméteres echo miért baj? Definíció szerint ha az echo több paramétert kap, akkor azokat egy db szóközzel elválasztva írja ki.

Kiemelés tőlem. Épp ez az. Ha hagyod az echo-ban szétesni a szóközök mentén paraméterekre, akkor az egy szóköznél rendben lesz, de két egymást követő szóköz mentén is csak kétfelé hullik a string, így az echo kimenetében továbbra is egy szóköz lesz. Az meg már nem az eredeti filenév. Tehát úgy volna helyes, hogy egyben kell tartani a stringet, s azt kell átadni az echo-nak.

Amúgy nem kekeckedem, tudom, hogy nálam nagyobb rutinod van shell scriptelésben, nyilván csak félreértés volt, picit elbeszéltünk egymás mellett. :)

echo a b

vagy

echo a      b

illetve

echo "a      b"

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

Kezdem kapisgálni, de azért azt tisztázzuk: az echo egyáltalán nem kap szóközöket a paraéterei között, mert a parancssort a*shell* már szétszedi neki argumentumlistára (amiben az elválasztó 1-2-3-...-n db szóköz már nincs ott, csak a paraméterekben szereplő szóközök maradnak, ha elrejtettük őket). Pont ezért kell tudni, hogy mire jó a \ ' " trió, hogy mikor akarom, hogy szétessen és mikor nem. Tehát ha fizikailag átadom az(oka)t a szóköz(öke)t, az echo szépen kiírja, annyit és oda, amennyi és ahol van.

Egyik kedvenc elborzasztó példám:


$ echo \ \ \ # backslash szóköz backslash szóköz backslash szóköz
$ echo \  \ # backslash szóköz szóköz backslash szóköz
$ echo \  \  \ # backslash szóköz szóköz backslash szóköz szóköz backslash szóköz

Hány paramétert kap az echo és mi a kimenet? (1 param - 3 sp ; 2 param - 3 sp ; 3 param - 3 sp)

És pont azért kell értelmesen használni a " vagy ' jeleket, mert általában olvashatóbb, mint a \ . Nyilván fenti borzadvány egy cseppet tud olvashatóbb / olvashatatlanabb is lenni, ha a \ helyett ' vagy " párokat használ az ember. Ez '......' nyilván olvashatóbb, de '.''.''.' már nem annyira, "."'.'"." meg szerintem végképp tragikus - főleg egy jól választott fontkészlettel.

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

No ez az. Tehát nekem az volt az észrevételem, hogy shelltől való elzárás nélkül hiába szúrja a kimenetbe az echo a szóközt, ha a shellnek a paramétereket szeparáló kifejezés az egy vagy több szóköz. Így az echo nem tudja, hogyan szeparálódott a paraméter lista, egy szóközzel vagy többel, s ha többel, mennyivel. Ezért kell a filenevet egyetlen stringként, egyetlen paraméterként átadni.

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

Erre már rájöttem. :D
Viszont érdekes hogy amit te ajánlottál, a hanyatt perjel, az frankón úgy generálja hogy
cd "itt van a kutya elásva"
Ennek ellenére mégsem működik...

Most kipróbálom hogy szóköz nélküli mappával fájlnévvel mit művel.
Banyek... Ekkora lúzert...
Most a szóközök hiánya miatt jobban átláttam a dolgokat. Arról nem is beszélve hogy 9 órát aludtam. Ergo kipihent vagyok.
Úgy volt megadva szkript1-nek hogy "cd my path/my dir/file name/" Holott a file name már nem kell. Hiszen az már a parancs nevében is benne vagyon. Mindössze 3 sort írattam bele az AT időzítőbe.

ugorj a megfelelő mappába
hajtsd végre a fájlnév-dátum parancsot
Töröld a fájlnév-dátum parancsot

S én úgy adtam meg a mappára ugrást hogy benne szerepelt a 'file name' is. Ami persze hogy nem létezett.
Valami kereket szokás forgatni... De már nem tudom hol.
Hogy tudom átírni hogy megoldva? A kezdő üzenetet nem tudom szerkeszteni.