Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Michal Švarc 10. 09. 2023, 12:41:50
-
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
"-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
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}
-
https://letmegooglethat.com/?q=bash+eval+command+in+variable
-
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/ (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
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
# později vykonat krz obsah z ${prikaz}
bude
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
-
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
# později vykonat krz obsah z ${prikaz}
prikaz="ps -C yt-dlp -o pid=,ppid=,cmd --sort=time"
${prikaz}
-
... Byl tohle pokus o odpověď na druhou z otázek a pravděpodobně by to bylo shůdné, za předpokladu že ...
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é
-
vysledek=$($prikaz)
Třeba. Možná by to chtělo si pročíst nějaký úvod do shell/bashe.
-
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
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
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ě.
-
Zkusil jsem si to přepsat ještě jednou:
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
-
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"
-
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
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...
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;'
-
ps=$($prikaz1) # nefunkční
#ps=`$prikaz1` # kdo by to řekl?, chová se stejně jako předchozí
Daj:
ps2=`echo $prikaz1|sh`
-
Daj:
ps2=`echo $prikaz1|sh`
Děkuji.
Funguje to (ať už se závorkou nebo se zpětným apostrofem).