#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Feb 2006
    Posts
    19
    Rep Power
    0

    What does EOF do?


    Hi

    I saw this script and I'm not sure why or how it works:

    cat >> test << STOP
    line 1
    line 2
    line 3
    STOP

    or equally

    cat >> test << EOF
    line 1
    line 2
    line 3
    EOF

    Is this an OS issue or a bash issue?

    Can anyone help explain this to me.

    Thanks
    Dan
  2. #2
  3. Banned ;)
    Devshed Supreme Being (6500+ posts)

    Join Date
    Nov 2001
    Location
    Woodland Hills, Los Angeles County, California, USA
    Posts
    9,594
    Rep Power
    4207
    That is known as a "Here Tag". Basically it tells the shell that you are going to enter a multi-line string until "Here". You could call it anything you want, not just EOF or STOP.
    Code:
    [mb@ironmaiden mb]$ cat > test <<HERE
    > Hello
    > world
    > HERE
    The <<HERE part tells the shell that you're going to enter multi-lines until the HERE tag. Thus the shell waits until it sees HERE to consider the rest of the stuff above it as input for cat.

    Some rules about the Here tags:
    1. The tag can be any string, uppercase or lowercase, though most people use uppercase by convention.
    2. The tag will not be considered as a Here tag if there are other words in that line. In this case, it will merely be considered part of the string. The tag should be by itself on a separate line, to be considered a tag.
    3. The tag should have no leading or trailing spaces in that line to be considered a tag. Otherwise it will be considered as part of the string.
    Here's another chunk to consider:
    Code:
    [mb@ironmaiden mb]$ cat >> test <<HERE
    > Hello world HERE <--- Not the end of string
    > This is a test
    >  HERE <-- Leading space, so not end of string
    > and a new line
    > HERE <-- Now we have the end of the string
    Note that in the above, we have the word HERE showing up 3 times. The first two times, it occurs with other words or leading spaces and hence it is considered as part of the string.

    Many scripting languages (perl, PHP, awk, ruby etc.) support the concept of the "Here tag", so it isn't unique to bash alone.

    Comments on this post

    • Annie79 agrees : Best explanation I read on this so far. :)
    • B-Con agrees : Tripped across this in a Google search. Good explanation.
    • kk5st agrees : Likewise, what B-Con said (9/19/11)
    Up the Irons
    What Would Jimi Do? Smash amps. Burn guitar. Take the groupies home.
    "Death Before Dishonour, my Friends!!" - Bruce D ickinson, Iron Maiden Aug 20, 2005 @ OzzFest
    Down with Sharon Osbourne

    "I wouldn't hire a butcher to fix my car. I also wouldn't hire a marketing firm to build my website." - Nilpo
  4. #3
  5. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Feb 2006
    Posts
    19
    Rep Power
    0

    what does EOF do?


    Hey thanks for that. Much appreciated.

    All of it makes sense. Although why does the following work?

    cat <<EOF>> filename

    how is that order isn't important, I mean I could have :

    cat >> filename <<EOF

    and this would still work, how does bash know where to start from?

    Thanks for your help with this.
    Dan
  6. #4
  7. Banned ;)
    Devshed Supreme Being (6500+ posts)

    Join Date
    Nov 2001
    Location
    Woodland Hills, Los Angeles County, California, USA
    Posts
    9,594
    Rep Power
    4207
    That's because when you enter the command, bash parses the first line and sees that it needs to run cat and redirect the output to a file called filename. It also sees that the input is going to come from STDIN (i.e. the terminal) and that it should read input until it sees your "here" tag. The bash parser can accept input/output redirection operators in any order really.
    Up the Irons
    What Would Jimi Do? Smash amps. Burn guitar. Take the groupies home.
    "Death Before Dishonour, my Friends!!" - Bruce D ickinson, Iron Maiden Aug 20, 2005 @ OzzFest
    Down with Sharon Osbourne

    "I wouldn't hire a butcher to fix my car. I also wouldn't hire a marketing firm to build my website." - Nilpo
  8. #5
  9. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Mar 2009
    Posts
    1
    Rep Power
    0
    Originally Posted by Scorpions4ever
    Many scripting languages (perl, PHP, awk, ruby etc.) support the concept of the "Here tag", so it isn't unique to bash alone.
    Hi Scorpions4ever

    Could you please provide an example, how HERE tag can be used in awk? I've tried
    {
    print <<EOF
    Hi there!
    EOF
    }
    But it seems not to work. TIA
  10. #6
  11. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Nov 2011
    Posts
    1
    Rep Power
    0

    Using HERE tags with awk


    Hi,
    You can use HERE tags with awk like the example below...

    bash Code:
    ls -li > temp
    awk -f - temp <<'HERE' 
            {
                    print $1;
            }
    HERE

IMN logo majestic logo threadwatch logo seochat tools logo