Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
latenite
- Beiträge: 688
- Registriert: 14.05.2007 01:04:23
Beitrag
von latenite » 02.10.2009 23:07:22
Hallo Leute
ich versteh hier was nicht. Ich möchte in einer Variable die einen Pfad als String enthält die "/" durch "\/" ersetzen.
Aber wenn ich das Ergebniss einer Variabl ezuweise bekomme ich eine Fehlermeldung:
Code: Alles auswählen
0:572:root@pendrive /media/disk/system_setup [0]# var='/mnt/new/path'
0:573:root@pendrive /media/disk/system_setup [0]# newvar=`echo ${path} | sed -e 's/n/b/g'`
0:574:root@pendrive /media/disk/system_setup [0]# echo $newvar
mbt/bew/das/weg
0:575:root@pendrive /media/disk/system_setup [0]# newvar=`echo ${path} | sed -e 's/\//\\\//g'`
sed: -e Ausdruck #1, Zeichen 9: unknown option to `s'
0:576:root@pendrive /media/disk/system_setup [1]# echo ${path} | sed -e 's/\//\\\//g'
mnt\/new\/das\/weg
0:577:root@pendrive /media/disk/system_setup [0]#
Ich brauche den geänderten String mit "\/" statt nur "/" um ihn wieder in sed nutzen zu können.
Also so:
Code: Alles auswählen
#
echo "enter a path: "
read BUILDINGGROUND_MOUNTPOINT
substitute_text=`echo ${BUILDINGGROUND_MOUNTPOINT} | sed 's/\//\\\//g'`
substitute_line='8'
#eigendlich kommt die Zeilennummer hier her:
#substitute_line=$((`cat ${PATHPREFIX}/current_configs/current_table.txt | grep -n '## BUILDINGGROUND ##' | cut -d":" -f1`+1))
sed -i -e "${substitute_line}s/.*/${substitute_text}/" ${PATHPREFIX}/current_configs/current_table.txt
Noch geht weder die Variable ${substitude_line} in der letzen Zeile noch die Variable ${substitute_text}
Was mache ich da falsch?
Danke
Danke
-
GoKi
- Beiträge: 2068
- Registriert: 04.07.2003 23:08:56
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von GoKi » 02.10.2009 23:40:20
Ich würde da einfach mal ein nettes Feature von sed benutzen. Du musst nicht / benutzen...
Code: Alles auswählen
$ echo "/mnt/new/path" | sed -e 's:n:b:g'
/mbt/bew/path
$ echo "/mnt/new/path" | sed -e 's:n:b:g'
/mbt/bew/path
btw.
http://sial.org/howto/shell/useless-cat/
Wobei da evtl. eh ed geeigneter ist, um an einer bestimmten Stelle in einer Datei etwas einzufügen.
MfG GoKi
:wq
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 02.10.2009 23:40:39
nachdem es so funktioniert:
Code: Alles auswählen
gms@gms1 ~ $ newvar=$(echo ${path} | sed -e 's/\//\\\//g')
gms@gms1 ~ $ echo $newvar
mnt\/new\/das\/weg
kann das eigentlich nur mit der Sonderbehandlung vom Backslash zu tun haben:
man bash hat geschrieben:
When the old-style backquote form of substitution is used, backslash
retains its literal meaning except when followed by $, `, or \.
...
When using the $(command) form, all characters between the
parentheses make up the command; none are treated specially.
wenn ich den ersten Satz richtig interpretiere, muß der Backslash escaped werden, wenn nachfolgend ein $,` oder \ Zeichen folgt
Code: Alles auswählen
gms@gms1 ~ $ newvar=`echo ${path} | sed -e 's/\//\\\\\//g'`
gms@gms1 ~ $ echo $newvar
mnt\/new\/das\/weg
Gruß
gms
edit:
für solche simple Ersetzungen braucht man den sed eigentlich nicht zu bemühen:
Code: Alles auswählen
gms@gms1 ~ $ newvar=${path//\//\\\/}
gms@gms1 ~ $ echo $newvar
mnt\/new\/das\/weg
-
latenite
- Beiträge: 688
- Registriert: 14.05.2007 01:04:23
Beitrag
von latenite » 03.10.2009 01:17:52
@ gms
Du hast die neue Variable so initialisiert:
Ich so:
Deine Synatx kannte ich bis heute gar nicht was bedeute das?
ich kenne
und
Warum hat meins nicht funktioniertß Wenn ich es ausführe kommt doch der string den ich will dabei raus?
Code: Alles auswählen
0:529:root@pendrive /media/disk/system_setup [0]# echo ${STRING} | sed -e 's/\//\\\//g'
\/mnt\/new\/path
0:530:root@pendrive /media/disk/system_setup [0]#
Und am aller wichtigsten -> was is das $() ? welche Funktion hat diese Syntax?
Und mal ein RIESEN "DAAAAAaaaaaNKE" an alle hier im Forum. Eure Hilfe ist echt goldwert!!!
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 03.10.2009 09:23:11
Die Syntax $(command) ist eine neuere Form von `command`. In dieser Form können die Kommandos auch leichter verschachtelt werden und der Backslash braucht keine Sonderbehandlung
latenite hat geschrieben:
Warum hat meins nicht funktioniertß Wenn ich es ausführe kommt doch der string den ich will dabei raus?
Code: Alles auswählen
0:529:root@pendrive /media/disk/system_setup [0]# echo ${STRING} | sed -e 's/\//\\\//g'
\/mnt\/new\/path
0:530:root@pendrive /media/disk/system_setup [0]#
Bei Verwendung von Backticks müssen die Backslashes, also \-Zeichen, bei verschachtelten Kommandos escaped werden. In der neueren Form jedoch nicht:
Code: Alles auswählen
gms@gms1 ~ $ echo `echo \`date\``
Sam Okt 3 09:04:52 CEST 2009
gms@gms1 ~ $ echo $(echo $(date))
Sam Okt 3 09:04:59 CEST 2009
Daher muß die Shell innerhalb von Backticks unterscheiden können, ob ein Backslash als Escapezeichen oder als Literal zu betrachten ist. Daher muß der Backslash in den oben genannten Fällen ( wenn er von $, ` oder \ ) gefolgt wird und als Literal betrachtet werden soll eskaped werden.
-
latenite
- Beiträge: 688
- Registriert: 14.05.2007 01:04:23
Beitrag
von latenite » 03.10.2009 23:05:33
Hi Leute
wenn ich in einem Script chroot nutze und dann in der neuen chrootumgebung ein weiteres script ausführen will, wie mache ich das dann?
Code: Alles auswählen
chroot /mnt/newsystem
cd /pfad/zum/script/in/der/chrootumgebung
./script.sh
das habe ich probiert...aber da wird nur chroot ausgeführt und dann war ' s das.
Danke für die Hilfe
-
Meillo
- Moderator
- Beiträge: 9254
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 03.10.2009 23:21:01
latenite hat geschrieben:wenn ich in einem Script chroot nutze und dann in der neuen chrootumgebung ein weiteres script ausführen will, wie mache ich das dann?
Code: Alles auswählen
chroot /mnt/newsystem
cd /pfad/zum/script/in/der/chrootumgebung
./script.sh
das habe ich probiert...aber da wird nur chroot ausgeführt und dann war ' s das.
Wie sieht dein Script aus? Denn da darf natürlich nur Zeug verwendet werden das in der chroot auch vorhanden ist. Alles außerhalb ist ja unsichtbar.
Teste lieber erst mal mit einer statisch gelinkten Executable, das ist der einfachste Fall. Sonst halt /bin in die chroot kopieren, oder was du halt so brauchst. Und auf $PATH achten, der muss passen.
Use ed once in a while!
-
latenite
- Beiträge: 688
- Registriert: 14.05.2007 01:04:23
Beitrag
von latenite » 03.10.2009 23:49:12
Hi Meillo
Also mein script sieht so aus:
Code: Alles auswählen
#!/bin/bash
PATHPREFIX='./subscripts'
cat << EOF
################################################################################
# CHROOTING INTO NEW SYSTEM
################################################################################
EOF
BUILDINGGROUND=`cat ${PATHPREFIX}/current_configs/current_table.txt | grep -A1 '## BUILDINGGROUND ##' | tail -1 | sed 's/ //'`
echo $BUILDINGGROUND
NEWDATA=`cat ${PATHPREFIX}/current_configs/current_table.txt | grep -A1 '## NEWDATA ##' | tail -1 | sed 's/ //'`
echo $NEWDATA
MODE=$1
echo $MODE
function chrooting () {
MODE=$1
################################################################################
# adding /proc and /dev so we can act aks if we where alife
################################################################################
mount -o bind /dev ${BUILDINGGROUND}/dev
mount -t proc /proc ${BUILDINGGROUND}/proc
mount -o bind /sys ${BUILDINGGROUND}/sys
################################################################################
# move into our new nome :) and run "debootstrap_part_2.sh"
################################################################################
chroot ${BUILDINGGROUND} /usr/bin/env -i HOME=/root TERM=$TERM PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login
echo $MODE
cd ${NEWDATA}/system_setup
./chroot_to_end.sh ${MODE}
} # end of chrooting
chrooting ${MODE}
und wenn ich es ausführe wird nach dem chroot leider nicht das in der chrootumgebung liegende "chroot_to_end.sh" script ausgeführt. Genau genommen macht er nach dem chroot GARNIX mehr.
Das Ls um zu zeigen das das Script vorhanden ist habe ich von hand gemacht:
Code: Alles auswählen
################################################################################
# CHROOTING INTO NEW SYSTEM
################################################################################
/mnt/newsystem
/root
UNATTENDED
mount: /proc already mounted or /mnt/newsystem/proc busy
mount: according to mtab, /proc is already mounted on /mnt/newsystem/proc
localhost:/# DAS HIER MACHE ICH _nicht_ DAS SCRIPT
bash: DAS: command not found
localhost:/# cd /root/system_setup/
localhost:~/system_setup# ls -l ./chroot_to_end.sh
-rwxr-xr-x 1 root root 90 Oct 3 21:14 ./chroot_to_end.sh
localhost:~/system_setup#
Danke
-
Meillo
- Moderator
- Beiträge: 9254
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 04.10.2009 00:22:25
latenite hat geschrieben:Danke
Danke nicht zu früh, denn ich muss jetzt leider passen. Chroot kenne ich nur theoretisch, habe aber keine praktischen Erfahrungen. Ich könnte jetzt nur noch raten.
Morgen hat dir bestimmt jemand handfeste Hilfe.
Use ed once in a while!
-
gms
- Beiträge: 7798
- Registriert: 26.11.2004 20:08:38
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von gms » 04.10.2009 09:04:11
Dein Script läuft natürlich zu keiner Zeit im Kontext des Chroots. In diesem Kontext lauft nur der Prozeß, der vom "chroot" Kommando gestartet wird.
-
latenite
- Beiträge: 688
- Registriert: 14.05.2007 01:04:23
Beitrag
von latenite » 04.10.2009 13:17:28
Kann ich dem chroot den Pfad zu einem Script in der chrootumgebung mitgeben und es unter chroot starten? Wenn ja, wie?
....lauft nur der Prozeß, der vom "chroot" Kommando gestartet wird.
Danke
-
Meillo
- Moderator
- Beiträge: 9254
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 04.10.2009 14:33:40
latenite hat geschrieben:Kann ich dem chroot den Pfad zu einem Script in der chrootumgebung mitgeben und es unter chroot starten? Wenn ja, wie?
Hast du dir denn mal die Manpage angeschaut? Denn da steht das ganz deutlich drin.
Use ed once in a while!