Forums Neueste Beiträge
 

Unsinniges Quoting verhindern

20/09/2011 - 10:34 von Alexander Skwar | Report spam
Hallo.


Wie verhindere ich es, das mir die bash 4.2.8 ungefragt Zeichenketten
quoted?


ask@ewzw032:~/.ssh$ gnome-terminal $( sed 's,^\(.*\)|\(.*\)$,--tab -t \1
-e "\2" \\,' \
~/var/term-tabs/prod.term-tabs | head -n3 ; echo --show-menubar )
++ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e "\2" \\,'
/home/ask/var/term-tabs/prod.term-tabs
++ head -n3
++ echo --show-menubar
+ gnome-terminal --tab -t cas1-prod -e '"ssh' 'cas1-prod"' '\' --tab -t
cas2-prod -e '"ssh' 'cas2-prod"' '\' --tab -t web1-prod -e '"ssh'
'web1-prod"' '\' --show-menubar
Einlesen der Argumente schlug fehl: Argument von »--command/-e« ist
kein gültiger Befehl: Text endete, bevor ein passendes
Anführungszeichen für " gefunden wurde. (Der Text war »"ssh«)

(bzw. auf http://pastebin.com/gta7hgJW in lesbar…)

ask@ewzw032:~/.ssh$ head -n 3 ~/var/term-tabs/prod.term-tabs
+ head -n 3 /home/ask/var/term-tabs/prod.term-tabs
cas1-prod|ssh cas1-prod
cas2-prod|ssh cas2-prod
web1-prod|ssh web1-prod

(-> http://pastebin.com/TB3vLi0T )

Der sed Befehl ist "richtig" - glaube ich, weil:

ask@ewzw032:~/.ssh$ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e "\2" \\,' \
~/var/term-tabs/prod.term-tabs | head -n3 ; echo --show-menubar
+ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e "\2" \\,'
/home/ask/var/term-tabs/prod.term-tabs
+ head -n3
+ echo --show-menubar

(-> http://pastebin.com/0KZcxZUp )

Schaut man sich nun die erste Ausgabe oben nochmal an:

+ gnome-terminal --tab -t cas1-prod -e '"ssh' 'cas1-prod"' '\' --tab -t
cas2-prod -e '"ssh' 'cas2-prod"' '\' --tab -t web1-prod -e '"ssh'
'web1-prod"' '\' --show-menubar

Da fàllt auf: -e '"ssh' 'cas1-prod"'

Warum ist das so komisch gequoted? Sed benutzt:

sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e "\2" \\,'
/home/ask/var/term-tabs/prod.term-tabs

Sed ohne quote:

sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e \2 \\,'
/home/ask/var/term-tabs/prod.term-tabs

Ergebnis:

ask@ewzw032:~/.ssh$ ( sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e \2 \\,' \
~/var/term-tabs/nzz-prod.term-tabs | head -n3 ; echo --show-menubar )
+ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e \2 \\,'
/home/ask/var/term-tabs/prod.term-tabs
+ head -n3
+ echo --show-menubar

Klappt aber nicht :(

ask@ewzw032:~/.ssh$ gnome-terminal $( ( sed 's,^\(.*\)|\(.*\)$,--tab -t
\1 -e \2 \\,' \
~/var/term-tabs/nzz-prod.term-tabs | head -n3 ; echo --show-menubar )
)
++ head -n3
++ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e \2 \\,'
/home/ask/var/term-tabs/prod.term-tabs
++ echo --show-menubar
+ gnome-terminal --tab -t cas1-prod -e ssh cas1-prod '\' --tab -t
cas2-prod -e ssh cas2-prod '\' --tab -t web1-prod -e ssh web1-prod '\'

Ist klar das dies nicht klappt, denn da fehlen ja nun die Quotes
komplett… :(



Hintergrund:

Einige von uns hier in der Firma nutzen KDE + Konsole und einige Gnome
mit gnome-terminal. Nun ist es so, das wir uns hàufig direkt auf einer
ganzen Latte von Rechnern eines Environmentes "gleichzeitig" einzuloggen
haben.

Um das zu tun, muss man "natürlich" ;) konsole bzw. gnome-terminal
komplett anders starten. Bei Konsole:

konsole --tabs-from-file $file

Mit $file:

title:foo;; command:ssh foo
title:bar;; command:ssh bar

Bei gnome-terminal lautet es hingegen:

gnome-terminal --tab -t foo -e "ssh foo" --tab -t bar -e "ssh bar"

Beides irgendwie toll…

Nun möchte ich 'n bash Script "Tabs" basteln, das eine Eingabedatei
auswertet und dann "passend" konsole bzw. gnome-terminal aufruft.


Gruss und Dank,
Alexander

I just forgot my whole philosophy of life!!!
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
 

Lesen sie die antworten

#1 Thomas PointedEars Lahn
22/09/2011 - 10:52 | Warnen spam
Alexander Skwar wrote:

Wie verhindere ich es, das mir die bash 4.2.8 ungefragt Zeichenketten
quoted?



Das Problem ist nicht die bash.

:~/.ssh$ gnome-terminal $( sed 's,^\(.*\)|\(.*\)$,--tab -t \1
-e "\2" \\,' \
~/var/term-tabs/prod.term-tabs | head -n3 ; echo --show-menubar )
++ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e "\2" \\,'
/home/ask/var/term-tabs/prod.term-tabs
++ head -n3
++ echo --show-menubar
+ gnome-terminal --tab -t cas1-prod -e '"ssh' 'cas1-prod"' '\' --tab -t
cas2-prod -e '"ssh' 'cas2-prod"' '\' --tab -t web1-prod -e '"ssh'
'web1-prod"' '\' --show-menubar
Einlesen der Argumente schlug fehl: Argument von »--command/-e« ist
kein gültiger Befehl: Text endete, bevor ein passendes
Anführungszeichen für " gefunden wurde. (Der Text war »"ssh«)

(bzw. auf http://pastebin.com/gta7hgJW in lesbar…)

:~/.ssh$ head -n 3 ~/var/term-tabs/prod.term-tabs
+ head -n 3 /home/ask/var/term-tabs/prod.term-tabs
cas1-prod|ssh cas1-prod
cas2-prod|ssh cas2-prod
web1-prod|ssh web1-prod

(-> http://pastebin.com/TB3vLi0T )

Der sed Befehl ist "richtig" - glaube ich, weil:

:~/.ssh$ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e "\2" \\,' \
~/var/term-tabs/prod.term-tabs | head -n3 ; echo --show-menubar
+ sed 's,^\(.*\)|\(.*\)$,--tab -t \1 -e "\2" \\,'
/home/ask/var/term-tabs/prod.term-tabs
+ head -n3
+ echo --show-menubar

(-> http://pastebin.com/0KZcxZUp )

Schaut man sich nun die erste Ausgabe oben nochmal an:

+ gnome-terminal --tab -t cas1-prod -e '"ssh' 'cas1-prod"' '\' --tab -t
cas2-prod -e '"ssh' 'cas2-prod"' '\' --tab -t web1-prod -e '"ssh'
'web1-prod"' '\' --show-menubar

Da fàllt auf: -e '"ssh' 'cas1-prod"'


^^^^^^ ^^^^^^^^^^^^
Warum ist das so komisch gequoted?



Bei Command Substitution wird jedes Wort als eigenes Argument betrachtet:

| Command Substitution
| Command substitution allows the output of a command to replace the
| command name. There are two forms:
|
| $(command)
| or
| `command`
|
| Bash performs the expansion by executing command and replacing the
| command substitution with the standard output of the command,
| with any trailing newlines deleted. Embedded newlines are not
| deleted, but they may be removed during word splitting. The command
^^^^^^^^^^^^^^
| substitution $(cat file) can be replaced by the equivalent but
| faster $(< file).
|
| When the old-style backquote form of substitution is used,
| backslash retains its literal meaning except when followed by $, `,
| or \. The first backquote not preceded by a backslash terminates
| the command substitution. When using the $(command) form, all
| characters between the parentheses make up the command; none are
| treated specially.
|
| Command substitutions may be nested. To nest when using the
| backquoted form, escape the inner backquotes with backslashes.
|
| If the substitution appears within double quotes, word splitting
^^^^^^^^^^^^^^
| and pathname expansion are not performed on the results.

Da aber `-e' nur ein Argument akzeptiert, ist das Argument `"ssh', und
gnome-terminal(1) beschwert sich zu Recht über eine nicht abgeschlossene
Stringkonstante.

BTW: `LC_MESSAGES=en_US…' ist sinnvoller.

PointedEars

Please do not Cc: me. / Bitte keine Kopien per E-Mail.

Ähnliche fragen