Konsole Befehlsumsetzung in Shell Skript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mgolbs
Beiträge: 275
Registriert: 22.03.2009 18:08:17
Wohnort: Tirschenreuth - Löbau

Konsole Befehlsumsetzung in Shell Skript

Beitrag von mgolbs » 28.04.2014 09:55:11

Hallo,

bin leider kein Fachmann was Shell Skripting betrifft. Ich möchte folgenden Befehl:

Code: Alles auswählen

root@arm:~/linux-can-can-utils# echo BB-BONE-SERL-01:00A2 >/sys/devices/bone_capemgr.*/slots
in ein Shell Skript stecken. Wenn ich den Befehl, in gleicher Befehlsabfolge, auf der Konsole nutze klappt es. Wenn ich die Befehlsreihenfolge in ein Skript packe,
#!/bin/sh
# Start CAN Initialisierung
modprobe vcan
ip link add dev vcan0 type vcan
ifconfig vcan0 up
# ip link set can0 up type can bitrate 250000
echo BB-BONE-SERL-01:00A2 >/sys/devices/bone_capemgr.*/slots
ip link set can0 up type can bitrate 250000
kommt folgender Fehler:
root@arm:~/linux-can-can-utils# ./canstart.sh
RTNETLINK answers: File exists
RTNETLINK answers: Device or resource busy
./canstart.sh: 7: ./canstart.sh: cannot create /sys/devices/bone_capemgr.*/slots: Directory nonexistent
RTNETLINK answers: Device or resource busy
root@arm:~/linux-can-can-utils#
Hat da jemand eine Idee, was ich falsch mache? Über einen Tipp wäre ich sehr dankbar.

Gruß und Dank Markus
Dem Überflüssigen nachlaufen, heißt das Wesentliche verpassen.
Jules Saliège

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Re: Konsole Befehlsumsetzung in Shell Skript

Beitrag von peschmae » 28.04.2014 10:20:35

Ist /bin/sh auch die shell die du interaktiv benutzt? Bei Debian ist die interaktive Shell per default bash, währenddem /bin/sh auf dash verweist. Bash kann sowas wie die Wildcard in deinem Script expanden, dash macht das nicht...

(Versuch mal den Befehl von Hand laufen zu lassen nachdem du mit /bin/sh in diese shell gewechselt hat; das sollte die gleiche Fehlermeldung liefern)

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

mgolbs
Beiträge: 275
Registriert: 22.03.2009 18:08:17
Wohnort: Tirschenreuth - Löbau

Re: Konsole Befehlsumsetzung in Shell Skript

Beitrag von mgolbs » 28.04.2014 11:25:15

Hallo,

vielen Dank! Da habe ich den Wald vor lauter Bäumen nicht gesehen.
#!/bin/sh
gegen
#!/bin/bash
getauscht und schon läufts.

Vielen Dank und Gruß Markus
Dem Überflüssigen nachlaufen, heißt das Wesentliche verpassen.
Jules Saliège

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Konsole Befehlsumsetzung in Shell Skript

Beitrag von rendegast » 29.04.2014 07:49:15

Da ist noch ein systematischer Fehler wegen eventueller Mehrdeutigkeit
echo BB-BONE-SERL-01:00A2 >/sys/devices/bone_capemgr.*/slots
sollte formal eher sowas

Code: Alles auswählen

for i in /sys/devices/bone_capemgr.*/slots; do
  echo BB-BONE-SERL-01:00A2 >$i
done
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Re: Konsole Befehlsumsetzung in Shell Skript

Beitrag von peschmae » 29.04.2014 08:35:32

Tatsächlich. Meine ZSH kann das auch so :P

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Konsole Befehlsumsetzung in Shell Skript

Beitrag von Cae » 29.04.2014 09:00:03

rendegast hat geschrieben:Da ist noch ein systematischer Fehler wegen eventueller Mehrdeutigkeit
Und das ist auch der Grund, warum die sh(1) sich richtig verhaelt und das als literalen foo\*bar-Pfad erkennt, den es natuerlich nicht gibt. Die Bash hat dafuer natuerlich wieder 'n Extrafeature und oeffnet den Weg fuer Bugs bzw. unsauberen Code.

Neben der schon genannten Schleife (inklusive ihrer Quoting-Probleme) kann man auch das externe Programm tee(1) verwenden:

Code: Alles auswählen

#!/bin/sh

echo BB-BONE-SERL-01:00A2 | tee >/dev/null /sys/devices/bone_capemgr.*/slots
(>/dev/null, weil tee(1) nochmal auf stdout kopiert.)

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten