dash en bash echo "foo\040bar" > file foo\040bar of foo bar

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • daft_dutch
  • Registratie: December 2003
  • Laatst online: 08-09 21:46

daft_dutch

>.< >.< >.< >.<

Topicstarter
Hoi,
ik heb (vind ik) iets raars gevonden. ik heb een backup restore script geschreven. en daar worden op het laatste een windows share aan de fstab toegevoegd. EN daar zit een spatie in de share naam. :|

Maar nu heb ik een afhankelijkheid gevonden van welke shell type wordt gebruikt.

Nu zet dash echo "foo\040bar" > file
foo bar in de file

en bash echo "foo\040bar" > file
foo\040bar

weet iemand hoe ik dit gelijk kan trekken?

forceren van een type met echo -e of -E werkt niet van dash begint gewoon de -e of -E te echoen
ik heb het nu opgelost met printf te gebruiken maar dat zijn weer een heel stel extra slashes

linux versie debian 8.1

>.< >.< >.< >.<


Acties:
  • 0 Henk 'm!

  • Bart
  • Registratie: Februari 2001
  • Laatst online: 13:58
Vraag in je script eerst het gebruikte shell type op en bepaal op basis daarvan de echo regel die je uitvoert?

I'm not deaf, I'm just ignoring you.


Acties:
  • 0 Henk 'm!

  • daft_dutch
  • Registratie: December 2003
  • Laatst online: 08-09 21:46

daft_dutch

>.< >.< >.< >.<

Topicstarter
Bart schreef op woensdag 22 juli 2015 @ 17:00:
Vraag in je script eerst het gebruikte shell type op en bepaal op basis daarvan de echo regel die je uitvoert?
Nee ik heb gewoon #!/bin/bash boven aan de regel staan.
maar dat loopt lekker in de soep als je sh restorescript uit voert.

daarbij levert dash nog meer troubels op. Ik ga wel een check aan toe voegen die een fout geeft als dash gebruikt wordt voor now....

>.< >.< >.< >.<


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 16:13

Kees

Serveradmin / BOFH / DoC
Dash.. dat doet dingen inderdaad net even wat anders dan bash, ik probeer die dus zoveel mogelijk te vermijden.

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • CAPSLOCK2000
  • Registratie: Februari 2003
  • Laatst online: 12:22

CAPSLOCK2000

zie teletekst pagina 888

Dash is heel puur en volgt de standaarden strict. Bash neemt het allemaal wat vrijer op en heeft een hoop extra features. Als een zo breed mogelijke compatibiliteit nodig is dan ben je meestal beter af met Dash. Als het op Dash werkt dan werkt het overal.
Als je toch overal bash gebruikt dan heeft dat wel wat voordelen met handige features. Al is dat niet universeel, ik ken situaties waar bash op crasht terwijl dash het juiste doet.

This post is warranted for the full amount you paid me for it.


Acties:
  • 0 Henk 'm!

  • Blokker_1999
  • Registratie: Februari 2003
  • Laatst online: 13:50

Blokker_1999

Full steam ahead

daft_dutch schreef op woensdag 22 juli 2015 @ 17:24:
[...]

Nee ik heb gewoon #!/bin/bash boven aan de regel staan.
maar dat loopt lekker in de soep als je sh restorescript uit voert.

daarbij levert dash nog meer troubels op. Ik ga wel een check aan toe voegen die een fout geeft als dash gebruikt wordt voor now....
Dat loopt in de soep omdat je aangeeft dat het moet uitgevoerd worden met de standaard shell, in dit geval dus dash. Door deze aanroep met sh word de eerste lijn gewoon aanzien als een comment ipv een identificatie van de te gebruiken interpreter.

Wil je dit oplossen op een manier dat het blijft werken voor de verschillende interpreters terwijl je kan blijven aanroepen via sh dan zal je effectief moeten nagaan welke interpreter op dit moment draait met iets als
code:
1
ps h -p $$ -o args='' | cut -f1 -d' '

No keyboard detected. Press F1 to continue.


Acties:
  • 0 Henk 'm!

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 08:15

deadinspace

The what goes where now?

daft_dutch schreef op woensdag 22 juli 2015 @ 16:51:
Nu zet dash echo "foo\040bar" > file
foo bar in de file

en bash echo "foo\040bar" > file
foo\040bar

weet iemand hoe ik dit gelijk kan trekken?
echo is in vrijwel elke shell een builtin. Gebruik de system binary echo en dan is je echo overal hetzelfde (nouja, hopelijk dan... Aan je shell ligt het dan niet meer):
/bin/echo "foo\040bar"
daft_dutch schreef op woensdag 22 juli 2015 @ 17:24:
Nee ik heb gewoon #!/bin/bash boven aan de regel staan.
maar dat loopt lekker in de soep als je sh restorescript uit voert.
Dan moet je ook "bash restorescript" doen.

