Dokáže Bash spustit příkaz z proměnné?

Dokáže Bash spustit příkaz z proměnné?
« kdy: 10. 09. 2023, 12:41:50 »
Kód: [Vybrat]
case "${PrvniVstup}" in  # výraz '"-"[Ss]*)' funguje jak pro '-s' tak pro '-S ale i pro -SSSSSSSSSSsssss', a bez hvězdičky nefunguje vůbec  :-\
      "-ps1")
        prikaz1="ps -C vidsaveV10c -o pid=,args="
        prikaz2="ps -Al U michal | grep yt-dlp"
        echo -en " ${barvaTextBila}${prikaz1}${barvaTextZrusit}"
        ps=$(ps -Al U michal | grep vidsave)
        ps+="\n\n"
        echo -en " ${barvaTextBila}${prikaz2}${barvaTextZrusit}"
        ps+=$(ps -Al U michal | grep yt-dlp)
        ps=$( "$prikaz2" )
        echo -en " ${barvaTextZluta}${ps}${barvaTextZrusit}"
        ;;
      "-ps2")
        prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
        echo -en " ${barvaTextBila}${prikaz}${barvaTextZrusit}"
        ps=$(ps -C yt-dlp -o pid=,ppid=,cmd --sort=time)
        echo -en " ${barvaTextZluta}${ps}${barvaTextZrusit}"
        ;;
      "-ps3")
        prikaz1="ps -C vidsaveV10c -o pid=,args="
        echo -en " ${barvaTextBila}${prikaz1}${barvaTextZrusit}"
        ps=$(ps -C vidsaveV10c -o pid=,args=)
        ps+="\n\n"
        ps+=$(ps -C yt-dlp -o pid=,args=)
        prikaz2="ps -C yt-dlp -o pid=,args="
        echo -en " ${barvaTextBila}${prikaz1}${barvaTextZrusit}"
        echo -en " ${barvaTextZluta}${ps}${barvaTextZrusit}"
        ;;
esac

Zajímalo by mě, jestli se za stejné funkčnosti mohu zbavit jistého opakování, tedy jestli by nešlo něco jako
Kód: [Vybrat]
"-ps2")
        prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
        echo -en " ${barvaTextBila}${prikaz}${barvaTextZrusit}"
        ps=$( "${prikaz}" ) ##!! tohle zrovna nejde škoda
        echo -en " ${barvaTextZluta}${ps}${barvaTextZrusit}"
        ;;

a také by mě zajímalo, zda by takto nějak šel spustit příkaz, od kterého nepotřebuji nic uložit do další proměnné, tedy místo
Kód: [Vybrat]
ps -C yt-dlp -o pid=,ppid=,cmd --sort=time
# to samé ale uložené v proměnné, jako
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
# později vykonat krz obsah z ${prikaz}



Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #2 kdy: 10. 09. 2023, 14:48:18 »
https://letmegooglethat.com/?q=bash+eval+command+in+variable
pokud správně chápu to co je napsané o exec v https://blog.root.cz/knihy/bash-ocima-bohdana-milara/.
Byl tohle pokus o odpověď na druhou z otázek a pravděpodobně by to bylo shůdné, za předpokladu že
Kód: [Vybrat]
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
# později vykonat krz obsah z ${prikaz}
bude
Kód: [Vybrat]
exec ${prikaz} na konci scriptu, a výpis (pokud by nějaký výpis byl), se převede někam jinam, než na terminál

Kit

  • *****
  • 708
    • Zobrazit profil
    • E-mail
Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #3 kdy: 10. 09. 2023, 15:10:26 »
Kód: [Vybrat]
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
# později vykonat krz obsah z ${prikaz}
Kód: [Vybrat]
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
${prikaz}

Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #4 kdy: 11. 09. 2023, 07:35:02 »
... Byl tohle pokus o odpověď na druhou z otázek a pravděpodobně by to bylo shůdné, za předpokladu že ...
Kód: [Vybrat]
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
${prikaz}
Aha a tohle je na tu druhou otázku mnohem lepší odpověď, díky.

Ještě by mě tedy zajímalo, jestli jde tohle nějak udělat tak, aby výstup z takového příkazu byl v proměnné


vcunat

  • ***
  • 134
    • Zobrazit profil
    • E-mail
Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #5 kdy: 11. 09. 2023, 08:07:07 »
vysledek=$($prikaz)

Třeba.  Možná by to chtělo si pročíst nějaký úvod do shell/bashe.

Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #6 kdy: 11. 09. 2023, 11:40:27 »
vysledek=$($prikaz)

Třeba.  Možná by to chtělo si pročíst nějaký úvod do shell/bashe.
To nemohu popřít, ale zkoušel jsem to dříve, než jsem sem podal dotaz, a nefungovalo to tak. Pro mě překvapivě to po tvé odpovědi částečně jde. Aha já pitomec - v nějaké chvíli jsem začal kopírovat chybnou část kódu a pak se do toho tak zamotal, že jsem měl dojem že to nefunguje vůbec a nakonec se zeptal tady.
Přitom mi to ve skutečnosti nefunguje jen u příkazu, kde mám rouru
Kód: [Vybrat]
        prikaz1="ps -Al U michal | grep vidsave"
        prikaz2="ps -Al U michal | grep yt-dlp"
        echo -en " ${barvaTextBila}${prikaz1}${barvaTextZrusit}\n"
        ps=$($prikaz1)
        ps+="\n\n"
        echo -en " ${barvaTextBila}${prikaz2}${barvaTextZrusit}\n"
        ps+=$($prikaz2)
        echo -en " ${barvaTextZluta}${ps}${barvaTextZrusit}"
        ;;
