Sponsored Content
Top Forums Shell Programming and Scripting Bash: How can a script create a script? Post 302604892 by LessNux on Tuesday 6th of March 2012 09:05:06 AM
Old 03-06-2012
Question Bash: How can a script create a script?

I need to write a bash script that will generate another bash script. Furthermore, the child script is required to be hard-coded into the parent script. The parent script is not allowed to import the child script from an external file at run time. If you have a better solution than the following, please let me know.

I tried "cat" in the following manner.

cat > child.sh << EOF
The content of child script
...
...
EOF


However, if the child script contains variables, command substitutions and backtick pipes as shown below, then bash will expand them when the parent script is executed. Thus, the resultant child script will be corrupted and differ from the original child script.

Code:
cat > child.sh << EOF
#...
#...
OriginalDir=$(pwd)  #command substitution
cd $CloudDir        #variable
Array=`ls -1 *.txt` #backtick pipe
cd $OriginalDir     #variable
#...
#...
EOF


So, I have to somehow disable variable expansion, command substitution and backtick pipe. I thought about single quotes to disable expansion.

echo '.......' > child.sh
echo '.......' >> child.sh
echo '.......' >> child.sh

However, if the original child script contains single quotes, they will interfere with the outer single quotes, and hence the resultant child script will corrupt. Single quotes do not work.

In the above cat method, the expansion were interfering with $ and `. Now, my workaround is to temporarily remove $ and ` by applying percent-encoding to $ and `. That is, $ is replaced with %24, and ` is replaced with %60, (after % is replaced with %25 first) before the child script is embedded into the parent script. All the other characters are intact. Thus, the child script is prepared by sed like below.

sed "s/%/%25/g" | sed 's/\$/%24/g' | sed 's/`/%60/g'

At run time, the parent script will decode percents and restore the original version of the child script by piping the output from cat to sed in the following manner.

Code:
cat << EOF | sed 's/%60/`/g' | sed "s/%24/$/g" | sed "s/%25/%/g" > child.sh
#...
#...
OriginalDir=%24(pwd)    #command substitution
cd %24CloudDir          #variable
Array=%60ls -1 *.txt%60 #backtick pipe
cd %24OriginalDir       #variable
#...
#...
EOF


In this last method, the percent-encoding protects the variables, command substitutions and backtick pipes in the child script from expansion. However, the percent-encoding modifies the child script, even though the modification is temporary and the original version will be restored at the end. I prefer not to modify the child script at all.

In bash, how can a parent script generate a child script without the kind of preparation that modifies the child script? Does anyone know how to protect the variables, command substitutions and backtick pipes in the child script from expansion without encoding the child script? Note again that the child script is required to be hard-coded into the parent script. The parent script is not allowed to import the child script from an external file at run time. Any idea?

Many thanks in advance.
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

I need to create a script in bash as follows:

List junk subdirectory in multi-column format Echo/Read : Ask for filename Test for existence of junk/filename True: Test for file size: Size=0: Display "filename exists, but size is zero" Size>0: Display a full listing... (3 Replies)
Discussion started by: POPOPO
3 Replies

2. Shell Programming and Scripting

help with a bash script to create a html table

Hi guys as the title says i need a little help i have partisally written a bash script to create a table in html so if i use ./test 3,3 i get the following output for the third arguement in the script i wish to include content that will be replace the A characters in the... (2 Replies)
Discussion started by: dunryc
2 Replies

3. Shell Programming and Scripting

Create mysql database with bash script - confused

Hi, i have the following: db="create database xxx;GRANT ALL PRIVILEGES ON xxx.* TO user@localhost IDENTIFIED BY 'password';FLUSH PRIVILEGES;quit;" mysql -u root -p$mysql_pass -e "$db" I don't understand why this is failing, it works fine when run from cmd but when is run in a bash script,... (1 Reply)
Discussion started by: ktm
1 Replies

4. Shell Programming and Scripting

bash script to create txt files based on timestamp

Hi , please guide me for a bash script that will create a txt files and the name of the txt files will be as of timestamp so that each file name will be different from other and these files will be get created say after every 10 minutes in a folder(/home/p2000/sxs137), please guide me how would... (1 Reply)
Discussion started by: nks342
1 Replies

5. Programming

Creating a bash script that create/open database