Wat je nu doet is net zoiets als een Python programma schrijven dat begint met "#!/usr/bin/python" en dat uitvoeren met "ruby programma.py". En dan klagen dat het niet werkt ;)
daarbij levert dash nog meer troubels op. Ik ga wel een check aan toe voegen die een fout geeft als dash gebruikt wordt voor now....
Als je bash-specifieke features gebruikt dan zal dat inderdaad niet werken in dash. Als je je beperkt tot POSIX shell features zou het gewoon moeten werken :)

Acties:
  • 0 Henk 'm!

  • daft_dutch
  • Registratie: December 2003
  • Laatst online: 08-09 21:46

daft_dutch

>.< >.< >.< >.<

Topicstarter
deadinspace schreef op woensdag 22 juli 2015 @ 22:33:
Dan moet je ook "bash restorescript" doen.

Wat je nu doet is net zoiets als een Python programma schrijven dat begint met "#!/usr/bin/python" en dat uitvoeren met "ruby programma.py". En dan klagen dat het niet werkt ;)
is # geen comment bij ruby? bij php maakt het geen donder uit

sh is gelinkt naar dash. maar boven roep ik bash aan. Ik kwam er achter toen ik een stukje code apart wou testen.

Het rare vind ik dat -e of -E bij echo niet werkt. terwijl man echo dat gewoon aan geeft. of heeft dash een interne POSIX methode. confused...

>.< >.< >.< >.<


Acties:
  • 0 Henk 'm!

  • Blokker_1999
  • Registratie: Februari 2003
  • Laatst online: 13:50

Blokker_1999

Full steam ahead

Bekijk even het volgende:

hans@10Forward:~$ which echo
/bin/echo
hans@10Forward:~$ type echo
echo is a shell builtin
hans@10Forward:~$ sh
$ type echo
echo is a shell builtin


Hier zien we, zoals deadinspace al aanhaalde, dat echo bestaat als een programma in /bin, daarnaast hebben zowel bash als dash een ingebouwd echo commando. En die ingebouwde variant krijgt voorrang op /bin/echo.

Dit staat trouwens ook in de man page van echo
NOTE: your shell may have its own version of echo, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports.
Je zou, indien je puur een echo wenst te doen, in je script dus ook `/bin/echo` kunnen aanroepen ipv `echo`

hans@10Forward:~$ echo --version
--version
hans@10Forward:~$ /bin/echo --version
echo (GNU coreutils) 8.23
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Brian Fox and Chet Ramey.


#! is een 2-byte magic number (zie ook `man magic`) waarmee de shell in staat is om het type van bestand te identificeren en met de string erachter te achterhalen met welke command interpreter het programma moet uitgevoerd worden.

hans@10Forward:~# cat dash.sh 
#!/bin/bash
echo "hello"
hans@10Forward:~# file dash.sh 
dash.sh: Bourne-Again shell script, ASCII text executable


Start je evenwel met `sh script` of `bash script` of met welk ander programma dan ook dan voer je aan dat het script geladen moet worden met die interpreter en word de magic number niet meer bekeken en ziet de interpreter die lijn simpelweg als een comment (omdat het met # begint)

[ Voor 18% gewijzigd door Blokker_1999 op 23-07-2015 11:33 ]

No keyboard detected. Press F1 to continue.


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 16:13

Kees

Serveradmin / BOFH / DoC
Dus inderdaad, maak je scriptexecutable met chmod +x en voer het uit als ./restorescript

Of zet iets alla dit bovenin je script:
code:
1
2
3
4
5
6
7
8
if [ -z "$BASH_VERSION" ]
then
 # Dit is dash
 /bin/bash $0 $@
 exit
fi

# Dit is zeker weten bash

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Kees schreef op donderdag 23 juli 2015 @ 13:51:
Dus inderdaad, maak je scriptexecutable met chmod +x en voer het uit als ./restorescript
Dit dus. +1
Of zet iets alla dit bovenin je script:
code:
1
2
3
4
5
6
7
8
if [ -z "$BASH_VERSION" ]
then
 # Dit is dash
 /bin/bash $0 $@
 exit
fi

# Dit is zeker weten bash
Kleine correctie hierop:
code:
1
2
3
4
5
6
7
8
if [ -z "$BASH_VERSION" ]
then
 # Dit is niet bash. Draai dit script in bash met dezelfde parameterlijst. Let op de quotes "".
 exec /bin/bash "$@"
fi

# Dit is bijna zeker weten bash
# tenzij een grapjas de environment variabele BASH_VERSION heeft gezet.

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 16:13

Kees

Serveradmin / BOFH / DoC
Bijna goed, het moet echter "$0" "$@" zijn want de scriptnaam zit niet in $@

man bash:
@ Expands to the positional parameters, starting from one.
En dus niet vanaf 0

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan

Pagina: 1