gnome-terminal -e bash -c [LÖST]

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
mickenorlen
Inlägg: 92
Blev medlem: 02 maj 2010, 22:04
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu

gnome-terminal -e bash -c [LÖST]

Inlägg av mickenorlen »

Hej jag hade tänkt att göra ett litet nautilus-script för att högerclick-encodea olika videofiler och jag vill kunna interagera med själva scriptet och valde efter en del googlande den här metoden men den fungerar inte.
jag funderar på om man skulle kunna lägga en launcher i nautilus-script-mappen med kommandot: gnome-terminal -x path/to/file. men jag vill helst lösa det "på riktigt". Det hela är liksom lite en lärdomsgrej från början men nu har jag banne mig suttit länge nog utan att förstå mig på detta och börjar nästan tro att det kan vara nåt fel på ubuntu och för en gångs skull inte på mig?

Såhär ser början på scriptet ut
Har jag testat med/utan -a -c -i och med att lägga in en export $codec - rad ifall det va något med olika shell osv men det blir bara samma error ändå :/ kan även tillägga att i och med att jag kör "exec bash" blir den kvar och om jag DÅ skriver echo $codec får jag "avi"

Kod: Markera allt

#!/bin/bash
for file; do
base=${file%.*}
ext=${file##*.}
newname=${base}" -subbed".${ext}

gnome-terminal -e "bash -a -c -i \" \
echo 'Please type the video codec you want to encode to: avi or xvid'; \
read codec; \
echo $codec; \
exec bash\""
Och såhär ser det ut i terminalen
Har testat både xterm och gnome-terminal

Kod: Markera allt

Please type the video codec you want to encode to: avi or xvid
avi

bash: _python: line 16: syntax error near unexpected token `('
bash: _python: line 16: ` !(python|-?))'
bash: error importing function definition for `_python'
bash: _xz: line 15: syntax error near unexpected token `('
bash: _xz: line 15: ` --decompress | --list | --test | -!(-*)[dlt]*)'
bash: error importing function definition for `_xz'
bash: _tar: line 8: syntax error near unexpected token `('
bash: _tar: line 8: ` ?(-)[cr]*f)'
bash: error importing function definition for `_tar'
mikael@mikael-OptiPlex-GX620:~/Videos$
Tack för hjälp.
Senast redigerad av 1 mickenorlen, redigerad totalt 19 gånger.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: gnome-terminal -e bash -c

Inlägg av Konservburk »

Du bör till att börja med plocka bort flaggan -i för att bli av med alla de där felmeddelandena du får.

Det är flaggan -a som gör så att värdet på $codec följer med till det sista skalet. Är det inte vad du vill, eller om du inte bryr dig så kan du lika gärna plocka bort den flaggan också.

Resten är som vanligt fnuttologin som ställer till det. Din echo $codec ersätts (med bara echo) av det yttre skalet redan innan read codec körs av det inre skalet. Som du har fnuttat så måste du sätta tre backslash framför $codec för att för att den ska finnas kvar ända tills det inre skalet kommer åt den, dvs så här: \\\$codec

Men om jag varit i dina kläder så skulle jag gjort om fnuttningen helt och hållet för att få den mer läsbar.
Något i den här stilen:

Kod: Markera allt

gnome-terminal -x bash -c '
   echo "Please type the video codec you want to encode to: avi or xvid"
   read codec
   echo "$codec"
   exec bash
'
mickenorlen
Inlägg: 92
Blev medlem: 02 maj 2010, 22:04
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu

Re: gnome-terminal -e bash -c

Inlägg av mickenorlen »

detta fungerade inte
gnome-terminal -x bash -c '
echo "Please type the video codec you want to encode to: avi or xvid"
read codec
echo "$codec"
exec bash
'
men såhär fungerade det
gnome-terminal -x "bash -c '
echo "Please type the video codec you want to encode to: avi or xvid"
read codec
echo "$codec"
exec bash
'
"
Har inte mycket kunskap om quotes men tror man måste ha både gnome-terminal och bash-kommandot inom någon form av quote. hur som helst efter en del meck kom jag fram till detta:
#!/bin/bash
for file; do
base=${file%.*}
ext=${file##*.}
newname=${base}" -subbed".${ext}
oac=copy

gnome-terminal -e "bash -a -c '
echo Please type the video codec you want to encode to: avi or xvid
read codec
echo The video will now be re-encoded to "'"$codec"'"

if [ "'"$codec"'" == avi ]; then
mencoder="'"mencoder $file -oac $oac -ovc lavc -sub ${base}.srt -subfont-text-scale 3.3 \
-o $newname"'";

elif [ "'"$codec"'" == xvid ]; then
mencoder="'"mencoder $file -oac $oac -ovc xvid -xvidencopts \
fixed_quant=4:autoaspect -sub ${base}.srt -subfont-text-scale 3.3 -o $newname"'";

else
echo it appears you misstyped. Please try again;
exec bash;
exit;
fi

echo "'"$mencoder"'"
exec bash
'"

done
2 saker jag inte kunde lösa:
hur får jag fram variablerna i echo $mencoder?

hur gör jag för att istället för else - exit, gå tillbaka till "read" så man får en andra chans vid misstype?

och sen om du har några fler kosmetiska/logiska tips så är det alltid kul att lära sig.

tusen tack
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: gnome-terminal -e bash -c

Inlägg av Konservburk »

mickenorlen skrev:detta fungerade inte
gnome-terminal -x bash -c '
echo "Please type the video codec you want to encode to: avi or xvid"
read codec
echo "$codec"
exec bash
'
men såhär fungerade det
gnome-terminal -x "bash -c '
echo "Please type the video codec you want to encode to: avi or xvid"
read codec
echo "$codec"
exec bash
'
"
Är du säker på att du inte råkade använda -e istället för -x som flagga till gnome-terminal? Det är nämligen så att -e kräver fnuttar medan -x egentligen är samma sak, med skillnaden att den ska klara sig utan fnuttar.
mickenorlen skrev:Har inte mycket kunskap om quotes men tror man måste ha både gnome-terminal och bash-kommandot inom någon form av quote.
Det ska inte behövas om du använder -x istället för -e. Finessen med det är just att du slipper fnutta i flera nivåer.
mickenorlen skrev:2 saker jag inte kunde lösa:
hur får jag fram variablerna i echo $mencoder?
Lägg till -a på slutet av första raden i skriptet så att den blir så här:

Kod: Markera allt

#!/bin/bash -a
mickenorlen skrev:hur gör jag för att istället för else - exit, gå tillbaka till "read" så man får en andra chans vid misstype?
Du behöver en loop. Lägg till en ny rad med while true; do direkt ovanför raden med read codec och lägg till en ny rad med break; done direkt efter raden med fi och byt ut raderna med exec bash; och exit; i else-delen mot en ny rad med continue istället.
mickenorlen skrev:och sen om du har några fler kosmetiska/logiska tips så är det alltid kul att lära sig.
Du har nu fnuttat på det här sättet:

Kod: Markera allt

gnome-terminal -e "bash -a -c '
   foo="'"$bar"'"
'"
Det fungerar utmärkt, men kan bli jobbigt i längden eftersom varje vanlig dubbelfnutt blir en monsterfnutt "'" i den inre koden. Du kan få det mer lättläst och helt slippa de inre monsterfnuttarna genom att istället fnutta så här:

Kod: Markera allt

gnome-terminal -e 'bash -a -c '\''
   foo="$bar"
'\'
mickenorlen
Inlägg: 92
Blev medlem: 02 maj 2010, 22:04
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu

Re: gnome-terminal -e bash -c

Inlägg av mickenorlen »

<SOLVED>

Du hade rätt hela tiden såklart =) allt funkar nu tusen tack. ett par mindre viktiga undringar, tänkte passa på.

behöver/brukar man göra något för att få fram comments mitt i singlequotes?

angående echo:
få outputen intabbad en bit i terminalen utan att det ska bero på hur bred terminal man har. annars om den är för liten blir det liksom:

<tab> hej hej [ett hej hoppar ner för att raden inte får plats]
hej <tab> hej h
ej hej <tab> [och sen blir allt bara kaos.]

och hur får man andra raden att sluta med hej- <bindesstreck> oavsett hur bred terminalen är.

och är det såhär man gör att skriva en flytande echo intabbad i själva scriptet:
echo "hej hej hej "\
"hej hej hej hej. "\
"osv osv."

tror iaf det va så jag gjorde men sitter på xp nu.

tacktack.
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: gnome-terminal -e bash -c

Inlägg av Konservburk »

mickenorlen skrev:behöver/brukar man göra något för att få fram comments mitt i singlequotes?
Jag är inte riktigt med på vad du menar med att få fram?
mickenorlen skrev:angående echo:
få outputen intabbad en bit i terminalen utan att det ska bero på hur bred terminal man har. annars om den är för liten blir det liksom:

<tab> hej hej [ett hej hoppar ner för att raden inte får plats]
hej <tab> hej h
ej hej <tab> [och sen blir allt bara kaos.]
Du kan köra printf '\033[?7l' om du vill slippa de där automatiska radbrytningarna.
mickenorlen skrev:och hur får man andra raden att sluta med hej- <bindesstreck> oavsett hur bred terminalen är.
Jag vet inte om det finns något färdigt kommando för sånt. Det är förstås möjligt att det redan finns, men annars får du hantera den biten på egen hand. Allt du egentligen behöver veta är den nuvarande bredden på terminalen som du får reda på med kommandot tput cols
mickenorlen skrev:och är det såhär man gör att skriva en flytande echo intabbad i själva scriptet:
echo "hej hej hej "\
"hej hej hej hej. "\
"osv osv."
Gör du så där får du ett extra mellanrum varje gång du byter rad. Du kan förstås passa in det så att du bara byter rad vid mellanrum och då fungerar det där sättet helt ok.
Skriv svar

Återgå till "Terminalforum"