Több fájl futtatása

Fórumok

Sziasztok!

Adott egy mappa amiben van sok bash script. Hogyan tudom konzolon egymás után vagy akár egyszerre lefuttatni őket egyetlen paranccsal?

Köszönöm

Hozzászólások

cd dir; for script in $(ls); do /bin/bash -c ${script}; done

És ha a fájlnevek kiírva túl hosszúak és nem fér bele az egész a parancs hossz korlátba?

(Mondjuk nem tudom, hogy azon segít-e a $(ls) )

Én is for i in *-ot szoktam használni, de azért van, amikor ez nem működik. Olyankor én find parancsot használok, de nem bánnám, ha lenne más megoldás is, valami, ami nekem még új.

Már a kérdés is tipikus PEBKAC, amit egy lusta ember csak képes előállítani.
Programot illik full path megnevezéssel indítani.
Milyen dolog az, amikor keletkezik egy halom script csak úgy. A nevüket és a darabszámukat sem tudjuk, csak behányódnak valahova. De az biztos, hogy sorban vagy párhuzamosan kell őket futtatni. Ezek után nyilvánvalóan a path, az erőforrások, stb. futtatási körülmények is triviálisak, hiszen mindent tudunk. ;)

Ilyen kérdések a zországos zit hosszúságmérésen voltak utoljára. Ami persze lehet életszerű is, hiszen bármikor örökölhetsz egy olyan rendszert, amit vérpistike látott el furfangos programokkal.

mkdir dir
cat << EOF >dir/ls
#!/bin/bash
echo "Hülye vagyok a programozáshoz."
EOF
chmod +x dir/ls
# thread 1
cd dir; for script in $(ls); do /bin/bash -c ${script}; done
# a javaslatod
cd dir; for script in *; do /bin/bash -c ${script}; done

Eme kódot lefuttatván látható, hogy a lényeg ki sem derül. ;)
Tán az exec és a globbing értésének hiánya a probléma. :(
De a matematikus poén azért ül!

Rendes ember PATH-ában nincs benne a . (azaz az aktuális könyvtár), így hiába van az aktuális könyvtárban egy ls, a $(ls) -nél nem az fut le, hanem a rendes PATH-ban levő (azaz valószínűleg a /bin/ls). Az már más kérdés, hogy ettől még nem feltétlenül rendetlen, akinek felüldefiniáló alias, vagy shell-függvénye van az ls-re. Szóval az a fele OK, hogy ne $(ls), hanem ha már, akkor $(/bin/ls) legyen odaírva. De igazából * legyen :-)

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

Noha a kérdésfelvető dolga, hogy ezt megválaszolja, de azért izz az én válaszom a ki nem mondott kérdésre:

nagyon sok kérdésnél (ennél is) nekem az ugrik be elsőre, hogy valaki kitalál magának légből kapott feladatokat, és azért kérdezi meg, mert nem tudja a választ, vagy épp egy-két féle válasza van, de szeretne másoktól egyéb elmleti megoldásokat hallani. Azaz nem abban a pillanatban létező valós probléma, hanem egy kósza ötlet: "mi lenne ha ..." aéapon aklar tanulni.

Nyilván az is egy válasz, hogy "ilyen feladatot nem vállalunk el / nem oldunk meg, mert ...."

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

Ez legalább egy őszinte válasz, ami pár dolgot megmagyaráz.

Persze elég lenne kicsit felemelni a fejedet és észrevenni az oldal tetején: Linux-kezdő.
Elég gáz, ha a tanár urak, - akik egyébként roppant okosak - potenciálisan működésképtelen scripten rugóznak. Ez egy kezdő számára misztikus és hiteltelenné teszi az okoskodást.

Egy kezdő esetén nem kell automatikusan feltételezni, hogy
- Profi módon beállított környezetben dolgozik.
- Kifejezetten oneliner-t szeretne.
- Kezdő mivoltában ismeri a rendelkezésre álló eszközkészletet.
- Tud egyáltalán kérdezni.

(Ez jó pár éve már felmerült itt a hupon is, de most nem fogom előkeresni.) Ha jól tudom ez a parancssor hossz-korlát magához a fizikai exec(2) rendszerhíváshoz kötődik, sem a $()-féle, sem a globbingot végző kód nem exec-el. Azaz mind a két esetben ugyanaz lesz az eredmény, csak nagy eséllyel az ls-sel végzett megoldás drágább és lassabb (plusz processzt kell kreálni, a kimenetét el kell tárolni, az eredeti parancssorba bele kell túrni vs. a globnál lévő "akkor ide behányjuk ABC-rendben a fájléneveket"). Miután a fájlnevek bekerültek a parancssorba, a while ciklus lefuttatásához szintén nincs exec, egyes egyedül a parancs lefuttatásánál lesz.

Így vélhetően "nem" a válasz az első kérdésre (meg a másodikra, azaz hogy segít-e az ls).

Érdekelne, hogy mikor nem működik a for i in * neked. Nem lehet, hogy az a baj, hogy utána $i szerepel és nem "$i" ?

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

Lehet, valami ilyesmivel próbálkoznék:

while read; do
    [ -x ./"$REPLY" ] && ./"$REPLY" &
done < <(ls -1)

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

vagy így is:

ls | while read n; do ./$n; done

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.

Igy soha: teljesen foloslegesen inditasz egy processzt (ls), majd a standard outputjan megjeleno szoveget probalod ertelmezni abban bizva, hogy az pont ugy nez ki, ahogy te elkepzeled (lasd pl.

alias ls="ls -l"

).

[muszi@muszi test]$ echo -en "#! /bin/sh\n\necho \"Hello world!\"" > abc
[muszi@muszi test]$ cp abc def$'\n'ghi
[muszi@muszi test]$ ls --show-control-chars
abc  def
ghi
[muszi@muszi test]$ ls -l --show-control-chars
total 8
-rw-r--r--   1 muszi    muszi          32 Jun 20 11:39 abc
-rw-r--r--   1 muszi    muszi          32 Jun 20 11:40 def
ghi
[muszi@muszi test]$ chmod +x *
[muszi@muszi test]$ ls | while read script; do echo "Executing script \"$script\""; "./$script"; done
Executing script "abc"
Hello world!
Executing script "def"
bash: ./def: No such file or directory
Executing script "ghi"
bash: ./ghi: No such file or directory

Linux alatt a filenevben barmi lehet a tortvonalat ("/") es a 0x00 byte-ot kiveve - peldaul space, ujsor, lapdobas... :-)

Igy viszont minden esetben mukodik:

[muszi@muszi test]$ for script in *; do echo "Executing script \"$script\""; "./$script"; done
Executing script "abc"
Hello world!
Executing script "def
ghi"
Hello world!

1, Miért kell ezt így túlbonyolítani?
2, Szóval miért nincs benne az egész egy bash script-ben?
3, Miért nem csinálsz egy bash scriptet ami meghívja az összeset? Itt vissza is fordulhatunk a 2-es kérdéshez. :)

1. ez miért bonyolult?
2. nem tart sokból megírni egy ilyen scriptet
3. minek sriptet írni, az adott könyvtárban beírod parancssorba, hogy: ls | while read n; do "./$n"; done , vagy azt hogy for script in *; do "./$script"; done

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.

find /mappa/ahol/vannak -type f -exec {} \;

párhuzamosan is lehet, valahogy így:

echo `ls | while read n; do echo -n ./"$n & "; done` >fuss
chmod 755 fuss
./fuss

persze, lehet másképp variálni, de gyakoriak a nemkívánt mellékhatások.

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.