Source Output | Unix Linux Forums | UNIX for Advanced & Expert Users

  Go Back    


UNIX for Advanced & Expert Users Expert-to-Expert. Learn advanced UNIX, UNIX commands, Linux, Operating Systems, System Administration, Programming, Shell, Shell Scripts, Solaris, Linux, HP-UX, AIX, OS X, BSD.

Source Output

UNIX for Advanced & Expert Users


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 10-10-2012
ticiotix ticiotix is offline
Registered User
 
Join Date: Oct 2012
Last Activity: 10 October 2012, 10:21 AM EDT
Posts: 2
Thanks: 0
Thanked 0 Times in 0 Posts
Source Output

Hi all.
I am trying to include the output of a command in a shell script (sh shell) but with no success.
Scenario is this: I have some XML and binary configuration files and I have an executable who writes a file with some shell variables I usually include in my shell script (executable "translates" configurations in shell variables).
At the beginning of scripts I put:


Code:
myexe > /tmp/config
. /tmp/config

(
/tmp/config containing something like:

Code:
IP="192.168.10.2"
SWITCH1="ON"
SWITCH2="OFF"

)

It will be good to use something like:


Code:
. $(myexe)

including directly the output of myexe executable instead of including an external file.

Do you know a way to accomplish this.
Thank you very much in advance.
TT:

Moderator's Comments:
edit by bakunin: please view this code tag video for how to use code tags when posting code and data.

Last edited by bakunin; 10-10-2012 at 10:52 AM..
Sponsored Links
    #2  
Old 10-10-2012
bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
 
Join Date: May 2005
Last Activity: 22 November 2014, 7:38 PM EST
Location: In the leftmost byte of /dev/kmem
Posts: 4,337
Thanks: 45
Thanked 839 Times in 662 Posts
Quote:
Originally Posted by ticiotix View Post

Code:
myexe > /tmp/config
. /tmp/config

Seems like this is the only way if you want to extract an environment which should be added to the environment of the currently running script. A command like


Code:
$(myexe)

will execute "myexe" in a subshell. (This is what "$(...)" means: execute what is inside the braces in a subshell.) If you change the environment in this subshell the changes will be lost once you exit it.

The only thing i suggest is to "chmod" the file "/tmp/config" before you run it. It has no execute rights from the start and even if this works it is counter-intuitive.

I hope this helps.

bakunin
Sponsored Links
    #3  
Old 10-10-2012
ticiotix ticiotix is offline
Registered User
 
Join Date: Oct 2012
Last Activity: 10 October 2012, 10:21 AM EDT
Posts: 2
Thanks: 0
Thanked 0 Times in 0 Posts
Thanks Bakunin!!!
I realize now I hid the real problem...
My question originated because when I execute:


Code:
myexe > /tmp/config
. /tmp/config

in concurrent scripts, sometimes, the second line is executed when someone other is writing /tmp/config, ending in an error.
Perhaps the simpler idea is to change script in :


Code:
myfile=$(mktemp)
myexe > $myfile
.  $myfile
rm  $myfile

or something using "flock"...
Thank you very much.
TT:

Moderator's Comments:
edit by bakunin: i would really appreciate you using CODE-tags instead of Italics. Thank you for your consideration.

Last edited by bakunin; 10-10-2012 at 11:50 AM..
    #4  
Old 10-10-2012
bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
 
Join Date: May 2005
Last Activity: 22 November 2014, 7:38 PM EST
Location: In the leftmost byte of /dev/kmem
Posts: 4,337
Thanks: 45
Thanked 839 Times in 662 Posts
First off, if you write to temporary files you should always prepare a place for these first and clean this place upon exit. Usually you can use the PID variable to make the places name unique, because the PID is always unique. I do it usually the following way (sketch only):


Code:
#! /bin/ksh

trap 'rm -rf "$TMPDIR" 1>/dev/null 2>/dev/null' 0

PROGNAME="$(basename $0)"
TMPDIR="/tmp/${PROGNAME}_$$"

fTmp1="${TMPDIR}/somefile"
fTmp2="${TMPDIR}/otherfile"

mkdir "$TMPDIR" || {
     print -u2 "ERROR: cannot create $TMPDIR, exiting."
     exit 2
}

... code ...

cmd > "$fTmp1"

while read line ; do
     ....
done < "$fTmp2"

.... code ....

exit 0

This way each instance of a script gets its own temp dir, puts everything it uses in there and upon exit (regardless which exit, even when terminated from outisde) it cleans up. The only way to have the temp files not cleaned is to terminate it with a "kill -9".

I hope this helps.

bakunin
Sponsored Links
    #5  
