Rewriting The #! Line

If you need to move your scripts to another system which has Expect installed in a different place, you may need to rewrite the first line of many scripts. For instance, the Expect installation does this when installing the sample scripts that accompany it. The installation accomplishes this by running a script called fixline1 on each Expect script. Here is fixline1:

#!/usr/local/bin/expect —
regsub "^#!(.*/)*(.*)" [gets stdin] "#!$argv/\\2" line1
puts -nonewline "$line1\n[read stdin]"

The script works by reading the first line and looking for #! followed by a slash. This is replaced with the new path and then the remainder of the file is rewritten as well. This rewrites scripts that have first lines such as the following:

#!expect
#!expect —
#!../expectk —
#!/usr/local/bin/expectk anyoldargs

The script is called (usually from a Makefile) as follows:

expect fixline1 newpath < oldscript > newscript

where oldscript is the original script and newscript is the new version with the path set to newpath. This script can be used to rewrite any file that uses the #! in the first line. Of course, the literal "expect" is needed only before fixline1 has rewritten its own first line.

Get Exploring Expect now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.