bash scripting

Här pratar vi programmering i dessa olika former. Perl, C/C++, Pascal, ADA, Lisp, COBOL, ZX Basic och mm.
Post Reply
3Gubben
Posts: 91
Joined: 22 December 2003, 12:01

bash scripting

Post by 3Gubben » 23 May 2007, 09:47

Skulle vilja veta om och i så fall hur man kan förhindra utskrift från kommando på standard output. I ett bash-skript vill jag ha följande test:

Code: Select all

#!/bin/bash
CMD=`command`
if $CMD
then
        echo $CMD
fi
T.ex. kan man tänka sig att command = uname -o
vilket är ok i ubuntu, men ger ett felmeddelande i openSUSE (uname: invalid option -- o)
Vill förhindra meddelande på skärmen från kommandot och i stället låta mitt skript ta över beroende på hur kommandot exekverades (exit = 0 om ok, annars != 0)

Har försökt med

Code: Select all

if test -e $CMD > /dev/NULL
men det funkar inte.
Är det möjligt att göra så här, och i så fall, hur formulerar man då if-satsen?

miixter
Posts: 924
Joined: 29 July 2003, 21:37

Post by miixter » 23 May 2007, 11:21

testa "2>&1 | /dev/null"

http://tldp.org/LDP/abs/html/io-redirection.html

/mixter
Key power of Linux - freedom to choose.

3Gubben
Posts: 91
Joined: 22 December 2003, 12:01

Post by 3Gubben » 23 May 2007, 12:02

hur menar du?

if test -e $CMD 2>&1 | /dev/NULL

funkar inte...

miixter
Posts: 924
Joined: 29 July 2003, 21:37

Post by miixter » 23 May 2007, 12:16

Mja borde väl snarare bli :

Code: Select all

$sh ./ditt_script.sh 2>&1 | /dev/null
men du kanske inte ville skicka all output från hela skriptet till /dev/null ?

/mixter
Key power of Linux - freedom to choose.

3Gubben
Posts: 91
Joined: 22 December 2003, 12:01

Post by 3Gubben » 23 May 2007, 12:29

Nej, scriptet går igenom olika unix-kommandon uname, netstat, fdisk, uptime osv för att samla ihop info och presentera online. Problemet är att syntaxen är olika
för olika distros, och jag vill göra ett generellt script. Jag vill inte se:

uname: invalid option -- o
Try `uname --help' for more information.

på skärmen utan skriptet ska ta hand om detta och ev. presentera sitt eget felmeddelande.

Bättre vore kanske att göra detta i Perl. Fast det borde ju gå i bash.

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Post by erik_persson » 23 May 2007, 19:37

Felet kommer inte från test-raden utan från
CMD=`kommando`

CMD får enbart stdout medan stderr skickas till konsollen.
För att få bort detta så måste du skicka bort
stderr.
Beroende på vad du är ute efter kan du få med det i variabeln eller inte.
Med
CMD=`kommandot 2>&1`
så kommer felmeddelandet med i CMD
med
CMD=`kommando 2>/dev/null`
så kastar du felmeddelandet, men tar med eventuell information från kommandot.

/ep
Last edited by erik_persson on 27 May 2007, 23:42, edited 1 time in total.

3Gubben
Posts: 91
Joined: 22 December 2003, 12:01

Post by 3Gubben » 24 May 2007, 15:46

OK, följande:

Code: Select all

CMD=`command 2>/dev/null`     <-- OBS. backticks
if ! test -e $CMD
then
        echo $CMD
fi
är precis vad jag var ute efter. Om command är en giltig syntax, sker utskrift på konsolen.
Om syntaxen är ogiltig sker ingen utskrift, eftersom jag "redirectar" stderr till /dev/null.

Tack för tipsen.

ErikW
Posts: 82
Joined: 13 June 2003, 21:38

Post by ErikW » 26 May 2007, 09:49

Jag har för mig att vissa program normalt rapporterar till stderr istället för stdout, alltså även i normala fall. I såna fall går det ju inte bra att göra "2 > /dev/null". Jag kanske har fel? Om inte kan man ju alltid skriva det på varje kommando inuti skriptet.

Det skulle kanske gå att göra olika skript för olika distros/versioner av program?

Post Reply