Old 10-11-2012
Don Cragun's Avatar
Don Cragun Don Cragun is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 22 November 2014, 4:49 PM EST
Location: San Jose, CA, USA
Posts: 5,082
Thanks: 195
Thanked 1,701 Times in 1,444 Posts
Quote:
Originally Posted by bakunin View Post
First off, if you write to temporary files you should always prepare a place for these first and clean this place upon exit. Usually you can use the PID variable to make the places name unique, because the PID is always unique. I do it usually the following way (sketch only):


Code:
#! /bin/ksh

trap 'rm -rf "$TMPDIR" 1>/dev/null 2>/dev/null' 0

 ... ... ...

exit 0

This way each instance of a script gets its own temp dir, puts everything it uses in there and upon exit (regardless which exit, even when terminated from outisde) it cleans up. The only way to have the temp files not cleaned is to terminate it with a "kill -9".

I hope this helps.

bakunin
This is a great example of defensive programming, but the commands in trap 'commands' 0 will only be executed on a normal exit of the program. If the program is terminated by any signal (such as SIGINT or SIGQUIT which can easily be generated from the keyboard while a script is running interactively), the commands in this trap will not be executed.

If you wanted to perform the cleanup on exit and on termination by the signals SIGHUP, SIGINT, SIGQUIT, and SIGTERM you could use:

Code:
trap 'rm -rf "$TMPDIR" 1>/dev/null 2>/dev/null' EXIT HUP INT QUIT TERM

on systems that support the latest POSIX standard requirements. On UNIX branded systems, this would be equivalent to:

Code:
trap 'rm -rf "$TMPDIR" 1>/dev/null 2>/dev/null' 0 1 2 3 15

If you aren't using a UNIX branded implementation, the signal numbers listed above might not work on your system. The signal numbers used on your system should appear a file like /usr/include/signal.h or in some file it #include s. (There may be variant directories on your system corresponding to different versions of the standards and other ABI or API specifications your system supports.)
Sponsored Links
    #6  
Old 10-11-2012
bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
 
Join Date: May 2005
Last Activity: 22 November 2014, 7:38 PM EST
Location: In the leftmost byte of /dev/kmem
Posts: 4,337
Thanks: 45
Thanked 839 Times in 662 Posts
Quote:
Originally Posted by Don Cragun View Post
If you wanted to perform the cleanup on exit and on termination by the signals SIGHUP, SIGINT, SIGQUIT, and SIGTERM you could use:

Code:
trap 'rm -rf "$TMPDIR" 1>/dev/null 2>/dev/null' 0 1 2 3 15

If you aren't using a UNIX branded implementation, the signal numbers listed above might not work on your system.
Understood, but as i sense that i am in for yet another piece of knowledge i missed until now, excuse the request for clarification:

I more or less (my real scripts are a bit more elaborated than the sketch shown here) followed the recommendations laid down here as my understanding was that "trap 0" in ksh is not a real signal but always executed at scripts end, regardless of how this ending came to pass - by signal, by simply end of program flow or by user interaction (pressing CTRL-C or something such).

Could you please clarify?

bakunin
The Following User Says Thank You to bakunin For This Useful Post:
Don Cragun (10-11-2012)
Sponsored Links
    #7  
Old 10-11-2012
Don Cragun's Avatar
Don Cragun Don Cragun is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 22 November 2014, 4:49 PM EST
Location: San Jose, CA, USA
Posts: 5,082
Thanks: 195
Thanked 1,701 Times in 1,444 Posts
The standards require that a trap action 0 (or trap action EXIT execute the specified action on exit, but never defines the term "exit" in this context. I had always interpreted "on exit" to mean when a shell script calls the exit special built-in utility or "falls off the end of the script"(which exits with the exit code provided by the last simple command executed by the script). But, at least bash and ksh behave as you expect.

Obviously, the commands specified by the action in a trap action EXIT command won't be executed if the shell is terminated by a SIGKILL signal since the shell can't catch a SIGKILL to invoke the actions specified by appropriate traps. If the standard is interpreted as you expect, then no system conforms to the standard because the standard doesn't allow an exception for being terminated by SIGKILL.

Thanks for pointing this out to me. I'll file a bug report against the POSIX standards and the Single UNIX Specification to try to get the next version of the standards to match existing practice in this area.

- Don
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Redirect output to a different text file depending source of data spartan22 Shell Programming and Scripting 4 07-17-2012 11:10 AM
Read rows from source file and concatenate output carlos_anubis UNIX for Dummies Questions & Answers 0 07-22-2010 10:44 AM
write page source to standard output wxornot Shell Programming and Scripting 1 07-18-2008 05:46 PM
how to make a line BLINKING in output and also how to increase font size in output mail2sant Shell Programming and Scripting 3 04-14-2008 08:30 AM



All times are GMT -4. The time now is 05:45 AM.