mikrocontroller.net

Forum: PC-Programmierung Bash Kommando an Variabel übergeben und anzeigen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rejocktana M. (rejocktana_m)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin neu in der Skrip-Programmierung in Linux(Raspbian). Ich möchte 
die Ausgabe eines Kommandos (cangen) in eine Variabel speichern und 
spätter in meinem Skript verarbeiten.

Mit dem Befehl "cangen" generiere ich anhand eines virtuellen 
CAN-Bus-Interface CAN-Bus Daten. Diese Daten möchte ich immer in einer 
Variabel speichern. Normalerweise bekomme ich solche Daten, wenn ich den 
Befehl ausführe(Anhang):

Befehl: cangen vcan0 -g 4 -I 7E -L 8 -D r -v
Ausgabe:http:
http://www.bilder-upload.eu/show.php?file=0263db-1470922561.jpg

Nun möchte folgender Skript, die Ausgabe des Befehls in einer Variabel 
speichern:

#!/bin/bash

#We have to generate a virtual CAN bus Interface

sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

candata= `cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
echo $candata

Leider bekomme ich keine Ausgabe. ich bekomme nur die Nachricht:

RTNETLINK answers: File exists

Ich habe nicht sehr viel Erfahrung in Python und die Programmierung mit 
Skript in Linux, deswegen wollte ich mal hier fragen, ob jemand mir 
helfen könnte meine Herausforderung zu lösen.

Danke

von Frank M. (ukw) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Rejocktana M. schrieb:
> Leider bekomme ich keine Ausgabe. ich bekomme nur die Nachricht:
>
> RTNETLINK answers: File exists

Dann stelle fest, welcher Befehl im Script den Fehler produziert.

Starte das Script mit

  sh -x script-name.sh

Dann wird Dir jeder einzelne Befehl darin angezeigt. Ich vermute mal, 
dass es einer der beiden "ip up"-Befehle ist, welcher den Fehler 
produziert.

> candata= `cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
> echo $candata

Wenn ich es richtig sehe, erzeugt cangen mehrzeiligen Output?
Dann solltest Du

   echo "$candata"

verwenden, um Zeilenumbrüche und andere Whitespaces 1:1 zu erhalten. 
Sonst klatscht Dir echo einfach alles hintereinander.

: Bearbeitet durch Moderator
von Gerhard (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Übrigens, es heisst "Variable", nicht "Variabel".

von Rejocktana M. (rejocktana_m)


Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:
> Rejocktana M. schrieb:

> Dann stelle fest, welcher Befehl im Script den Fehler produziert.
>
> Starte das Script mit
>
>   sh -x script-name.sh
>
> Dann wird Dir jeder einzelne Befehl darin angezeigt. Ich vermute mal,
> dass es einer der beiden "ip up"-Befehle ist, welcher den Fehler
> produziert.

Du hattest recht, der Befehl: ip link add dev vcan0 type Vcan ist es.
Ich habe mein Raspberry Pi neugestartet und den Scrip neugestartet, dann 
bekam ich beim ersten Aufruf des Scripts keine Meldung. Die Daten werden 
zwar nicht dargestellt aber es ist schon mal ein Vorschritt für mich, 
danke.

Ich vermute, dass dieser Befehl einmal ausgeführt werden muss, um das 
CAN-Interface zu bilden, dann darf man den Befehl nicht mehr ausführen. 
Es sei denn man startet das System neu.

Irgendwie schaft es die Konsole nicht, die Daten auszugeben...

von Norbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Rejocktana M. schrieb:
> candata= `cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
> echo $candata

Ohne Leerzeichen!
candata=`cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v`
oder
candata=$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)

Dann sollte es auch funktionieren.

von Daniel A. (daniel-a)


Bewertung
0 lesenswert
nicht lesenswert
Norbert schrieb:
> candata=$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)

Ich würde noch Anfürungszeichen dazu tun:
candata="$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)"

von Norbert (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Daniel A. schrieb:
> Norbert schrieb:
>> candata=$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)
>
> Ich würde noch Anfürungszeichen dazu tun:
>
>
candata="$(cangen vcan0 -g 0.008 -I 7E -L 8 -D r -v)"

Warum?

Oder genauer, warum bei der Zuweisung?
Alle Daten welche 'cangen' auf stdout schreibt, gehen in die variable 
'candata'.

Bei der Nutzung von 'candata' hinterher sind Anführungszeichen 
sicherlich sinnvoll, da können sonst Blanks u.ä. problematisch sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.