má za výsledek
Kód: [Vybrat]
ps -Al U michal | grep vidsave
error: garbage option

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

For more details see ps(1).
 ps -Al U michal | grep yt-dlp
error: garbage option

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

For more details see ps(1).
Přitom příkaz samotný, jak spuštěný přímo v konzoli, tak ve scriptu ale neuložený do proměnné, tedy $(ps -Al U michal | grep vidsave) funguje správně.

Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #7 kdy: 12. 09. 2023, 05:50:10 »
Zkusil jsem si to přepsat ještě jednou:
Kód: [Vybrat]
prikaz1cast1="ps -Al U michal"
        prikaz1cast2="grep vidsave"
        prikaz1="$prikaz1cast1 | $prikaz1cast2"

        prikaz2cast1="ps -Al U michal"
        prikaz2cast2="grep yt-dlp"
        prikaz2="$prikaz2cast1 | $prikaz2cast2"
       
        echo -en " ${barvaTextBila}${prikaz1}${barvaTextZrusit}\n"
        #ps=$(ps -Al U michal | grep vidsave) # funkční
        ps=$($prikaz1cast1 | $prikaz1cast2)   # funkční
        #ps=$($prikaz1)                       # nefunkční
       
        ps+="\n\n"
        echo -en " ${barvaTextBila}${prikaz2}${barvaTextZrusit}\n"
        #ps+=$(ps -Al U michal | grep yt-dlp) # funkční
        ps=$($prikaz2cast1 | $prikaz2cast2)   # funkční
        #ps+=$($prikaz2)                      # nefunkční
        echo -en " ${barvaTextZluta}${ps}${barvaTextZrusit}"
Dle mého názoru vadí svislítko uložené do proměnné, jen by mě zajímalo proč vlastně a velmi pochybuji o tom, že by mi při hledání důvodu pomohlo něco jako ps --help

Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #8 kdy: 12. 09. 2023, 06:32:18 »
Dle mého názoru vadí svislítko uložené do proměnné, jen by mě zajímalo proč vlastně a velmi pochybuji o tom, že by mi při hledání důvodu pomohlo něco jako ps --help
Máš v obojím pravdu :-)
Tady trochu vysvětlujou, proč to nefunguje: https://unix.stackexchange.com/a/506859
Tady je něco, co se tváří jako řešení, ale nezkoušel jsem: https://stackoverflow.com/questions/43752854/bash-pipe-character-in-variable-for-command-substitution

Každopádně pro googlení jsou důležitý výrazy "bash", "command substitution" a "pipe"

Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #9 kdy: 12. 09. 2023, 15:14:26 »
Tady trochu vysvětlujou, proč to nefunguje: https://unix.stackexchange.com/a/506859
Tady je něco, co se tváří jako řešení, ale nezkoušel jsem: https://stackoverflow.com/questions/43752854/bash-pipe-character-in-variable-for-command-substitution

Každopádně pro googlení jsou důležitý výrazy "bash", "command substitution" a "pipe"
Díky za tipy.
Skrytí do funkce jsem zatím nezkoušel. protože důvod proč jsem to původně dával do proměnné, spočívá v tom, proměnnou složit na základě vstupů a posléze spustit

Pořád jsem v tom moc nepokročil, ale díky nastavení set -x na které se mi povedlo úplně zapomenout už vím, proč to vlastně vyhazuje chybu
Kód: [Vybrat]
prikaz1cast1="ps -Al U michal"
prikaz1cast2="grep vidsave"
prikaz1="$prikaz1cast1 | $prikaz1cast2"
echo ${prikaz1}
ps=$($prikaz1)                       # nefunkční
#ps=`$prikaz1`                       # kdo by to řekl?, chová se stejně jako předchozí
echo je v pohodě a vytiskne ps -Al U michal | grep vidsave
při pokusu o spuštění se to nicméně přeloží pro bash jako
ps -Al U michal '|' grep vidsave
což celkem pochopitelně skončí chybou
zkusil jsem jen tak, co to udělá přidat středníky...
Kód: [Vybrat]
prikaz1="$prikaz1cast1; | $prikaz1cast2;"výsledkem pokusu o spuštění byl příkaz, dá li se tomu tak říci ps -Al U 'michal;' '|' grep 'vidsave;'

z_sk

Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #10 kdy: 20. 09. 2023, 09:50:57 »
Kód: [Vybrat]
ps=$($prikaz1)                       # nefunkční
#ps=`$prikaz1`                       # kdo by to řekl?, chová se stejně jako předchozí

Daj:
Kód: [Vybrat]
ps2=`echo $prikaz1|sh`

Re:Dokáže Bash spustit příkaz z proměnné?
« Odpověď #11 kdy: 21. 10. 2023, 17:54:44 »
Daj:
Kód: [Vybrat]
ps2=`echo $prikaz1|sh`
Děkuji.

Funguje to (ať už se závorkou nebo se zpětným apostrofem).