Hi. I have two text files(tables) which include some information and I want to make some query codes using them. First of all, I want to create bash script that read this two tables, create/open database and insert data from files into database. #!/bin/bash while read line; do ... (1 Reply)
Discussion started by: rlaxodus
1 Replies

6. Shell Programming and Scripting

Bash script to create rsa key pair

Hello all, I am setting up a cluster of Mac Pro's which need to be able to talk to a master computer, traffic between the nodes and the master needs to take place without a ssh key. I need a script that will create a security key, save it to the default place, enter the password as no password.... (2 Replies)
Discussion started by: sdl27789
2 Replies

7. Programming

CGI Perl script to execute bash script- unable to create folder

Hi I have a bash script which takes parameters sh /tmp/gdg.sh -b BASE-NAME -n 1 -s /source/data -p /dest/data/archive -m ARC gdg.sh will scan the /source/data and will move the contents to /dest/data/archive after passing through some filters. Its working superb from bash I have... (0 Replies)
Discussion started by: rakeshkumar
0 Replies

8. Homework & Coursework Questions

Create a simple bash backup script of a file

This is the problem: Write a script that will make a backup of a file giving it a ‘.bak’ extension & verify that it works. I have tried a number of different scripts that haven't worked and I haven't seen anything really concise and to the point via google. For brevity's sake this is one of the... (4 Replies)
Discussion started by: demet8
4 Replies

9. Shell Programming and Scripting

Create excel file using bash script

i have written one script which generates text file which gives output like. 001.config: CR1.1 COMPILE_PASSED TEST_PASSED 002.config: CR1.1 COMPILE_FAILED TEST_FAILED . . .so on this text file will get filled one by one as its for loop for n number. i... (7 Replies)
Discussion started by: RamMore123
7 Replies

10. Shell Programming and Scripting

How to create an executable bash script for these commands?

I wish to create an executable bash script that will run the following commands as root, that is, using sudo su iptables-save | awk '/^ / { print $1 } /^:+ / { print $1 " ACCEPT" ; } /COMMIT/ { print $0; }' | iptables-restoreMy first attempt at bash... (9 Replies)
Discussion started by: thixeqi
9 Replies
FORK(2) 						      BSD System Calls Manual							   FORK(2)

NAME
fork -- create a new process LIBRARY
Standard C Library (libc, -lc) SYNOPSIS
#include <unistd.h> pid_t fork(void); DESCRIPTION
fork() causes creation of a new process. The new process (child process) is an exact copy of the calling process (parent process) except for the following: o The child process has a unique process ID. o The child process has a different parent process ID (i.e., the process ID of the parent process). o The child process has its own copy of the parent's descriptors. These descriptors reference the same underlying objects, so that, for instance, file pointers in file objects are shared between the child and the parent, so that an lseek(2) on a descriptor in the child process can affect a subsequent read(2) or write(2) by the parent. This descriptor copying is also used by the shell to establish standard input and output for newly created processes as well as to set up pipes. o The child process' resource utilizations are set to 0; see setrlimit(2). In general, the child process should call _exit(2) rather than exit(3). Otherwise, any stdio buffers that exist both in the parent and child will be flushed twice. Similarly, _exit(2) should be used to prevent atexit(3) routines from being called twice (once in the parent and once in the child). In case of a threaded program, only the thread calling fork() is still running in the child processes. Child processes of a threaded program have additional restrictions, a child must only call functions that are async-signal-safe. Very few functions are asynchronously safe and applications should make sure they call exec(3) as soon as possible. RETURN VALUES
Upon successful completion, fork() returns a value of 0 to the child process and returns the process ID of the child process to the parent process. Otherwise, a value of -1 is returned to the parent process, no child process is created, and the global variable errno is set to indicate the error. ERRORS
fork() will fail and no child process will be created if: [EAGAIN] The system-imposed limit on the total number of processes under execution would be exceeded. This limit is configuration-depen- dent. [EAGAIN] The limit RLIMIT_NPROC on the total number of processes under execution by this user id would be exceeded. [ENOMEM] There is insufficient swap space for the new process. SEE ALSO
execve(2), setrlimit(2), vfork(2), wait(2), pthread_atfork(3) STANDARDS
The fork() function conforms to ISO/IEC 9945-1:1990 (``POSIX.1''). HISTORY
A fork() system call appeared in Version 6 AT&T UNIX. BSD
June 10, 2004 BSD
All times are GMT -4. The time now is 02:00 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy