Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Unix Shell Script

  1. May 24, 2007 #1
    I have never written a shell script, but I am trying to learn. I want to make a generic Unix shell script that will allow me to run four commands in a row... something like this...

    latex $filename
    bibtex $filename
    latex $filename
    latex $filename

    I would like to call the script "ltxprc.sh".

    How would I make this file work for any filename?

    For instance, if my file name were "paper", would I run a command like...

    sh ltxprc.sh

    where do I input the filename?
  2. jcsd
  3. May 24, 2007 #2

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    First, you need to modify your script so it accesses the command line arguments sent to the script:


    You pass the filename on the command line:

    sh ltxprc.sh file.tex

    Even better is to make the shell script executable via chmod. You will need to add a "shebang" line to the very front of your script:


    When you do that, all you need to say is

    ltxprc.sh file.tex
  4. May 25, 2007 #3
    Thanks for the help. That was probably the most useful response I have ever received from a message board.

    I gotta ask... why is it that the #!/bin/sh works? I thought that the # symbol meant "comment out" that which follows.
  5. May 25, 2007 #4

    D H

    User Avatar
    Staff Emeritus
    Science Advisor

    The # symbol is indeed a comment to the shell. The shell, however, is not what runs runs programs (directly, that is). The exec family of functions are what run programs on a Unix machine. The first thing exec does when asked to run a program is read the first two bytes of the program. When those first two bytes are "#!", exec does something quite special: It uses the line to indicate what program should be executed to run the script file. For example, you used #!/bin/sh . The #! tells exec this is an executable script. The exec invokes /bin/sh to run the script. Now /bin/sh reads lines from the script. Now we get back to your question: the first line is just a comment; /bin/sh does nothing with it.

    For more info, see http://homepages.cwi.nl/~aeb/std/hashexclam.html" [Broken].
    Last edited by a moderator: May 2, 2017
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook